国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

[Websocket]如何向指定終端發(fā)送消息?

火紅的鯉魚

我啟動了一個websocket服務(wù)(websocket協(xié)議),然后打開了瀏覽器,打開了兩個瀏覽器標簽頁與其建立連接(通過js原生的Websocket對象),然而,實際上我發(fā)現(xiàn)connections只有一個,這導(dǎo)致我無法向指定的標簽頁發(fā)送信息。
請問,如何向指定的客戶端發(fā)送信息?
?----------------------------分割線----------------------------
?
我是按照如下方式發(fā)現(xiàn)多個標簽頁用的是同一個connection的。
首先,在join或login時打印workerId和$connection->id拼成的字符串(logEvent是我自定義的日志輸出函數(shù))

[attach]1866[/attach]

[attach]1867[/attach]
?
然后,打開兩個瀏覽器標簽頁各自建立連接

[attach]1870[/attach]

[attach]1871[/attach]

?
最后,查看服務(wù)端日志信息
?Workerman start in DEBUG mode
------------------------------------------- WORKERMAN --------------------------------------------
Workerman version:3.5.18 PHP version:7.2.8
-------------------------------------------- WORKERS ---------------------------------------------
proto user worker listen processes status
tcp www-data none websocket://0.0.0.0:2346 4

Press Ctrl+C to stop. Start success.
new connection is coming...172.18.0.1
2019-04-01 13:43:08:
2019-04-01 13:43:08:
2019-04-01 13:43:08:
2019-04-01 13:43:08:
2019-04-01 13:43:08:
-----join over

2019-04-01 13:43:08:
2019-04-01 13:43:08:
2019-04-01 13:43:08:
2019-04-01 13:43:08:
2019-04-01 13:43:08:
2019-04-01 13:43:08:
-----login over

new connection is coming...172.18.0.1
2019-04-01 13:43:13:
2019-04-01 13:43:13:
2019-04-01 13:43:13:
2019-04-01 13:43:13:
-----join over

2019-04-01 13:43:14:
2019-04-01 13:43:14:
2019-04-01 13:43:14:
2019-04-01 13:43:14:
2019-04-01 13:43:14:
2019-04-01 13:43:14:
-----login over

可以看到,兩次連接,經(jīng)過了兩輪join/login,但是每次的workerId_$connection->id組合都是一致的,都是0000000045562dda0000000048257f4c_1但是官方文檔上說,http://doc.workerman.net/tcp-connection.html,所以,是我使用姿勢不對么?請指教。

7344 1 0
1個回答

phpcreeper

使用姿勢不對:
不能使用?workerId 【用于區(qū)分不同的worker實例】, 至少使用 $worker->id??是正確的【用于區(qū)分同一個worker實例的不同進程】。

  • 火紅的鯉魚 2019-04-01

    但是我用了$worker->id拿到worker的id之后,怎么獲得那個worker的實例呢?我之前是用Worker::getAllWorkers()獲取了worker數(shù)組,然后發(fā)現(xiàn)它的鍵其實是workerId。

  • 火紅的鯉魚 2019-04-01

    其實我是想讓標簽頁1給標簽頁2發(fā)送一個websocket消息,所以我就得獲取用于標簽頁2的那個$connection實例。

  • phpcreeper 2019-04-01

    兩個頁面發(fā)起的websocket連接分別是兩個不同的連接對象,而 $connection->worker 就是獲得當(dāng)前連接所屬的worker實例,所謂的兩個標簽頁要進行互相推送消息,就是不同的連接對象就行通信的過程,所以我們只要確定出不同的唯一的連接對象uid,比如可以這樣使用:
    $uid = $conneciton->worker->id . $connection->id;

    另外注意: 單進程和多進程的通信手段是不一樣的,具體怎么玩手冊上都有特別說明。

  • 火紅的鯉魚 2019-04-03

    多謝,我找到這個問題的解決方案了,在這個頁面上:http://doc.workerman.net/components/channel-examples.html

    總結(jié)一下,在workerman里面,由于每個connection保持一個連接,所以如果你要針對某個客戶端發(fā)送消息的話,實際上是要通過那個特定的connection去發(fā)送這個消息,而connection又被worker持有,所以你得先找到那個worker,再找到那個connection,然后才能發(fā)送消息。

    要調(diào)動某個特定的worker,需要做進程間通信,因為你不能確定當(dāng)前負責(zé)處理消息任務(wù)的那個worker就是持有那個connection的worker。workerman有一個ChannelServer組件,就是在上面鏈接的那個頁面中,利用這個ChannelServer可以做到進程間通信,具體流程就是:

    1、廣播指令到達
    2、向監(jiān)聽了指定worker->id的ChannelClient發(fā)送消息(這里為什么要監(jiān)聽worker->id而不是別的,因為這樣可以節(jié)省好多流量和cpu操作,要不然,你的每個worker都要響應(yīng)一下這個消息事件來查看這個消息是不是發(fā)給自己的)
    3、根據(jù)發(fā)送的消息數(shù)據(jù)來確定由哪個connection處理該消息
    4、調(diào)用指定connection的send方法(完成廣播,其實廣播就是循環(huán)調(diào)用一批connection)

    ——————————————分割線————————————————

    再說一下我的誤區(qū)。

    之前查看文檔說,每個連接都由一個connection保持,然后我在發(fā)送廣播的時候,首先冒出的第一個想法就是,那我得先找到那個connection(這個想法沒錯),然后我發(fā)現(xiàn)是worker持有connection,然后就得找到worker,才能找到connection(到這里,想法也沒錯)。

    然后由于服務(wù)是多進程的,不能確定是被哪個worker處理了,所以,我的想法是建立一個數(shù)據(jù)共享機制,讓無論在哪個worker中都可以獲得某個指定的worker實例(這里開始有問題了),所以我使用了GlobalData組件,不管哪個worker收到消息,都把自身的id在這個共享庫中注冊一下,然后當(dāng)廣播消息到達時,我就去這個共享庫中找那個worker,然后找到那個worker中的那個特定的connection。

    表面上看,這樣做貌似沒毛病,但是有個很大的錯誤,就是,就算我把所有worker的id都注冊到了數(shù)據(jù)共享庫中,我也無法直接在某個進程worker中操作別的進程worker,因為進程之間是互相隔離的-_-!!。

    所以就需要進程間通信了,所以就需要ChannerServer。

    ——————————————分割線————————————————

    按照我那種錯誤的做法,實際表現(xiàn)出來的結(jié)果是,數(shù)據(jù)共享庫中一直只保存了一個wokerId+connection->id組合。

年代過于久遠,無法發(fā)表回答
??