天天看點

workerman同時處理tcp協定和websocket協定的請求

       因項目需求,需要實作前端浏覽器和php同時連接配接workerman的情況,東尋西問,整了一整天總算做出來了,故在此記錄,希望能夠幫助又需要的朋友,同時也給自己以後遇到類似的問題時做個參考。

        1、建立workerman伺服器(詳情請看workerman手冊:http://doc.workerman.net/faq/secure-websocket-server.html),用的是websocket協定,因為浏覽器隻能通過ws或者wss連結伺服器,否則會報如下錯誤:

workerman同時處理tcp協定和websocket協定的請求

         2、php建立用戶端,代碼如下:

workerman同時處理tcp協定和websocket協定的請求

              這個時候連結workerman是成功的,沒有問題,但是,當用到

workerman同時處理tcp協定和websocket協定的請求

發送資料的時候,workerman就會把我們這個連結給關閉,為什麼呢?找到workerman的TcpConnection類,這個類裡面的baseRead方法裡有一個地方用到Workerman\Protocols\Websocket類裡的input方法,

workerman同時處理tcp協定和websocket協定的請求

沒錯,就是在這個方法了把我們的連結關閉了,因為通過socket_connect()連結的協定是為tcp協定,而workerman的協定是websocket,wokerman在接收資料的時候會使用websocket協定解碼接收到的資料,但是通過socket_send()發送過來的資料是tcp協定,解析不出來就會報錯,進而關閉連結。(以上僅為個人了解,因個人水準,了解或許不正确,如有高見還望留言告知一下具體原因,哈哈)

我的解決方案:

對發送資料進行處理,具體如何處理見仁見智,反正給資料加個标志或者標頭,告訴伺服器“哎,我是誰誰發送過來的資料,麻煩特殊處理一下!”;

然後再上邊提到的Workerman\Connection\TcpConnection這個類中,在關閉之前把資料特殊處理一下:

workerman同時處理tcp協定和websocket協定的請求

到此,浏覽器用戶端和php用戶端同時實作連結workerman。

繼續閱讀