1

我正在尝试编写一个简单的程序来打开到本地地址的套接字通道。每当我运行此程序时,我都会收到连接被拒绝异常

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 并确认该端口未在使用中。

提前致谢!

4

2 回答 2

1

当指定端口 (19015) 上没有进程侦听时,您将收到“连接被拒绝”消息。看起来您正在尝试连接到不存在的服务。netstat 甚至会告诉您该端口未在使用中!

于 2009-07-02T09:09:19.323 回答
0

来自 SocketChannel.connect() 的 Javadoc

如果此通道处于非阻塞模式,则调用此方法将启动非阻塞连接操作。如果连接立即建立,就像本地连接一样,则此方法返回 true。否则,此方法返回 false,并且稍后必须通过调用 finishConnect 方法来完成连接操作。

当我在 Linux 上运行您的代码时,connect() 返回 false,因此也不例外。如果添加对 socketChannel.finishConnect() 的调用,您将看到与在 Solaris/HP-UX 上相同的连接被拒绝异常。

我怀疑在 Solaris/HP-UX 上 connect() 返回 true,因此立即抛出异常。

于 2009-07-02T09:12:04.873 回答