c/s模式是應答狀態的,不能同時send多個資料
引用:http://blog.csdn.net/kaka11/article/details/6614479
1. 建立ctx內容物件,該對象會建立io_thread並啟動它們,採用reactor模型作為poller不斷輪詢。線程間的通訊使用mailbox來通訊,而mailbox其實本質上就是一個雙向的socketpair。
2. 建立zmq_socket對象,如果是client就使用connector去串連,如果是server就使用listener去監聽。
3. connetor或者listener會建立除zmq_init_t對象,後者作為identity交換。
4. 結束上述的初始化之後會建立相應的session_t對象,並且關聯相應的讀/寫管道,plugin zmq_engine, 進行真正的訊息資料的讀寫。
5. 訊息資料的讀寫是非同步,即調用zmq::zmq_send()和zmq::zmq_recv()只是將訊息資料寫到相應的管道中去。而session_t會在poller輪詢到相應的讀寫事件的時候從管道裡面讀寫訊息資料。
不多說了上代碼:
服務端:
package com.zeromq.test.cs;import org.zeromq.ZMQ;/** * @author 呂桂強 * @email larry.lv.word@gmail.com * @version 建立時間:2012-4-26 下午7:32:34 */public class hwserver {// java編寫的Hello World 服務端// 處理序間通訊ipc:///11111, 跨主機通訊使用tcp://10.5.0.170:26666// REP當接收訊息時,都會返回一個訊息// 使用REQ模式進行主機間通訊 串連到:tcp://localhost:5555// 發送 "Hello"到服務端, 接收 "World"public static void main(String[] args) {// 建立上下文, 初始化一個io_thread// 建立一個(socket最大數目 + io線程數目 + 3)的slots指標數組// a. 每個socket對象有自身的mailbox.// b. 每個io_thread對象也有自身的mailbox.// c. 另外的3個分別是zmq_term thread, reaper thread, log thread的mailbox.//相應的zermq的socket, 比如req, rep, pair, push, pull...等等,本例建立REP類型// 綁定到連接埠,並且在io_thread中accept串連ZMQ.Context context = ZMQ.context(1);ZMQ.Socket socket = context.socket(ZMQ.REP);socket.bind("tcp://*:5555");while (true) {byte[] request;// 等待下一個client端的請求// 等待一個以0結尾的字串// 忽略最後一位的0列印request = socket.recv(0);System.out.println("Received request: [" + new String(request, 0, request.length - 1) + "]");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}// 返回一個最後一位為0的字串到用戶端String replyString = "World" + " ";byte[] reply = replyString.getBytes();reply[reply.length - 1] = 0;socket.send(reply, ZMQ.NOBLOCK);}}}
用戶端:
package com.zeromq.test.cs;import org.zeromq.ZMQ;/** * @author 呂桂強 * @email larry.lv.word@gmail.com * @version 建立時間:2012-4-26 下午7:07:19 */public class hwclient {// java編寫的Hello World 用戶端// REQ 發送完訊息後,必須接收一個回應訊息後,才能發送新的訊息。// 使用REQ模式進行主機間通訊 串連到:tcp://localhost:5555// 發送 "Hello"到服務端, 接收 "World"public static void main(String[] args) {ZMQ.Context context = ZMQ.context(1);ZMQ.Socket socket = context.socket(ZMQ.REQ);socket.connect("tcp://localhost:5555");for (int request_nbr = 0; request_nbr <= 10; request_nbr++) {// 建立一個末尾為0的字串String requestString = "Hello" + " ";byte[] request = requestString.getBytes();request[request.length - 1] = 0;// 發送socket.send(request, ZMQ.NOBLOCK);// 獲得傳回值byte[] reply = socket.recv(0);// 輸出去掉末尾0的字串System.out.println("Received reply " + request_nbr + ": [" + new String(reply, 0, reply.length - 1) + "]");}}}