我试图在zmq上实现一个“文件分发程序”(实际上,我希望避免jni)。
我需要的是将传入的文件加载到处理器上:
理想情况下,我想要像https://github.com/zeromq/filemq这样的东西,但是
我的想法是混合使用taskvent/task接收器和异步and示例。
客户端:
服务器端:
我的第一个问题是:这似乎是正确的方式吗?可能还有更简单的吗?
我的第二个问题是:我当前的暗示是在发送实际的文件数据时陷入困境。
这不是套接字填满和丢弃数据的问题,我从一次发送的非常小的文件开始。
有洞察力吗?
谢谢!
==================
按照raffian的建议,我简化了我的代码,删除了推拉额外的套接字(既然你这么说了,这是有意义的)。
剩下的是“不工作”插座!
这是我目前的密码。它有许多目前超出范围的缺陷(客户机ID、下一个块等等)
现在,我只是想让两个人按顺序说话
发布于 2013-12-02 22:20:16
在客户机上,您不需要PULL和DEALER。经销商是PUSH和PULL的结合,所以只使用经销商,您的代码将更简单。
服务器也是如此,除非您正在做一些特殊的事情,否则您不需要PUSH和ROUTER,路由器是双向的。
服务器工作人员获得请求,并将响应写回inproc队列,但是响应似乎永远不会离开服务器(在wireshark中看不到),客户端被卡在poller.poll上等待响应。
代码问题
在服务器中,您在启动代理之前使用args.toList.foreach发送文件,这可能就是为什么没有任何东西离开服务器。首先启动代理,然后使用它;而且,一旦调用ZMQProxy(..),代码就会无限期地阻塞,因此您需要一个单独的线程来发送文件。
客户端可能与计票人有问题。轮询的典型模式是:
ZMQ.Poller items = new ZMQ.Poller (1);
items.register(receiver, ZMQ.Poller.POLLIN);
while (true) {
items.poll(TIMEOUT);
if (items.pollin(0)) {
message = receiver.recv(0);在上面的代码中,1)轮询直到超时,2)然后检查消息,如果可用,3)使用receiver.recv(0)。但是在您的代码中,您可以在不检查的情况下投票,然后进入recv()。在调用recv()之前,您需要检查轮询器是否有轮询套接字的消息,否则,如果没有消息,接收方将挂起。
https://stackoverflow.com/questions/20335810
复制相似问题