套接字Java I / O的时序问题

时间:2013-11-12 13:13:14

标签: java sockets networking io

尝试了解Java套接字的运行方式。一个问题是:如果你使用套接字Java API,你可以同时做什么,如果我们发送和读取数据有一些延迟会怎样?

  1. READ&马上写。如果一个socket-client连接到一个spcket-server,它们可以同时读写吗?据我所知,TCP协议是全双工的,所以理论上socket应该能够在一个读写,但我们必须为bot客户端和服务器创建两个线程。我是对的吗?

  2. 立即写入N个客户端。如果多个套接字客户端连接到一个套接字服务器,服务器可以在一个时刻读取多个客户端,服务器是否可以一次写入多个客户端? 如果NetworkCard的最大可能物理速率是1kbyte / sec并且连接了5个客户端,那么可以用一个客户端写入哪个速度?

  3. 如何在两个方向上实现数据的顺序发送?我的意思是我想从服务器向客户端发送N个字节,然后从客户端到服务器发送M个字节,然后从服务器发送到客户端等等。问题是如果双方中的任何一方已经向通道写了一些东西,另一方将停止只有当通道关闭时才读取该数据(read()== -1),这意味着我们无法重用它并且必须打开另一个连接。或者,可能是,我们应该将读者和编写者放在使用read()和write()完成工作的不同线程中,直到连接关闭为止?

  4. 想象一下,我们在调用write()之间有一段延迟;一边是flush(),另一边是read()。在延迟期间 - 将存储书面数据?会传播吗?将“延迟”数据存储在“介于”之间的最大大小是什么?

1 个答案:

答案 0 :(得分:1)

  1. 正确。如果您正在使用阻塞I / O,则每个Socket连接都需要一个读者线程和一个写入线程。

  2. 您可以使用单个线程一次写入N个客户端,但是在写入时存在阻塞的风险。我不会在这里解决写入速度,因为它取决于几个方面,但显然所有客户端的累计写入速度都不到1kbps。

  3. 是的,你需要2个线程,你不能用一个线程(或者你可以,但正如你自己说的那样,你需要经常打开和关闭连接)。

  4. 它将存储在某个缓冲区中。根据您的代码,它可能位于缓冲流或套接字自己的缓冲区中。我相信BufferedOutputStream的默认缓冲区大小是8K,而套接字自己的缓冲区将取决于环境。它应该不是很重要,但TCP / IP的流媒体质量消除了考虑缓冲区的需要,除非你真的需要进行微调。