java as2_JAVA與AS2制作一個2D多人游戲(3)

要進行信息交互,首先要建立一對互相連接的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;

}

這里就完成了登錄功能的開發,是不是挺簡單的?

下一期將介紹游戲大廳中的一些信息交互

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值