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 に答える