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