要进行信息交互,首先要建立一对互相连接的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;
}
这里就完成了登录功能的开发,是不是挺简单的?