Android使用WebSocket實(shí)現(xiàn)多人游戲
WebSocket 是 HTML5 一種新的協(xié)議。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工通信,能更好的節(jié)省服務(wù)器資源和帶寬并達(dá)到實(shí)時(shí)通訊,它建立在 TCP 之上,同 HTTP 一樣通過(guò) TCP 來(lái)傳輸數(shù)據(jù),但是它和 HTTP 最大不同是:
WebSocket 是一種雙向通信協(xié)議,在建立連接后,WebSocket 服務(wù)器和 Browser/Client Agent 都能主動(dòng)的向?qū)Ψ桨l(fā)送或接收數(shù)據(jù),就像 Socket 一樣;
WebSocket 需要類(lèi)似 TCP 的客戶(hù)端和服務(wù)器端通過(guò)握手連接,連接成功后才能相互通信。
如果想深入了解websocket機(jī)制和原理:http://www.ibm.com/developerworks/cn/java/j-lo-WebSocket/
前言
前段時(shí)間,項(xiàng)目中用到了webSocket,特此來(lái)記錄一下接入方法。
webSocket使用場(chǎng)景:社交聊天、彈幕、多玩家游戲、協(xié)同編輯、體育實(shí)況更新、基于位置的應(yīng)用、在線教育、智能家居等需要高實(shí)時(shí)的場(chǎng)景。(結(jié)合到我們公司的業(yè)務(wù),每到大型節(jié)日的時(shí)候,比如春節(jié)啊,可以搞個(gè)彈幕祭拜啥的)
webSocket流程
1、客戶(hù)端開(kāi)始連接------->服務(wù)端收到連接(保存客戶(hù)端ip)--------->服務(wù)端向客戶(hù)端發(fā)送連接成功消息
2、客戶(hù)端發(fā)送消息(內(nèi)容和服務(wù)端定義好,一般是json格式)----------服務(wù)端收到消息,根據(jù)想要的邏輯,決定是否推送給所有連接上的客戶(hù)端
3、客戶(hù)端收到推送消息,更新UI界面
Android接入
Android接入的話,直接用庫(kù)吧,簡(jiǎn)單方便,我接入的是這個(gè)庫(kù):
compile 'com.koushikdutta.async:androidasync:2.+'
他的調(diào)用也很方便
AsyncHttpClient.getDefaultInstance().websocket("ws://test.ling.com:9588/", "9588", new AsyncHttpClient.WebSocketConnectCallback() {
@Override
public void onCompleted(Exception e, WebSocket webSocket) {
if (e != null) {
e.printStackTrace();
return;
}
//接收到消息的監(jiān)聽(tīng)
webSocket.setStringCallback(new WebSocket.StringCallback() {
@Override
public void onStringAvailable(String s) {
runOnUiThread(new Runnable() {
@Override
public void run() {
//更新ui界面
}
});
}
});
//關(guān)閉鏈接的監(jiān)聽(tīng)
webSocket.setClosedCallback(new CompletedCallback() {
@Override
public void onCompleted(Exception e) {
}
});
//發(fā)送內(nèi)容到服務(wù)端
webSocket.send("測(cè)試測(cè)試");
}
});
是吧,很簡(jiǎn)單,就幾個(gè)方法。下面開(kāi)始說(shuō)說(shuō),如何用websocket來(lái)搞多人游戲的思路,不過(guò),我還沒(méi)去試過(guò)啊,只是理論上的一種思路,應(yīng)該可行,哈哈。
websocket開(kāi)發(fā)多人游戲
簡(jiǎn)單點(diǎn),我們搞一個(gè)像王者農(nóng)藥一樣的,就是10個(gè)人在畫(huà)面上,左5個(gè),右5個(gè),這就意味著有10個(gè)客戶(hù)端啦,當(dāng)客戶(hù)端點(diǎn)擊移動(dòng)按鈕,對(duì)應(yīng)的人物在畫(huà)面上就相應(yīng)移動(dòng)一點(diǎn),當(dāng)然,是10個(gè)客戶(hù)端同時(shí)變化,你移動(dòng)了,其他人也會(huì)看到你移動(dòng)。那些打斗啊什么鬼的,我們先不管,我們先做好移動(dòng),其他的思路應(yīng)該差不多。開(kāi)始:
1、客戶(hù)端開(kāi)始連接服務(wù)端:發(fā)送姓名,服務(wù)端記錄好這些信息。
webSocket.send("{"code":1,"name":"A用戶(hù)"}");
webSocket.send("{"code":1,"name":"B用戶(hù)"}");
·······
webSocket.send("{"code":1,"name":"J用戶(hù)"}");
2、服務(wù)端邏輯處理,當(dāng)有10個(gè)人鏈接成功后,證明比賽要開(kāi)始了,初始化10個(gè)玩家的位置,推送消息給所有玩家:

服務(wù)端推送的消息
正常來(lái)說(shuō),客戶(hù)端在這個(gè)方法接收到上面的推送消息:
//接收到消息的監(jiān)聽(tīng)
webSocket.setStringCallback(new WebSocket.StringCallback() {
@Override
public void onStringAvailable(String s) {
runOnUiThread(new Runnable() {
@Override
public void run() {
//更新ui界面,把10個(gè)玩家的信息和位置顯示在界面上
}
});
}
});
3、吶,現(xiàn)在10個(gè)玩家的位置都初始化了。然后,玩家開(kāi)始移動(dòng),比如說(shuō)A用戶(hù)移動(dòng)到100.100的位置,那客戶(hù)端就發(fā)送:
webSocket.send("{"code":0,"name":"A用戶(hù)","x":100,"y":100}");
4、服務(wù)端收到客戶(hù)端發(fā)送的命令后,就根據(jù)內(nèi)容更新列表啦,這時(shí),A用戶(hù)的位置就是改為100.100了。然后推送新的游戲信息給所有的客戶(hù)端,客戶(hù)端收到命令后,同樣是更新界面,這時(shí)A用戶(hù)的位置就改變啦。

更新界面信息
這樣就大概完成整個(gè)流程啦。當(dāng)然,這只是位置更改的邏輯,如果要搞出技能啊,攻擊啊,血條啊啥的,就要加一堆判斷啦,但思路是不變的,都是客戶(hù)端先發(fā)要更新的資料到服務(wù)端,然后服務(wù)端整理群發(fā)新的比賽信息到客戶(hù)端,客戶(hù)端收到后更新界面就ok。
附加問(wèn)題
上面的是服務(wù)端群發(fā)到客戶(hù)端,如果是要單發(fā)到指定的客戶(hù)端,咋辦呢?不用慌,客戶(hù)端和服務(wù)端鏈接的時(shí)候,會(huì)有一個(gè)唯一的ip,然后保存下來(lái),和用戶(hù)名綁定在一起,到時(shí)就可以單推啦。
總結(jié)
以上所述是小編給大家介紹的Android使用WebSocket實(shí)現(xiàn)多人游戲,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
C#中利用正則表達(dá)式將人民幣金額轉(zhuǎn)換為大寫(xiě)漢字
這篇文章主要介紹了C#中利用正則表達(dá)式將人民幣金額轉(zhuǎn)換為大寫(xiě)漢字的方法,需要的朋友可以參考下2016-02-02
Android實(shí)現(xiàn)上下菜單雙向滑動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)上下菜單雙向滑動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
Android使用Volley框架定制PostUploadRequest上傳文件
這篇文章主要為大家詳細(xì)介紹了Android使用Volley框架定制PostUploadRequest上傳文件或圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
簡(jiǎn)單說(shuō)說(shuō)Android中如何使用攝像頭和相冊(cè)
本篇文章主要介紹了簡(jiǎn)單說(shuō)說(shuō)Android中如何使用攝像頭和相冊(cè),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
Android列表實(shí)現(xiàn)(3)_自定義列表適配器思路及實(shí)現(xiàn)代碼
Android 自定義列表適配器會(huì)提供很多的便利;下面的例子為使用自定義的列表適配器來(lái)顯示列表,感興趣的朋友可以研究下2012-12-12
Android快速開(kāi)發(fā)之定制BaseTemplate
這篇文章主要為大家詳細(xì)介紹了Android快速開(kāi)發(fā)之定制BaseTemplate的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
詳解Android App中使用VideoView來(lái)實(shí)現(xiàn)視頻播放的方法
這篇文章主要介紹了Android App中使用VideoView來(lái)實(shí)現(xiàn)視頻播放的方法,舉例講解了VideoView組件中setVidePath(String path)和setVideoURI(Uri uri)的用法,需要的朋友可以參考下2016-04-04
android虛擬鍵盤(pán)彈出遮擋登陸按鈕問(wèn)題的解決方法
這篇文章主要介紹了android虛擬鍵盤(pán)彈出遮擋登陸按鈕問(wèn)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
Android中RecyclerView實(shí)現(xiàn)Item添加和刪除的代碼示例
本篇文章主要介紹了Android中RecyclerView實(shí)現(xiàn)Item添加和刪除的代碼示例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-09-09

