我們都知道socket是套接字,描述ip地址和端口,它本身並不是協議,而是壹個調用接口,為了大家直接使用更底層的協議(TCP或UDP),是對TCP/IP 或 UDP/IP的封裝。socket處於網絡層中的第五層,是壹個抽象層。websocket是壹個協議,是基於http協議的,是建立在TCP連接之上的,是應用層上的壹個應用層協議,和socket不是壹個概念。
websocket可以傳輸文本和二進制。
websocket的協議頭是ws開頭的,並不是http。
在iOS 平臺上,我們知道socket的開源框架有 CocoaAsyncSocket , 而websocket的框架有Facebook的 SocketRocket , 以及 socket.io-client-swift。
使用cocoapods集成
創建方法
這裏要特別註意格式
如果服務器使用的框架是socket.io,客戶端和服務器進行連接,客戶端實現了SRWebSocketDelegate的代理方法後,並沒有在打開成功的方法中實現回調,而是直接實現了關閉的(didCloseWithCode)回調,打印的結果如下:
那麽 這裏的url就應該再進行壹下參數拼接了
遵守SRWebSocketDelegate協議並實現代理方法
接收消息的代理方法是必須實現的,要不然就crash了
下面的代理方法展示的是,當前websocket的連接狀態,open,fail,close,receivePong
關於 didReceivePong方法的理解
使用webSocket時,最好建立壹個心跳包,用於每隔壹段時間(5s也好十幾秒也好)通知壹次服務端,告訴服務器,客戶端還活著,這就是壹個ping消息。然後呢,服務器返回給客戶端壹個pong消息,這個pong消息呢,就在 didReceivePong 這個代理方法中去接收。
客戶端發送消息的方法:
在發送信息的時候,要和服務器進行商量,格式是什麽樣的,如果格式不對的話,每發送壹次,websocket都會關閉壹次,這就很蛋疼了。
發送消息的時候,最好是創建壹個模型 -> 轉字典-> 轉data-> 轉成字符串。最後發送給服務器的就是這個字符串了。
在接收到消息didReceiveMessage的方法中,再把服務器傳過來的數據,轉換成模型,方便使用。
學會了簡單的使用socketRocket之後呢,最好封裝壹個工具類,來進行統壹的管理,外界方便使用調用。需要註意的事,在封裝的過程中,要定義壹個屬性state,表示websocket的連接狀態,是關閉?連接中?已連接?連接錯誤?系統關閉?用戶關閉?接收到信息等。根據實際的需求去做壹些相應的處理。