Java套接字 - 确保在其他客户端连接之前提供一个客户端连接

时间:2011-08-24 09:27:12

标签: java multithreading sockets client-server

我有多个客户端TCP套接字连接到服务器套接字。没什么不寻常的。在这些套接字上,间歇性地存在服务器套接字需要处理的数据。在某些时期,从客户端到服务器的数据将几乎连续不断。

我的问题是我需要确保服务器在来自其他服务器的数据之前服务于一个套接字连接上的数据。只有在没有关于“特殊”连接的数据之后,我才应该从其他客户端读取数据。

现在我有一个每个客户端的线程方法,我认为这不是我案例的最佳解决方案。具有快速“特殊”连接的东西是一种新的要求。所以,现在,我正在寻找满足这一要求的方法,而无需重新编写我已经拥有的套接字处理。

有什么建议吗?非常感谢你。

2 个答案:

答案 0 :(得分:1)

您必须实施某种调度/服务质量算法。在最简单的形式中,这可能只是“只要有特殊插座上的数据,不要打扰其他插座”。

这个简单的模型可以通过两个列表来实现:

  1. 一个特殊插座列表
  2. 一个常规套接字列表。
  3. 一个worker读取套接字,并写入队列。在读取少量字节后,它会检查特殊套接字是否有数据。如果是这样,只有在继续使用其他套接字后才能首先阅读特殊套接字。诀窍是以足够小的块读取数据,以便能够足够快地切换,但不能太小而不能失去所有效率。这就是CPU的调度也有效。

    请记住,只要特殊套接字有数据,只读取特殊套接字,其他套接字可能根本无法读取。如果您不想这样,请考虑调度算法,例如加权公平排队加权循环

答案 1 :(得分:0)

如@Konerak所述,您必须实施某种形式的QoS。

您可以尝试为封装它们的消息定义数据类型,然后添加标记以注释某个消息属于某种类型(就像您的特殊套接字一样)。然后,当服务器收到消息时,您可以将消息插入到开始执行的队列中。首先执行标记为“特殊”(或您要使用的内容)的所有消息,然后继续执行所有没有标记的消息。队列(FIFO)将确保在收到所有消息时对其进行处理。请务必查看队列的Peek方法(http://download.oracle.com/javase/1,5.0/docs/api/java/util/Queue.html)。

这可以作为快速修复,只需最少的代码更改,但这可能会打开一大堆新问题。即内存,指的是队列的大小,因为在处理特殊消息之前不会删除其他消息。

您还可以保留每个客户端的线程方法。在只有几个客户端连接的小环境中它是相当不错的,但是当你开始扩展到更大的数字时,你可能需要开始考虑使用NIO。但正如我所说,两者都是有效的方法,每个方法都有自己的优点。

只是一个想法和几件事情要考虑。