Websocket協(xié)議之SocketRocket的使用

簡介

WebSocket 規(guī)范定義了一種 API,可在網(wǎng)絡瀏覽器和服務器之間建立“套接字”連接。

SocketRocketfacebook的開源框架,使在iOS鸣个,MAC羞反,TV端使用WebSocket技術成為可能。

前期準備

編譯工具:xcode8.2.1
語言:swift3.1
系統(tǒng)環(huán)境:Mac OS

客戶端

創(chuàng)建一個iOS工程

image.png

引入SocketRocket庫

使用pod集成SocketRocket庫囤萤。

不詳細介紹昼窗,不了解的請參考文章在swift調(diào)用OC的第三方庫

集成完畢項目結合如下圖:

image.png

API分析

SocketRocket暴露的接口并不多

首先看屬性:

//設置代理
@property (nonatomic, weak) id <SRWebSocketDelegate> delegate;

//只讀,當前處于的狀態(tài)
typedef NS_ENUM(NSInteger, SRReadyState) {
    SR_CONNECTING   = 0,   連接狀態(tài)
    SR_OPEN         = 1,   打開狀態(tài)
    SR_CLOSING      = 2,  正在關閉狀態(tài)
    SR_CLOSED       = 3,  已經(jīng)關閉狀態(tài)
};
@property (nonatomic, readonly) SRReadyState readyState;

//只讀涛舍,連接的URL
@property (nonatomic, readonly, retain) NSURL *url;

//只讀澄惊,接收到的http頭
@property (nonatomic, readonly) CFHTTPMessageRef receivedHTTPHeaders;

// 設置requestCookies,Web 服務器就可以使用這些信息來識別不同的用戶
@property (nonatomic, readwrite) NSArray * requestCookies;

初始化方法:

通過NSURLRequest進行初始化:

-(id)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray *)protocols allowsUntrustedSSLCertificates:(BOOL)allowsUntrustedSSLCertificates;
-(id)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray *)protocols;
-(id)initWithURLRequest:(NSURLRequest *)request;

通過NSURL進行初始化

-(id)initWithURL:(NSURL *)url protocols:(NSArray *)protocols allowsUntrustedSSLCertificates:(BOOL)allowsUntrustedSSLCertificates;
-(id)initWithURL:(NSURL *)url protocols:(NSArray *)protocols;
-(id)initWithURL:(NSURL *)url;

設置線程

//默認為主隊列富雅,兩個方法不能同時使用
- (void)setDelegateOperationQueue:(NSOperationQueue*) queue;
- (void)setDelegateDispatchQueue:(dispatch_queue_t) queue;

開啟關閉:

//打開連接掸驱,只能執(zhí)行一次
- (void)open;
//關閉連接
- (void)close;
 //關閉原因和code
- (void)closeWithCode:(NSInteger)code reason:(NSString *)reason;
// 發(fā)送消息給服務器(允許UTF8字符串或者Data)
- (void)send:(id)data;
//發(fā)送一個心跳消息ping,可以為參數(shù)可以為nil(用來確定客戶端未丟失没佑。)
- (void)sendPing:(NSData *)data;

協(xié)議:

//當使用open的時候毕贼,如果連接成功回調(diào)
- (void)webSocketDidOpen:(SRWebSocket *)webSocket;
//當服務器拒絕,或者發(fā)生錯誤的時候回調(diào)
- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;
//服務器關閉的時候回調(diào)
- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;
//服務器心跳回調(diào)
- (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload;
// 當為yes蛤奢,則將data轉為string鬼癣,no的時候不進行轉換。
- (BOOL)webSocketShouldConvertTextFrameToString:(SRWebSocket *)webSocket;

寫一個簡單小Demo啤贩,ws://echo.websocket.org地址可以免費查看你的Demo是否已經(jīng)正常待秃,返回值為發(fā)送的值

class ViewController: UIViewController, SRWebSocketDelegate {
    @IBOutlet weak var msgTextField: UITextField!
    @IBOutlet weak var receiveLable: UILabel!
    private var websocket: SRWebSocket?
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.reConnect()
    }
    @IBAction func sendMsgBtn(_ sender: Any) {
        self.view.endEditing(true)
        if let websoc = websocket {
            websoc.send(self.msgTextField.text!)
        }
    }
    private func reConnect() {
        websocket?.delegate = nil
        websocket?.close()
        websocket = nil
        websocket = SRWebSocket.init(urlRequest: URLRequest.init(url: URL.init(string: "ws://echo.websocket.org")!))
        websocket?.delegate = self as SRWebSocketDelegate
        websocket?.open()
    }
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        websocket?.delegate = nil
        websocket?.close()
        websocket = nil
    }
    // Implement agent
    public func webSocket(_ webSocket: SRWebSocket!, didReceiveMessage message: Any!) {
        if webSocket.readyState == .OPEN {
            self.receiveLable.text = message as? String
        }
    }
    func webSocket(_ webSocket: SRWebSocket!, didFailWithError error: Error!) {
        print("\(error!.localizedDescription)")
    }
    func webSocketDidOpen(_ webSocket: SRWebSocket!) {
        print("連接成功!")
    }
    func webSocket(_ webSocket: SRWebSocket!, didCloseWithCode code: Int, reason: String!, wasClean: Bool) {
        print("連接關閉")
        websocket = nil
    }
    func webSocket(_ webSocket: SRWebSocket!, didReceivePong pongPayload: Data!) {
    }
    @IBAction func closeSocketBtn(_ sender: Any) {
        websocket?.delegate = nil
        websocket?.close()
        websocket = nil
    }
}

服務器

上面使用的是一個簡單的測試服務器瓜晤,接下來我們自己搭建一個服務器用于有趣的測試锥余。

使用node搭建一個自己的Websocket服務器

系統(tǒng)環(huán)境:Mac OS

①使用brew install node安裝node

②創(chuàng)建一個自定義的文件夾,并且cd進入本文件夾腹纳,使用命令行npm install ws,npm install node-uuid創(chuàng)建兩個模塊作為依賴痢掠。

image.png

這邊出現(xiàn)的WARN不需要處理,也可以先npm init來初始化,生成一個package.json嘲恍,不過本示例不需要足画。

創(chuàng)建一個文件,命名為server_test.js

寫一段簡單的服務器Demo,實現(xiàn)將前端傳來的數(shù)據(jù)傳回佃牛。

//導入ws模塊
var webSocketServer = require('ws').Server
//用端口初始化一個對象
wss = new webSocketServer({port: 8181})
//連接中進行的操作
wss.on('connection', function (ws) {
    console.log("client connected!")
    ws.on("message", function (message) {
        console.log(message)
        ws.send(message)
    })
})

啟動node服務器

//  /Users/nttdata/Desktop/Server/server_test.js是js路勁淹辞,開啟后不要關閉命令行工具
node /Users/nttdata/Desktop/Server/server_test.js

測試一下前后端是否暢通,請看圖:

image.png

OK俘侠!

附上iOS端項目和服務器端簡單的項目象缀,以供參考!有誤請留言爷速,謝謝央星!

項目地址

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市惫东,隨后出現(xiàn)的幾起案子莉给,更是在濱河造成了極大的恐慌毙石,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颓遏,死亡現(xiàn)場離奇詭異徐矩,居然都是意外死亡,警方通過查閱死者的電腦和手機叁幢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門滤灯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人遥皂,你說我怎么就攤上這事力喷。” “怎么了演训?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵弟孟,是天一觀的道長。 經(jīng)常有香客問我样悟,道長拂募,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任窟她,我火速辦了婚禮陈症,結果婚禮上,老公的妹妹穿的比我還像新娘震糖。我一直安慰自己录肯,他們只是感情好,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布吊说。 她就那樣靜靜地躺著论咏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪颁井。 梳的紋絲不亂的頭發(fā)上厅贪,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機與錄音雅宾,去河邊找鬼养涮。 笑死,一個胖子當著我的面吹牛眉抬,可吹牛的內(nèi)容都是我干的贯吓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蜀变,長吁一口氣:“原來是場噩夢啊……” “哼悄谐!你這毒婦竟也來了?” 一聲冷哼從身側響起昏苏,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤尊沸,失蹤者是張志新(化名)和其女友劉穎威沫,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洼专,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡棒掠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了屁商。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烟很。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蜡镶,靈堂內(nèi)的尸體忽然破棺而出雾袱,到底是詐尸還是另有隱情,我是刑警寧澤官还,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布芹橡,位于F島的核電站,受9級特大地震影響望伦,放射性物質(zhì)發(fā)生泄漏林说。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一屯伞、第九天 我趴在偏房一處隱蔽的房頂上張望腿箩。 院中可真熱鬧,春花似錦劣摇、人聲如沸珠移。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钧惧。三九已至,卻和暖如春滑潘,著一層夾襖步出監(jiān)牢的瞬間垢乙,已是汗流浹背锨咙。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工语卤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酪刀。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓粹舵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骂倘。 傳聞我的和親對象是個殘疾皇子眼滤,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容