2

サーバーに書き込む(しようとする)次のコードがあります。

    String serverName = "w.x.y.z"; 
    int port = 3010;

    InetAddress inetAddress = InetAddress.getByName(serverName);

    Socket socket = new Socket(inetAddress, port);

    BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    bufferedWriter.write(transactionString);
    bufferedWriter.write(headerString);
    bufferedWriter.write(loginString);
    bufferedWriter.flush();

    String result = null;
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    StringBuilder sb = new StringBuilder();
    String str;
    while ((str = bufferedReader.readLine()) != null)
    {
        sb.append(str + "\n");
    }
    result = new String(sb);
    debug("done with reads");

    textArea.setText(new String(result));
}
catch (UnknownHostException e)
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}
catch (IOException e)
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}

リモートマシンのサーバーコードにブレークポイントがあり、この同じソケットを介して通信するVisualBasicプログラムがあります。Visual Basicコードを実行し、サーバーがそこにあり、このソケットをリッスンしていること、およびそのプログラムを実行することでブレークポイントに到達できることを(繰り返し)確認しました。

このプログラムを実行しても、ブレークポイントに到達しません。「newSocket()」だけでソケットをインスタンス化し、その後、setterメソッドでinetAddressとポート番号を設定するなど、ソケットの設定についてさまざまなことを試しました。BufferedWriterの代わりにOutputStreamWriterを使用しました。キープアライブをfalseに設定し、タイムアウトを15秒に設定してこれを試しました。サーバーがブレークポイントに到達する原因にはなりません。

次の出力が得られます。

java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)

そしてもちろん、さらに多くのstackTraceライン。

これはデータフォーマットの問題ではありません。サーバーがそのポートでメッセージを聞くとすぐに、それが有効かどうかを判断する前に、ブレークポイントに到達する必要があります。他のプログラムのこのポートとソケットで動作するため、サーバーの動作は問題ではありません。2つの間のアドレスとポート番号をトリプルチェックしました。そこには何の問題もないと思います。

それはいかなる種類の読書の問題でもありません。私が言ったように、メインフレームのブレークポイントはヒットしません。

getByName()の呼び出し後にブレークポイントを設定し、デバッガーでinetAddressを開き、IPアドレスを表す4バイトのintを見つけ、各16バイトを変換しました-ドメイン名から変換した後、同じIPアドレスを持っていますこれらすべてを実行しているマシンからサーバーにpingを実行することで取得します。

誰かが私が他にどこを見ればよいか提案できますか?

4

1 に答える 1

0

サーバーにSSLソケットが必要であることが判明しました。回答してくれた人たちに感謝します。

于 2012-05-05T21:20:56.970 に答える