【问题标题】:Timing issues with socket Java I/O套接字 Java I/O 的计时问题
【发布时间】:2013-11-24 15:50:54
【问题描述】:

试图了解 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()。在延迟期间 - 写入的数据将存储在哪里?会不会被传送?存储在“之间”某处的“延迟”数据的最大大小是多少?

【问题讨论】:

  • 我希望你能找到能回答你问题的人。由于其范围,这将需要很多时间。简而言之,您是在询问线程并发性(请记住,单个线程一次只能做一件事)以及 Socket 在某些依赖于平台的情况下的行为方式。我懒得写这些了。 :)
  • 仍然感谢您的尝试,MadConan。当然我自己会找到关于并发的信息,但是你能推荐一些关于 Java 网络的东西吗?

标签: java sockets networking io


【解决方案1】:
  1. 正确。如果您使用阻塞 I/O,则每个Socket 连接都需要一个读取线程和一个写入线程。

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

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

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

【讨论】:

    猜你喜欢
    • 2012-03-30
    • 2012-07-29
    • 2012-01-03
    • 2022-01-05
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    相关资源
    最近更新 更多