![]() |
1
2
我这样解读这个问题: 你有: 1服务器 2客户 服务器从客户机1和2接收消息并转发它们。 客户机是不同的生产者,这意味着他们发送的消息可能不同。您需要的是客户机的消息交替地从您的服务器发送出去,但如果客户机已丢失,则不要“等待”。 在这个场景中,我建议在服务器中有两个队列(client1queue和client2queue)。 您必须从两个独立线程中的套接字中读取消息,当消息传入时,将其添加到相应的队列中。 客户1库存->客户1队列 client2socket->客户机2队列 然后,在第三个线程中,让服务器转发消息,交替地从client1queue和client2queue中提取这些消息。 如果队列是空的,那么要解决“不等待”的问题,只需跳过队列的“转弯”即可。这样可以确保以尽可能快的速度发送所有消息,同时仍能接收所有消息。缺点是,只有当消息准备好发送时,它才交替发送。当然,您可以让它等待x amount,以查看是否有消息出现在另一个队列中,但是我不明白如果系统应该工作而不管客户机状态如何,您为什么要这样做。 |
![]() |
2
1
您可以使用setsoTimeout()方法将套接字上的读取超时设置为较短的时间(例如,可能是一秒钟,也可以是您希望等待每个客户机的任何时间);这样,当您从客户机A获取第二条消息时,您只需从客户机B的套接字读取(),如果您获得了socketTimeout异常,则可以处理A的消息。 但是,您必须修改当前代码,以便在从套接字读取时捕获任何socketTimeoutExceptions。 |
![]() |
3
1
问题是:为了测试客户端是否被丢弃,必须在套接字上读取,但是,Java的Socket类不允许在套接字上异步读取。因此,如果在没有设置超时的情况下进行读取,并且没有发送任何内容,那么应用程序将扣押进程,等待读取某些内容。 所以,在实例化了套接字之后,您需要使用:socket.setsoTimeout(int)来给它一段时间,让它在超时之前“等待”。接下来会发生的事情是,每次尝试阅读时都会超时,如果阅读返回-1,您知道客户机已断开连接。
|
![]() |
4
0
出于我将在下面解释的原因,我将把这个有趣的事件视为消息(或消息的一部分)是否已经到达您的服务器。所以:
你 可能 想要像另一个海报所建议的那样在套接字上设置超时,尽管使用这个线程模型,我认为这并不重要——它实际上取决于您想要实施什么策略。 你询问客户的另一个建议是可能的,但这可能不是你真正想要的解决方案。你打开另一个通道,问客户“你刚刚发送了一些数据吗”。但是,如果客户有,而你没有得到,那么一般来说,有些事情已经出了问题,不清楚这些知识是否会对你有很大帮助。或者它可能会说“不”,然后就在此时发送数据。另一个到客户的渠道会起作用吗?如果客户说它发送了一些东西,你怎么知道它是即将到达,还是“迷路了”,永远不会到达……? |
![]() |
5
0
我想这样做的方式是: 如果我从客户机A连续收到2条消息,我将得到连接到客户机B的套接字的inputstream。然后调用inputstream上的available()方法,查看是否有字节可供读取。 如果要读取字节,则从客户机B的套接字读取。否则,从客户机A中继消息(第二个连续消息)。 对此有何评论? |
![]() |
6
0
如果客户机A在客户机B发送消息之前发送第二条消息,您是否打印出客户机A的第二条消息?在这种情况下,它根本就不是交替的,你只需要打印任何按消息到达顺序到达的消息。或者,您想稍等一下,看看是否有来自客户机B的消息到达?
不管怎样,您都需要为每个客户机分别运行一个线程,除了“主”线程之外。每个客户机线程不断地尝试从其各自的客户机读取一条消息,直到它收到一条消息为止。当一个套接字线程接收到一条消息时,它将它放到
主线程可以简单地循环和调用
如果你想交换信息,你可以有两个
|
![]() |
7
0
我将在javadoc中查找available()方法。它不像你想象的那样。 |
![]() |
8
0
您有两个单独的问题: 1)从多个客户端读取消息,不阻塞。 2)以公平的方式将消息写入输出。 如果为每个客户机套接字使用单独的线程,则可以解决第一个问题。如果您有许多客户机,可以考虑使用socketchannel和选择器来使用非阻塞IO。 请记住,根据网络和套接字选项,TCP/IP流可能会在每个读取操作中传递几个或只传递部分消息,因此必须注意这一点。 第二个问题可以通过为每个客户机保留一个队列或者使用优先级队列来解决,并根据客户机的活动性为每个消息附加优先级。 |