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 [email protected] * @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 [email protected] * @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) + "]"); } } }