【问题标题】:Do Java sockets support full duplex?Java 套接字是否支持全双工?
【发布时间】:2011-09-10 01:53:56
【问题描述】:

是否可以让一个线程写入 Java SocketOutputStream,而另一个线程从套接字的 InputStream 读取,而线程不必在套接字上同步?

【问题讨论】:

  • 我希望开发人员可以通过 Javadoc 轻松获得此类信息。
  • “threadsafe”在这里不是一个合适的术语。它更像是“全双工”。有 2 个线程是安全的,一个用于读取,一个用于写入。
  • 出于好奇,您想做什么?如果您正在寻找非阻塞网络,您检查过mina.apache.org 吗?它可能不符合您的需求,但值得一看。
  • @Adam:感谢您的链接,就我而言,Mina 框架可能比简单的 IPC 更广泛。

标签: java multithreading sockets


【解决方案1】:

当然。您所描述的确切情况应该不是问题(同时阅读和写作)。

通常,如果没有要读取的内容,读取线程将阻塞,如果您指定了超时,则读取操作可能会超时。

由于输入流和输出流是 Socket 中的独立对象,您唯一可能关心的是,如果您有 2 个线程尝试读取或写入会发生什么(两个线程,相同的输入/输出流)同时? InputStream/OutputStream 类的读/写方法不同步。但是,如果您使用 InputStream/OutputStream 的子类,则您调用的读/写方法可能是同步的。您可以检查 javadoc 以了解您正在调用的任何类/方法,并很快找到。

【讨论】:

  • 我不明白两者是如何同时发生的,因为accept() 方法(在ServerSocket的情况下)是一种阻塞方法......所以读/写线程不能同时获取套接字时间....不过,如果我弄错了,发送/接收的数据不会在管道中混淆吗?
  • accept() 创建一个新的客户端套接字。这与读/写是分开的。还有两个流——一个输入流和一个输出流——所以数据不会混合。
  • 好的..两个流!!我现在明白了...谢谢
【解决方案2】:

是的,这很安全。

如果您希望从 InputStream 读取多个线程,则必须更加小心(假设您一次读取多个字节)。

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2015-07-15
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多