要进行信息交互,首先要建立一对互相连接的Socket

客户端代码如下


public function Client()
	{
		Socket = new XMLSocket();
		Socket.connect(IP, port);
		Socket.onClose = ServerClose;
		Socket.onConnect = ConnectSuccess;
		Socket.onData = ReceiveData;
		}

服务器端侦听连接请求的ServerSocket类


public void run()
	{
		while(true&&!ss.isClosed())
		{
			try {
				Socket socket=ss.accept();
				HashMap hm=new HashMap();
				hm.put("Socket", socket);
				hm.put("Name", "未登录");
				hm.put("Live",3);
				ClientThread cThread=  new ClientThread(hm);
				hm.put("Thread",cThread);
				cThread.start();
				Main.SocketList.add(hm);
				 PrintStream ps=new PrintStream(socket.getOutputStream());
				   ps.println
				   ("<cross-domain-policy>"  
			       +"<allow-access-from domain='*' to-ports='34567'/>"   
			    +"</cross-domain-policy>"+"\0"
						   );
				   ps.println(Main.ConnectSuccess_Key+"\0");
				
			
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
		}
		
	}

上面有一段看起来有些不明所以的XML格式代码,这是因为Flash要访问网络资源时,需要服务器返回这样一段信息,否则就不能建立通信

这个意思是所有来源的IP都可以连接该服务器

allow-access-from domain='*'
这里是可以连接的端口



to-ports='34567'





建立起Socket连接后,就可以进行信息的发送了

我们现在来制作注册功能,先讲一下思路。

客户端先对账号密码框中的输入进行简单验证,这边为了简单起见,只要长度大于0即可。

接下来客户端打包字符串消息发送给服务器的ClientThread类,服务器进行拆解。

ClientThread类将拆解后的信息转发给DBEngine类,该类进行数据库查询,如果该账号已经存在,返回注册失败,如果成功返回注册成功,同时初始化该账号信息,服务器再将该消息返回客户端,客户端负责显示结果的GUI再显示出结果。

代码如下

客户端验证输入后发送


public function Register(Account:String,Password:String)
	{
		if (Account != null && Password != null&&Connected==true)
		{
              Socket.send(Client.Register_Key + Account.length + Password.length + Account + Password+"\n");
			 _root.LoginInfo.text = "正在注册中...";
			}
	
		
		}

服务器ClientThread类


//注册
					if(line.startsWith(Main.Register_Key))
					{
					    String[] lines=Main.decodeString(2,line);
					    String Account=lines[0];
					    String Password=lines[1];
					    boolean ok=DBEngine.Register(Account,Password);
					    
					    if(ok==true)
					    {
					    	//注册成功
					    	printStream.println(Main.Register_Key+1+"\0");
					    }
					    else
					    {
					    	//失败
					    	printStream.println(Main.Register_Key+0+"\0");
					    }
					}



DBEngine类


public static boolean Register(String account, String password) {
		boolean a = false;
		try {
			Class.forName("com.hxtt.sql.access.AccessDriver");
			Connection c=DriverManager.getConnection(url);
			Statement s=c.createStatement();
			
			ResultSet rs=s.executeQuery("Select * From 玩家账号密码表 Where 账号='"+account+"'");
			a=rs.next();
			if(a==true)
			{
				//账号重复
			}
			else
			{
				//创建新账号
				s.executeUpdate("Insert into 玩家账号密码表 Values('"+account+"','"+password+"')");
				s.executeUpdate("Insert into 玩家数据表 Values('"+account+"','"+"无..."+"','"+"武器1,"+"','"+""+"','"+"测试系统留言,"+"','"+"0胜0败"+"','"+0+"')");
				
			}
			
			
			rs.close();
			s.close();
			c.close();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

至此我们就完成了注册功能的开发


登录功能也类似,过程如下


客户端先对账号密码框中的输入进行简单验证

接下来客户端打包字符串消息发送给服务器的ClientThread类,服务器进行拆解。

ClientThread类将拆解后的信息转发给DBEngine类,该类进行数据库查询,如果账号密码正确,则登录成功,如果没有该账号或者账号对了密码不对,返回登录失败

代码如下

客户端


public function Login(Account:String,Password:String)
	{
		if (Account != null && Password != null&&Connected==true)
		{
			//Key|账号长度|密码长度|账号|密码
              Socket.send(Client.Login_Key + Account.length + Password.length + Account + Password+"\n");
			 _root.LoginInfo.text = "正在登录中...";
			}
		}

服务器ClientThread类


//登录
					if(line.startsWith(Main.Login_Key))
					{
						String[] lines=Main.decodeString(2,line);
					    String Account=lines[0];
					    String Password=lines[1];
					    String data=DBEngine.Login(Account,Password);
					    
					    if(data!=null)
					    {
                                                //这里把客户端的一些信息保存在该线程对应的HashMap中
                                               this.hm.put("Name", Account);
					    	this.hm.put("Pos", "Hall");
					    	printStream.println(Main.Login_Key+1+"\0");
					    	printStream.println(data+"\0");
					    	Main.SocketList.forEach(a-> {PrintStream ps=(PrintStream)a.get("ps");
					    	if(ps!=null){
                                            //这里转发进入大厅消息给所有人,用于在大厅   
                                           ps.println(Main.EnterHall_Key+Account.length()+Account+"\0");}
					    });
		
					    }
					    else
					    {

					    	printStream.println(Main.Login_Key+0+"\0");
					    }
					 
					}

DBEngine类

<pre name="code" class="plain">public static String Login(String account, String password) {
		String line =null;
		try {
			Class.forName("com.hxtt.sql.access.AccessDriver");
			Connection c=DriverManager.getConnection(url);
			Statement s=c.createStatement();
			
			ResultSet rs=s.executeQuery("Select * From 玩家账号密码表 Where 账号='"+account+"'and 密码='"+password+"'");
			boolean a=rs.next();
			if(a==true)
			{
				ResultSet rs2=s.executeQuery("Select * From 玩家数据表 Where 账号='"+account+"'");
				rs2.next();
				String Account=rs2.getString("账号");
				String GRSM=rs2.getString("个人说明");
				String WPCK=rs2.getString("物品仓库");
				String HYLB=rs2.getString("好友列表");
				String LXLY=rs2.getString("离线留言");
				String ZJ=rs2.getString("战绩");
				String JB=rs2.getString("金币");
				
				//更新人物数据到客户端
				line=Main.Data_Key+Account.length()+GRSM.length()+WPCK.length()+HYLB.length()+LXLY.length()+ZJ.length()+JB.length()
				+Account+GRSM+WPCK+HYLB+LXLY+ZJ+JB;
				rs2.close();
				
			}
			
			
			
			rs.close();
			s.close();
			c.close();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
		
		return line;
	}




这里就完成了登录功能的开发,是不是挺简单的?