1

试图了解 Java 套接字的操作方式。一个问题是:如果您使用套接字 Java API,您可以同时做什么,如果我们延迟发送和读取数据会发生什么?

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

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

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

  4. 想象一下,我们在调用 write() 之间有一个延迟;一侧调用flush(),另一侧调用read()。在延迟期间 - 写入的数据将存储在哪里?会不会被传送?存储在“之间”某处的“延迟”数据的最大大小是多少?

4

1 回答 1

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

  2. 您可以使用单个线程一次写入 N 个客户端,但您冒着写入阻塞的风险。我不会在这里讨论写入速度,因为它取决于几件事,但显然所有客户端的累积写入速度将低于 1kbps。

  3. 是的,你需要 2 个线程,你不能用一个线程来做到这一点(或者你可以,但正如你自己所说,你需要不断地打开和关闭连接)。

  4. 它将存储在某处的缓冲区中。根据您的代码,它可能位于缓冲流中,也可能位于套接字自己的缓冲区中。我相信默认的缓冲区大小BufferedOutputStream是 8K,而套接字自己的缓冲区将取决于环境。但这并不重要,除非您确实需要进行微调,否则 TCP/IP 的流传输质量无需考虑缓冲区。

于 2013-11-12T13:32:49.933 回答