WebSocket是什么?
?引用大佬的文章來(lái)回答一下:
總結(jié):在現(xiàn)有的網(wǎng)絡(luò)環(huán)境中,大量使用HTTP協(xié)議,HTTP協(xié)議是一種單向的一次性協(xié)議,它限制每次連接只處理一個(gè)請(qǐng)求矿咕,當(dāng)服務(wù)器返回本次請(qǐng)求的應(yīng)答后便立即關(guān)閉連接冬三,下次請(qǐng)求再重新建立連接死讹。在互聯(lián)網(wǎng)發(fā)展之初,HTTP協(xié)議被設(shè)計(jì)成這樣是有原因的:這種一次性連接主要考慮到WWW服務(wù)器面向的是Internet中成干上萬(wàn)個(gè)用戶,且只能提供有限個(gè)連接重抖,故服務(wù)器不會(huì)讓一個(gè)連接處于等待狀態(tài),及時(shí)地釋放連接可以大大提高服務(wù)器的執(zhí)行效率。但是隨著互聯(lián)網(wǎng)的高速發(fā)展,HTTP以及不能滿足我們的使用需求,如果想要在web端實(shí)現(xiàn)實(shí)時(shí)通信,只能通過(guò)不斷發(fā)送get請(qǐng)求(即使沒(méi)有消息也要一直發(fā)送請(qǐng)求),這可以理解成觀察者模式,這樣一來(lái)由于單次http請(qǐng)求的header比較長(zhǎng),既消耗了帶寬,又消耗了服務(wù)器CPU.為了在web上實(shí)現(xiàn)實(shí)時(shí)通信,websocket模仿了socket的通信方式,客戶端(瀏覽器)和服務(wù)器進(jìn)行三次握手(webSocket使用http協(xié)議進(jìn)行握手,服務(wù)器收到也使用http回復(fù),之后使用tcp進(jìn)行通信),它是一種雙向協(xié)議,解決了客戶端服務(wù)器全雙工通信.WebSocket和HTTP一樣是應(yīng)用層協(xié)議.
在unity中使用WebSocket:
1.WebSocketSharp : github地址:https://github.com/sta/websocket-sharp大概16年停更了.
后來(lái)有網(wǎng)友支持了打包webgl版本的钠至,仍然可以使用websocket,websocket-sharp不能直接打包webgl版本,GitHub網(wǎng)址:https://github.com/y85171642/UnityWebSocket
連接示例:注意其中的WebSocket是 WebSocketSharp命名空間下的.
2.Unity Store插件 BestHTTP:
收費(fèi)插件,下載地址百度找找看
3.C#的ClientWebSocket類:
語(yǔ)言自帶的websocket實(shí)現(xiàn),不知道是哪個(gè)版本支持的...我覺(jué)得有原生支持怎么還有人寫websocket的插件,可能是C#自帶的websocket出現(xiàn)的時(shí)間晚一些嗎? 使用起來(lái)也很簡(jiǎn)單:
但凡是網(wǎng)絡(luò)連接,總是會(huì)有各種連接不上的問(wèn)題,以及其他問(wèn)題,在這里說(shuō)一下本人遇到的問(wèn)題以及解決方案:
1.以上三種方案連接ws網(wǎng)址(http),都是可以連接成功,可以正常收發(fā)信息,但是連接wss網(wǎng)址(https)時(shí),就可能會(huì)出現(xiàn)連接不通的情況,原因在于https對(duì)安全性要求比較高,解決方案:
A:當(dāng)客戶端需要驗(yàn)證服務(wù)器證書時(shí)總是返回true(舍棄了安全性):
B:可能客戶端支持的ssl/tls協(xié)議版本和服務(wù)器不一致 導(dǎo)致無(wú)法連通:
ClientWebSocket中進(jìn)行以下設(shè)置:
WebsocketSharp中進(jìn)行以下設(shè)置:
m_rawSocket.SslConfiguration.EnabledSslProtocols =?(System.Security.Authentication.SslProtocols)((int)m_rawSocket.SslConfiguration.EnabledSslProtocols |?192?|?768?|?3072); }
其中192,768,3072代表著ssl協(xié)議的版本:
2.連接wss網(wǎng)址,顯示已經(jīng)連接成功,但是服務(wù)器接收不到客戶端發(fā)出的信息, 其實(shí)按道理 握手都成功了,tcp連接也已經(jīng)開啟了,不應(yīng)該會(huì)收不到消息啊,我猜測(cè)牽扯到了websocket很重要的一點(diǎn):websocket的握手是使用http連接的,既然返回成功,那一定是連接成功了.猜測(cè)是客戶端服務(wù)器設(shè)置問(wèn)題導(dǎo)致了信息不通,經(jīng)過(guò)檢查發(fā)現(xiàn) websocket協(xié)議中可以設(shè)置連接以后發(fā)送消息的類型:
在ClientWebSocket中:
在WebSocketSharp中:
調(diào)用sendAsync方法時(shí),可以選擇發(fā)string(對(duì)應(yīng)的是text明文type) 還是byte[](對(duì)應(yīng)的是binary二進(jìn)制type)
在實(shí)際項(xiàng)目中,在客戶端連接服務(wù)器成功的時(shí)候,可以讓服務(wù)器返回一些通用設(shè)置,客戶端根據(jù)這些設(shè)置,更改本地設(shè)置,避免因?yàn)樵O(shè)置不同而無(wú)法正常通信.