3

私は小さなサーバー/クライアント プロジェクトに取り組んでいますが、進行を妨げている小さな問題に遭遇しています。

プログラムのコア(クライアントとサーバー)を釘付けにし、2つを使用して接続できたと思いますlocalhostが、外部IPを介して接続しようとすると例外が発生します:

java.net.ConnectException: Connection refused
java.net.PlainSocketImpl.socketConnect(Native Method)
java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
java.net.Socket.connect(Socket.java:529)
java.net.Socket.connect(Socket.java:478)
java.net.Socket.<init>(Socket.java:375)
java.net.Socket.<init>(Socket.java:218)
networking.Client.run(Client.java:183)
java.lang.Thread.run(Thread.java:680)

最初はポート 10 を使用しようとしましたが、Mac では何らかの理由で 0 から 1023 までのポートが機能しないことが判明したため、その範囲外のポートを選択しました。との接続は機能しlocalhostましたが、(通常のユーザーと同じように) 外部 IP に接続しようとすると、その例外が発生しました。私のポートは適切に転送され、実行中sudo lsof -i tcp -nP( netstatMac の場合) は、実際に私のサーバーが実際に正しいポートでリッスンしていることを示します。これにより、問題はクライアントにある可能性があると信じるようになりましたが、実際にはわかりません.

sudo lsof -i tcp -nPTerminal.app からの出力は次のとおりです。

COMMAND     PID         USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
java      35423 MeshulamSilk   41u  IPv6 0xc949f3cdb29dfdcd      0t0  TCP *:63370 (LISTEN)
java      35423 MeshulamSilk   42u  IPv6 0xc949f3cdbbf1b96d      0t0  TCP [::1]:63992->[::1]:63991 (TIME_WAIT)

これらの投稿がややこしくなるのはわかっているので、コードを Gist にアップロードしました。誰かが私にここに追加してほしい場合は、私に知らせてください。

サーバーとクライアントの両方のコードは、ここにあります

注意すべき点:

  • MooConsole は、エクスポートされたプログラムのコンソールを提供する、私が作成したライブラリです。クライアントとサーバーの両方でテキストを表示するために使用しています。
  • MooCommands は、コンソールから実行できるコマンドを表す私のライブラリの 1 つです。
  • SocketThread は、新しい接続を処理するクラスです。これにより、サーバーは複数のクライアントを同時に接続できます。伸びjava.lang.Threadます。それが問題を引き起こしているとは思わないので、含めませんが、必要に応じて含めます。
  • Operations.DISCONNECT切断を表す列挙定数です。

私が間違っていること、または単にしていないことを誰かが知っている場合は、私に知らせてください。

4

1 に答える 1

1

私は Mac の専門家ではありませんが、lsof の出力に基づくと、プログラムは IPv6 のみのアドレスにバインドされているようです。localhost では問題なく動作しますが、パブリック IP アドレスを試す (そして IPv4 を使用する) と、それが問題の原因になる可能性があります。ポート番号については、OS のような UNIX では、1024 未満のユーザー ポートへのルート アクセスが必要です。いずれにしても、Mac で IPv6 を無効にして、問題が続くかどうかを確認する必要があります。

于 2013-05-02T17:12:19.540 に答える