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

标签 java sockets networking io

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

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

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

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

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

最佳答案

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

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

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

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

关于java - 套接字 Java I/O 的计时问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19930166/

相关文章:

c - 从客户端到服务器的文件传输

objective-c - 向 Minecraft 服务器发送数据包 : Objective c

c# - 访问网络路径并将文件复制到系统= c#

java - 从 S3 上的视频创建缩略图而无需下载

java - 使 Java List<User> 变得唯一的最简单方法是什么?

java - 在 list 中关闭接收器

java beginner-是arraylist的引用调用

python - ValueError:使用套接字和 ssl 模块时 check_hostname 需要 server_hostname

c - UDP -- 套接字 - 绑定(bind)错误 - 地址已被使用?

networking - 主动FTP和被动FTP有什么区别?