我正在尝试编写一个简单的程序来打开到本地地址的套接字通道。每当我运行这个程序时,我都会收到连接被拒绝的异常
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.channels.SocketChannel;
public class testSocket {
public static void main(String [] args) {
try {
InetAddress addr = InetAddress.getByName("localhost");
InetSocketAddress remoteAddress = new InetSocketAddress(addr, 19015);
// Open a new Socket channel and set it to non-blocking
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false);
// Issue the Connect call on the remote address.
socketChannel.connect(remoteAddress);
} catch (Exception e) {
e.printStackTrace();
}
}
}
我得到的例外是
java.net.ConnectException: Connection refused
at sun.nio.ch.Net.connect(Native Method)
at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:464)
at testSocket.main(testSocket.java:17)
我在使用Sun Solaris和HP-UX时遇到此问题。它似乎在Linux机器上运行良好。任何人都可以让我知道为什么连接被拒绝?我做了一个netstat -a并确认端口没有使用。
提前致谢!
答案 0 :(得分:1)
当您的指定端口(19015)上没有进程监听时,您将收到“拒绝连接”消息。看起来您正在尝试连接到不存在的服务。 netstat甚至告诉你端口没有被使用!
答案 1 :(得分:0)
来自Javadoc for SocketChannel.connect()
如果此通道处于非阻塞模式,则调用此方法将启动非阻塞连接操作。如果立即建立连接,就像本地连接可能发生的那样,则此方法返回true。否则,此方法返回false,稍后必须通过调用finishConnect方法完成连接操作。
当我在Linux上运行你的代码时,connect()返回false,因此没有异常。如果添加对socketChannel.finishConnect()的调用,您将看到与Solaris / HP-UX上相同的连接拒绝异常。
我怀疑在Solaris / HP-UX上connect()返回true,因此会立即抛出异常。