日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java zmq zmsg,zmq 识别多个客户端

發(fā)布時間:2024/10/8 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java zmq zmsg,zmq 识别多个客户端 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

zmq是一個開源的消息隊(duì)列庫,前幾天針對中繼spf的框架分析,發(fā)現(xiàn)可能存在進(jìn)程間通信問題,方式可能是一對多。隨意就想看看zmq如何實(shí)現(xiàn)進(jìn)程間通信問題。

既然涉及到一對多,就涉及到一個客戶端識別問題,分析了所有的zmq的實(shí)例代碼,都是1對1 的方式。就是沒有一對多的,最終功夫不負(fù)有心人,終于讓我找到蛛絲馬跡解決了這個問題。

這里用到了另一個zmq的庫czmq,他是zmq的高層C封裝。使用的通信方式是ZMQ_ROUTER。

這種通信方式的特點(diǎn)是server收到消息后,會在消息頭部添加來源的標(biāo)記,這樣app得到消息是就可以通過識別消息頭部判斷 消息來源。

1? ???void *receiver = zsocket_new(ctx, ZMQ_ROUTER);

2? ???zsocket_bind(receiver, "ipc:///tmp/0");

3

4? ???....

5

6? ???//recv message

7? ???zmsg_t *msg = zmsg_recv(receiver);

8? ???if (!msg){

9? ?? ?? ?//error handle..

10? ?? ?? ?return;

11? ???}

12? ???zframe_t *address = zmsg_unwrap (msg);? ?? ?? ?? ?? ???//源地址

13? ???zframe_t *frame = zmsg_first (msg);? ?? ?? ?? ?? ?? ???//得到具體的消息

14? ???zmsg_destroy (&msg);

15

16? ???//do something, it make time some times...

17

18? ???//make response message

19? ???zmsg_t *message = zmsg_new();

20? ???zframe_t* body = zframe_new("world",sizeof("world"));

21

22? ???zmsg_push (message, body);

23? ???zmsg_wrap (message, address);? ?? ?? ?? ?? ?? ?? ?? ???//將目的地址封裝進(jìn)去

24

25? ???zmsg_send (&message, receiver);

26? ???zmsg_destroy(&message);

這里用到了兩個關(guān)鍵的api:zmsg_unwrap 和 zmsg_wrap

struct _zmsg_t {

zlist_t *frames;? ?? ?? ?? ?//??數(shù)據(jù)幀列表

size_t content_size;? ?? ???//??消息總長度

};

//??Opaque class structure

typedef struct _zmsg_t zmsg_t;

//??--------------------------------------------------------------------------

//??Push frame plus empty frame to front of message, before first frame.

//??Message takes ownership of frame, will destroy it when message is sent.

void zmsg_wrap (zmsg_t *self, zframe_t *frame)

{

assert (self);

assert (frame);

if (zmsg_pushmem (self, "", 0) == 0)? ?? ?? ?? ?? ?? ?? ?? ???//首先在消息頭添加一個空的幀

zmsg_push (self, frame);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? //談后將指定的幀添加進(jìn)去

}

//??--------------------------------------------------------------------------

//??Pop frame off front of message, caller now owns frame

//??If next frame is empty, pops and destroys that empty frame.

zframe_t *zmsg_unwrap (zmsg_t *self)

{

assert (self);

zframe_t *frame = zmsg_pop (self);? ?? ?? ?? ?? ?? ?? ?? ?? ? //pop第一個幀

zframe_t *empty = zmsg_first (self);? ?? ?? ?? ?? ?? ?? ?? ???//判斷第一個(其實(shí)是第二個)是不是空的

if (empty && zframe_size (empty) == 0)? ?? ?? ?? ?? ?? ?? ?? ?//是空幀就pop

{

empty = zmsg_pop (self);

zframe_destroy (&empty);

}

return frame;

}

閱讀(4559) | 評論(0) | 轉(zhuǎn)發(fā)(0) |

總結(jié)

以上是生活随笔為你收集整理的java zmq zmsg,zmq 识别多个客户端的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。