我试图在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细节需要调整),因此要格外小心)

09-11 19:42