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



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

  1. 一次读写。如果一个套接字客户端连接到一个 spcket 服务器,它们是否可以同时读取和写入?据我了解,TCP协议是全双工的,所以理论上套接字应该能够读写一个,但我们必须为机器人客户端和服务器创建两个线程。我说的对吗?

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

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

  4. 想象一下,我们在一端调用 write(); flush() 和另一端调用 read() 之间有一个延迟。在延迟期间 - 写入的数据将存储在哪里?会被传送吗?存储在"介于"之间的"某个位置的"延迟"数据的最大大小是多少?

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

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

  3. 是的,您需要 2 个线程,您
  4. 不能用单个线程执行此操作(或者您可以,但正如您自己所说,您需要不断打开和关闭连接)。

  5. 它将存储在某个地方的缓冲区中。根据您的代码,它可能位于缓冲流中,也可能位于套接字自己的缓冲区中。我相信BufferedOutputStream的默认缓冲区大小是 8K,套接字自己的缓冲区将取决于环境。不过,这并不重要,TCP/IP 的流质量消除了考虑缓冲区的需要,除非您真的需要进行微调。

最新更新