【问题标题】:Full duplex TCP connection without NIO impossible?没有NIO的全双工TCP连接不可能?
【发布时间】:2010-01-21 16:00:02
【问题描述】:

我有两个独立的 java 进程通过一个 TCP 连接进行通信。该协议不是像 HTTP 这样的简单同步请求/响应协议。双方可以独立发起请求和发送数据。我想使用线程和阻塞套接字来实现这一点,避免 NIO。但这有可能吗?

Java 套接字 (java.net.Socket) 不是线程安全的,因此我不允许在一个线程中读取套接字,同时在另一个线程中写入它。 (这是真的吗?)这种限制显然会导致死锁的可能性,当双方都被阻塞写入套接字时。

因此,如果不使用 NIO,则无法在 java 中实现 TCP 之上的某些协议,或者我错过了一点?

谢谢。

【问题讨论】:

    标签: java sockets


    【解决方案1】:

    全双工通信当然是可能的。如果没有 NIO,您将需要一个线程从套接字读取(并执行请求的处理)。同时,另一个线程可以写入同一个套接字。

    如果您能指出一些表明套接字不是全双工的文档,我会尽力澄清它。

    【讨论】:

      【解决方案2】:

      我不知道您在哪里读到 Java 套接字通常是线程不安全的。您不能让多个线程同时写入或读取套接字的流,但是没有理由不能让线程写入套接字的 OutputStream 并让另一个线程从套接字的 InputStream 读取。

      【讨论】:

      • 这是否记录在某处?我在 java.net.Socket 的 JDK 文档中没有发现任何关于线程安全的信息。通常,除非明确说明,否则不能保证事情是线程安全的。由于这两个流都只是底层套接字的代理对象,因此必须假设从不同线程同时访问它们是不安全的,除非文档另有说明。
      • Gerald:这并不完全正确,JavaDocs 在定义线程安全时通常没有定论。有时会声明线程安全,有时会明确提到缺乏线程安全。 java.net.Socket 的文档都没有提到。但正如您在问题中所说,要求同时同步访问套接字的两个方向是不合理的。
      【解决方案3】:

      套接字是线程安全的,因此使用多个线程没有问题,一个用于读取,一个用于写入。另一方面,如果您想避免多个线程,那么您需要对套接字输入流执行轮询,以查看在执行任何出站操作时是否定期有传入数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-14
        • 1970-01-01
        • 1970-01-01
        • 2010-12-07
        • 2020-04-30
        • 1970-01-01
        • 2013-12-05
        • 1970-01-01
        相关资源
        最近更新 更多