0

Socket programming最近拾ったでこの奇妙な問題が発生しています。clientがと通信するために Socket を使用できることを理解していhostます。このプロジェクトISO8583にも必要です。私はすでに動作するコードを取得しており、独自のテスト ホストで動作するように変更しています。

すべてが順調で、私のコードは実際に動作しますが、私が直面した 1 つの問題は、まったく応答がないことでした。私のコンピューターからホストに送信された要求は機能します。ホストは正しいメッセージを表示し、応答を私のコンピューターに送り返します。しかし、その時点でアプリがハングする理由はわかりません。デバッグモードでも、値を返すことなく、行 (実行中の行を示します) を継続的に実行しています。これは以下の私のコードです。非常に面倒で、応答値を取得するために多くの方法を試しています。

byte dataSmall[] = {0x00, 0x43, 0x60, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, (byte) 0xC0, 
            0x00, 0x00, 99, 0x00, 0x00, 0x00, 0x02, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 
            0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31};

    try {
        Socket echoSocket = new Socket("IP Address", port number);
        ObjectOutputStream os = new ObjectOutputStream(echoSocket.getOutputStream());
         String responseLine;
         Client client = new Client(echoSocket);
        Thread reader = new Thread(client, "j8583-client");
        PrintWriter pw = new PrintWriter(os, true);


            reader.start();
            os.writeObject(dataSmall);
            os.flush();

            ObjectInputStream ois = new ObjectInputStream(echoSocket.getInputStream());
            //convert ObjectInputStream object to String
            String message = (String) ois.readObject(); // this is the continuous execution
            System.out.println(message);

            System.out.println("waiting for response");
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    echoSocket.getInputStream()));
            responseLine = in.readLine().toCharArray().toString();

            System.out.println("still waiting for response");
            System.out.println(responseLine);
        os.close();
        in.close();
        echoSocket.close();
        client.stop();
        reader.interrupt();

私は.readObject().readLine () を試して、うまくいけば応答出力を取得し、両方とも同じ問題を実行しました。終わりのない実行。残念ながら、私はこれにどのようにアプローチすべきかについてのアイデアがありません。テスト ホストから応答を受け取ることは非常に重要です。だから私はあなたたちが与えることができるどんな助けにも感謝します. 前もって感謝します。

4

3 に答える 3

1

話しているサーバーが Java で書かれていないか、オブジェクトのシリアル化を使用していない場合、このコードは機能しない可能性があります。ここでオブジェクト ストリームを使用する理由はわかりません。実際のソケット ストリームで試してみてください。

于 2013-05-03T11:01:36.460 に答える
1

ISO8583 メッセージングは​​通常非同期モードで行われ、ISO メッセージを読み書きする方法は、16 ビットの符号なし整数としてエンコードされたメッセージの長さを最初に置くことです。

したがって、最初に ISO メッセージをバイト バッファーに入れ、それを測定し、その長さを書き込み、次にメッセージを書き込む (そしてストリームをフラッシュする) 必要があります。

応答を読み取るには、まず 2 バイトを読み取り、それらを 16 ビットの符号なし整数として解釈してから、そのサイズのバッファーを作成し、メッセージの残りを読み取ります。応答を継続的に読み取り、解析と処理のために他のワーカーに渡すには、専用のスレッドが必要です。

于 2015-11-04T16:56:02.043 に答える
-2

同じコードが別のホストでは機能し、自分のホストでは機能しない場合は、ポートの競合を探す必要があるかもしれません。クライアント接続が作成されるたびに、クライアントと通信するためにサーバー上で任意のポートが開かれます。ファイアウォール/ウイルス対策がブロックしている可能性があるため、応答を返すことができません。

于 2013-05-03T10:53:28.273 に答える