Java套接字支持全双工吗?

56

是否可能让一个线程在不需要对套接字进行同步的情况下,向Java Socket OutputStream 写入数据,而另一个线程从套接字的 InputStream 读取数据?


8
希望开发者可以通过 Javadoc 方便地获取这种信息。 - mre
1
“threadsafe”在这里不是一个合适的术语。更像是“全双工”。拥有两个线程,一个用于读取,一个用于写入是安全的。 - irreputable
1
出于好奇,你想做什么?如果你想进行非阻塞网络编程,你是否查看过 http://mina.apache.org/ ?它可能不符合你的需求,但值得一看。 - Adam Gent
@Adam:感谢提供链接,Mina框架在我的情况下可能比简单的IPC更加全面。 - Tony the Pony
2个回答

48

当然可以。您描述的确切情况不应该是问题(同时读取和写入)。

通常,如果没有可读取的内容,读取线程将被阻塞,并且如果设置了超时,可能会在读取操作上超时。

由于输入流和输出流是Socket内的单独对象,您唯一需要考虑的事情就是,如果有两个线程尝试同时读取或写入(两个线程,相同的输入/输出流),会发生什么情况? InputStream / OutputStream类的读/写方法不是同步的。然而,如果您正在使用InputStream / OutputStream的子类,则调用的读取/写入方法可能是同步的。您可以查看您正在调用的任何类/方法的javadoc,并快速找到答案。


我不明白如何同时实现这两个功能,因为ServerSocket的accept()方法是一个阻塞方法... 因此读/写线程不能同时获取套接字.... 然而,如果我错了,发送/接收的数据是否会在管道中混合? - Jason Krs
accept()创建一个新的客户端套接字。这与读写是分开的。 此外还有两个流——一个输入流和一个输出流——所以数据不会混淆。 - jefflunt
好的..两个流!!我现在理解得更好了...谢谢 - Jason Krs

9

是的,这是安全的。

如果您想从InputStream中读取多个线程,那么您需要更加小心(假设您一次读取多个字节)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接