要進行信息交互,首先要建立一對互相連接的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
(""
+""
+""+"\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類
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;
}
這里就完成了登錄功能的開發,是不是挺簡單的?
下一期將介紹游戲大廳中的一些信息交互