我试图在Android应用程序中使用jeromq的0.4.2,并向build.gradle添加了编译“ org.zeromq:jeromq:0.4.2”,但是无论服务器程序是否可用,ZMQ中的.connect( String addr )
都会崩溃。
因此,我尝试使用jeromq的0.4.0,并且.connect()
可以工作,但是当服务器程序不可用时,jeromq的.term()
将永远不会返回。
请在Android中查看以下代码的简单版本,以下代码在Intent服务的线程中运行。
ZMQ.Context context = ZMQ.context(1);
ZMQ.Socket client = context.socket(ZMQ.REQ);
client.connect("tcp://192.168.31.10:13587");
client.send("Android");
final int REQUEST_TIMEOUT = 3000;
ZMQ.Poller items = context.poller(1);
items.register(client, ZMQ.Poller.POLLIN);
items.poll(REQUEST_TIMEOUT);
if (items.pollin(0)) {
String reply = client.recvStr();
}
client.close();
context.term();
如果使用0.4.2的jeromq,则对
client.connect( "tcp://192.168.31.10:13587" )
方法的调用将崩溃。如果我使用版本0.4.0或0.3.6,则在服务器程序未运行时,context.term()
永不返回。 最佳答案
你是一个快乐的人,鲍勃!
原因很简单-.term()
-blocking是具有LINGER == -1
的套接字上的预期行为。
只是一直(是,总是)
设定:
<aSocketInstance>.setsockopt( ZMQ.LINGER, 0 );
对于每个套接字实例,在实例化之后就可以完成。
(如果需要将应用程序设置为更强大,以防止由于无法控制的一组主要分布的代理程序引起的错误或误用,则还有许多其他的API细节需要调整),因此要格外小心)