ソケットサーバーをセットアップしようとすると、エラーメッセージが表示されます。
Exception in thread "main" Java.net.BindException: Cannot assign requested address: JVM_Bind
at Java.net.PlainSocketImpl.socketBind(Native Method)
at Java.net.PlainSocketImpl.bind(PlainSocketImpl.Java:383)
at Java.net.ServerSocket.bind(ServerSocket.Java:328)
at Java.net.ServerSocket.<init>(ServerSocket.Java:194)
at Java.net.ServerSocket.<init>(ServerSocket.Java:106)
at socketyserver.SocketyServer.main(SocketyServer.Java:12)
Java Result: 1
コード全体が最も単純です:
public static void main(String[] args) throws UnknownHostException, IOException
{
ServerSocket serverSocket;
serverSocket = new ServerSocket(9999);
}
ポートが転送され、Windowsファイアウォールがオフになっていることは100%確信しています。ポート9999をブロックするものはありません。他に何が問題になる可能性がありますか?
他の人が指摘しているように、それはおそらくポート9999
を使用する別のプロセスに関連しています。 Windowsでは、次のコマンドを実行します。
netstat -a -n | grep "LIST"
そして、ポートを占有しているものをすべてリストする必要があります。もちろん、タスクマネージャーでこれらのプログラムを手動で強制終了する必要があります。それでもうまくいかない場合は、次の行を置き換えます。
serverSocket = new ServerSocket(9999);
と:
InetAddress locIP = InetAddress.getByName("192.168.1.20");
serverSocket = new ServerSocket(9999, 0, locIP);
もちろん、192.168.1.20
を実際のIPアドレスに置き換えるか、127.0.0.1
を使用します。
/etc/hosts
の-misconfigurationに関連している可能性があります。私の場合、これは次のようなものでした:192.168.1.11 localhost
の代わりに127.0.0.1 localhost
同様の問題を解決することを期待してこの答えを見るかもしれない他の人のために、私のIPアドレスが変わったので、私は同様のメッセージを受け取りました。
Java.net.BindException: Cannot assign requested address: bind
at Sun.nio.ch.Net.bind(Native Method)
at Sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.Java:126)
at Sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.Java:59)
at org.Eclipse.jetty.server.nio.SelectChannelConnector.open(SelectChannelConnector.Java:182)
at org.Eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.Java:311)
at org.Eclipse.jetty.server.nio.SelectChannelConnector.doStart(SelectChannelConnector.Java:260)
at org.Eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.Java:59)
at org.Eclipse.jetty.server.Server.doStart(Server.Java:273)
at org.Eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.Java:59)
エラーにはCannot assign requested address
と表示されます。つまり、ネットワークインターフェースの1つに正しいアドレスを使用するか、0.0.0.0
を使用してすべてのインターフェースからの接続を受け入れる必要があります。
ポートに関するその他のソリューションは、ポートが完全に無関係であるため、時々失敗するブラックマジック(一部のコンピューターは再起動したが他のコンピューターは再起動しないなど)後にのみ機能します。
Java.net.BindExcpetion
のJavaドキュメント、
ソケットをローカルアドレスとポートにバインドしようとしたときにエラーが発生したことを通知します。通常、ポートは使用中です、または要求されたローカルアドレスは割り当てられませんでした。
原因:
このエラーは、上記の2番目の条件が原因です。サーバー(Tomcat、Jettyなど)を起動すると、ポートをリッスンし、ソケットをアドレスとポートにバインドします。 WindowsおよびLinuxでは、ホスト名は/etc/hosts
からIPアドレスに解決されます。このホストからIPアドレスへのマッピングファイルは、C:\Windows\System32\Drivers\etc\hosts
にあります。このマッピングが変更され、ホスト名をIPアドレスに解決できない場合、エラーメッセージが表示されます。
解決:
ホストファイルを編集し、管理者権限を使用してホスト名とIPのマッピングを修正します。
例えば:
#127.0.0.1 localhost
192.168.52.1 localhost
サーバーを使用している場合、「パブリックネットワークIP」と「内部ネットワークIP」があります。ファイル/ etc/hostsで「内部ネットワークIP」を使用し、コードで「パブリックネットワークIP」を使用します。ファイル/ etc/hostsで「パブリックネットワークIP」を使用すると、このエラーが発生します。
私にとっては、以前のjmeter.propertiesの変更がまだ有効であったためでした
httpclient.localaddress=12.34.56.78
あなたがCentOSで起こったら?
これを試してみてください。
$サービスネットワークの再起動
または
サーバーを再起動します。
ポートは別のプロセスによって取得されます。おそらく、プログラムの未終了の古い実行です。プログラムが正常に終了したことを確認するか、強制終了します。
エラーが示すように、バインドできません-これは通常、別のプロセスで使用されていることを意味します。コマンドラインから実行:
netstat -a -n -o
左側の列で使用中のポート9999の出力を調べます。
詳細: http://www.zdnetasia.com/see-what-process-is-using-a-tcp-port-62047950.htm
私の場合、/ etc/hostsから削除します
あるサーバーから別のサーバーに構成をコピーすると、このエラーが発生しました。
$ {JETTY_BASE} /start.ini jetty.Hostプロパティに古いホストのホスト名がありました。正しいjetty.Hostプロパティ値を設定すると、問題が解決しました。
これが将来複数のサーバーで同時に作業しなければならない人を助けることを願っています。