java - 用 SocketChannel.open().socket() 替换 new Socket() 有问题吗?

标签 java sockets nio socketchannel

如果我简单地更换会出现什么问题

socket = new Socket()

socket = SocketChannel.open().socket()?

背景:我有一些使用 new Socket() 的遗留代码,并且我希望能够中断 socket.connect() 调用。我不想重写代码来使用 NIO。我了解到 Thread.interrupt() 不会中断 socket.connect(),但假设另一个线程上的 socket.close()中断连接。奇怪的是,这适用于 Java 7,但不适用于 Java 6。

不知何故,我想到使用 socket = SocketChannel().open().socket() 会神奇地允许我使用 Thread.interrupt()中断socket.connect()。事实并非如此,但奇怪的是,它确实使 Java 6 中的 socket.close() 中断 socket.connect()!

请注意,我没有以任何方式直接使用附加的 SocketChannel——它在我创建 Socket 时出现,并且再也不会出现。

这会出什么问题?

最佳答案

有几个。

  1. 通过 SocketChannel 获取的 Socket 似乎不支持读取超时。
  2. 套接字的输入流和输出流不是独立的:它们具有共同的互锁。

为什么要中断 connect() 调用?当然您想要的只是连接超时?

关于java - 用 SocketChannel.open().socket() 替换 new Socket() 有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30821088/

相关文章:

java - 如何访问 jsonarray 元素

http - Delphi 突触 TTCPBlockSocket

php - 如果尚未接受套接字,则主套接字是否仍可以使用socket_select-?

C++ 套接字编程、带压缩的多播、任何好的库/包装器?

java - 在Java中,如何将文件所有者设置为root?

java - Apache MINA 服务器和 PHP 客户端

java - Java 中的 FileOutputStream 问题

java - 使用 XPath 处理 XML 文件生成的路径时出错

java - 连接阶段后 "java.io.IOException: Connection timed out"的含义

java - JPA 实体 equals() 方法的正确实现方式