zeroMQ/jzmq REQ/REP(c/s)模式及java代码示例

zeroMQ/jzmq REQ/REP(c/s)模式及java代码示例_第1张图片

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




你可能感兴趣的:(java,thread,socket,tcp,String,byte)