不能使用NIO的全双工TCP连接?

时间:2010-01-21 16:00:03

标签: java sockets

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

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

接下来,在没有使用NIO的情况下,TCP之上的某些协议无法实现,或者我错过了一点?

谢谢。

3 个答案:

答案 0 :(得分:4)

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

如果你能指出一些文件表明套接字不是全双工,我会试着澄清一下。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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