java zmq zmsg,zmq 识别多个客户端
zmq是一個開源的消息隊列庫,前幾天針對中繼spf的框架分析,發現可能存在進程間通信問題,方式可能是一對多。隨意就想看看zmq如何實現進程間通信問題。
既然涉及到一對多,就涉及到一個客戶端識別問題,分析了所有的zmq的實例代碼,都是1對1 的方式。就是沒有一對多的,最終功夫不負有心人,終于讓我找到蛛絲馬跡解決了這個問題。
這里用到了另一個zmq的庫czmq,他是zmq的高層C封裝。使用的通信方式是ZMQ_ROUTER。
這種通信方式的特點是server收到消息后,會在消息頭部添加來源的標記,這樣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);? ?? ?? ?? ?? ?? ?? ?? ???//將目的地址封裝進去
24
25? ???zmsg_send (&message, receiver);
26? ???zmsg_destroy(&message);
這里用到了兩個關鍵的api:zmsg_unwrap 和 zmsg_wrap
struct _zmsg_t {
zlist_t *frames;? ?? ?? ?? ?//??數據幀列表
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);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? //談后將指定的幀添加進去
}
//??--------------------------------------------------------------------------
//??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);? ?? ?? ?? ?? ?? ?? ?? ???//判斷第一個(其實是第二個)是不是空的
if (empty && zframe_size (empty) == 0)? ?? ?? ?? ?? ?? ?? ?? ?//是空幀就pop
{
empty = zmsg_pop (self);
zframe_destroy (&empty);
}
return frame;
}
閱讀(4559) | 評論(0) | 轉發(0) |
總結
以上是生活随笔為你收集整理的java zmq zmsg,zmq 识别多个客户端的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php使用office modi吗,使用
- 下一篇: matlab参考答案2011至诚,职高数