4

コンピューターのクライアントがコンピューターに接続して通信できるように、コンピューターからサーバーを作成しようとしています。サーバーをポート31350で作成しましたが、クライアントがルーターのIPアドレスを介して接続しようとしています。ただし、ソケット作成のパラメーターに「localhost」またはコンピューターの名前が含まれている場合にのみ、LANを介して機能します。IPアドレスを使用して、クライアントとサーバーを異なるネットワークで実行している場合ではありません。これがコードです。

これが私のコンピューターが実行しているサーバーです。

public static void main (String[] args) throws IOException
{
    ServerSocket server = new ServerSocket(31350);
    Socket client1 = server.accept();   
}

これが私の友人が彼のコンピューターで実行しているクライアントコードです

public static void main(String[] args) throws IOException, UnknownHostException
{
    Socket socket;

    //  #'s are what I got from whatismyip.org on the server computer)
    byte[] serverb = new byte[] {(byte)##, (byte)##, (byte)###, (byte)###};

    socket = new Socket(InetAddress.getByAddress(serverb),31350);
}

これは私がクライアントを実行するときにそれが言うことです

スレッド"main"の例外java.net.ConnectException:接続がタイムアウトしました:java.net.DualStackPlainSocketImpl.connect0(ネイティブメソッド)at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:69)atjava.net.AbstractPlainSocketImpl .doConnect(AbstractPlainSocketImpl.java:339)at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)at java.net.PlainSocketImpl.connect( java:157)at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391)at java.net.Socket.connect(Socket.java:579)at java.net.Socket.connect(Socket.java:528)at java.net.Socket。(Socket.java:425)at java.net.Socket。(Socket.java:241)at ClientTest.main(ClientTest.java:22)//22は行socket= new Socket(InetAddress.getByAddress(serverb)、31350);です。

ファイアウォールが無効になっています。ルーターのポート31350は、cmdでipconfigを使用して取得したコンピューターのローカルIPアドレスに転送されます。しかし、それでも機能しません。クライアントコンピューターからソケットを作成しようとすると、IOExceptionが発生します。サーバーコンピュータでは何も起こりません。どうしたの?

4

1 に答える 1

3

[アップデート]

ご想像のとおり、接続がタイムアウトした場合は、何らかのネットワークの問題があることを示しています。クライアントからのパケットがサーバーマシンに到着していません。正確な解決策はルーターの種類によって異なりますが、グーグルで検索する用語は「ポートフォワーディング」です。これが私がランダムに見つけた役立つかもしれない記事です:http ://www.rhinosoft.com/KnowledgeBase/kbarticle.asp?RefNo = 1289

基本的には、ポート31350での接続要求が、ローカルIPアドレスのLAN上のコンピューターに転送されるようにルーターをプログラムします。

幸運を!

【元のコメント】

これは答えというよりはコメントです(しかし、私は余分な部屋が必要でした)。トライキャッチロジックを使用すると、問題の診断がはるかに困難になります。次のようにコードを簡略化します。

public static void main(String[] args) throws IOException, UnknownHostException
{
    Socket socket;

            //  #'s are what I got from whatismyip.org on the server computer)
    byte[] serverb = new byte[] {(byte)##, (byte)##, (byte)###, (byte)###};

    socket = new Socket(InetAddress.getByAddress(serverb),31350);
}

元のIOExceptionを伝播させて質問を更新し、例外スタックトレースを含めます。元の例外には貴重な情報が含まれています-接続が拒否されたと表示されている場合、それは1つのことを意味します-おそらくポート番号が正しくありません。接続がタイムアウトしたと表示されている場合は、別の意味があります。ファイアウォールに本当に問題があるか、IPアドレスが間違っている可能性があります。

あなたのコードは有用な例外をキャッチし、それを飲み込み、はるかに有用性の低い例外をスローしています。

サーバーコードに対して同じことを行います。

public static void main (String[] args) throws IOException
{
    ServerSocket server = new ServerSocket(31350);
    Socket client1 = client1 = server.accept();
}

スタックトレースは、どのメソッドが例外をスローしたかを示すので、次のような冗長なテキストは必要ありません。InetAddress creation failed

于 2012-11-09T23:49:24.233 に答える