zeroMQ/jzmq REQ/REP(c/s)模式及java程式碼範例

來源:互聯網
上載者:User

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) + "]");}}}



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.