web-dev-qa-db-ja.com

Javaソケット、ローカルポートにバインド

クライアント側のソケットを特定のローカルポートにバインドしようとしています。このコードでは20000を使用しました。

以下のような通常の接続は問題なく機能します。ただし、ローカルポートを選択することはできません。

hostSocket = new Socket(Host,80);

だから私はこれを試しました:

hostSocket = new Socket(Host, 80, InetAddress.getLocalHost(), 20000);

この:

hostSocket = new Socket();
hostSocket.bind(new InetSocketAddress("localhost", 20000));
hostSocket.connect(new InetSocketAddress(Host,80));

しかし、どちらもこの例外を残しています... 2番目のケースでは、接続呼び出しで例外が発生しました。何が欠けているのかよくわかりません。いくつかのポインタが欲しいです。

Java.net.SocketException: Invalid argument or cannot assign requested address
at Java.net.PlainSocketImpl.socketConnect(Native Method)
at Java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.Java:327)
at Java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.Java:193)
at Java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.Java:180)
at Java.net.SocksSocketImpl.connect(SocksSocketImpl.Java:384)
at Java.net.Socket.connect(Socket.Java:546)
at Java.net.Socket.connect(Socket.Java:495)
at com.mb.proxy.netflix.NetflixPrefetchingAgent.connect(NetflixPrefetchingAgent.Java:98)
at com.mb.proxy.netflix.NetflixPrefetchingAgent.run(NetflixPrefetchingAgent.Java:164)
at Java.lang.Thread.run(Thread.Java:679)
Exception in thread "Thread-19" Java.lang.NullPointerException
at com.mb.proxy.netflix.NetflixPrefetchingAgent.prefetchChunk(NetflixPrefetchingAgent.Java:272)
at com.mb.proxy.netflix.NetflixPrefetchingAgent.run(NetflixPrefetchingAgent.Java:176)
at Java.lang.Thread.run(Thread.Java:679)
10
user2041602

ローカルホスト(127.0.0.1)ではなく、マシンの外部(アウトバウンド)IPアドレスにバインドする必要があります。

以下は問題なく私のボックスで動作します:

Socket s = new Socket();
s.bind(new InetSocketAddress("172.16.1.102", 5000));
s.connect(new InetSocketAddress("google.com", 80));

どこ 172.16.1.102は、ルーターからDHCPを介してこのボックスに割り当てられたNATされたプライベートネットワークアドレスです。

33
Brian Roach

ブライアンの答えは、問題を特定する上で的を射ています。

ただし、「任意のアドレス」に0.0.0.0を指定するだけなので、アウトバウンドインターフェイスのIPアドレスは必要ありません。その後、正しいアウトバウンドインターフェイスが自動的に選択されます。これは、最初にバインドせずに接続する場合とよく似ています。

さらに、 アドレスとして0.0.0.0を指定する最も簡単な方法は、パラメーターを省略することです

したがって:

hostSocket = new Socket();
hostSocket.bind(new InetSocketAddress(20000));
hostSocket.connect(new InetSocketAddress(Host, 80));
2
antak