0

ここで苦戦…

オブジェクトを使用して、データが TCP ソケット経由でサーバーに正常に送信されたかどうかを判断しようとしていOutputStreamます。エミュレータ ソケット通信でのテストでは、30 秒後に通信が失われます。書き込みデータの場合OutputStream.write();、例外はスローされず、継続的に実行されているローカル サーバーはクラッシュせず、しばらくすると tcp ソケット接続のみが失われます。ソケット クラスのすべてのメソッドは、ソケットがアクティブで機能しているかのように戻ります。ここで私が間違っていることはありますか?ストリーム/ソケットが実際にバッファ内のデータを送信しない場合に、例外またはエラーを取得するために使用できるソケット実装またはストリーム実装はありますか? またsetSoTimeout()、ソケットの設定は何もしていないようです。

私を案内してください...

これが私のコードです:

private void sendRec() {
    int lstream;
    int port = 1012;
    byte[] byterecv = new byte[1040];

    while (true) {
        System.out.println("POOL-2");
        synchronized (recSendThread) {
            try {
                recSendThread.wait(20);
            } catch (InterruptedException e) {
            }
        }

        if (stopcall == true) {
            // break;
        }

        try {
            // Provides a client-side TCP socket
            Socket clientRec = new Socket();

            // serverSocket = new ServerSocket(port);
            // serverSocket.setSoTimeout(5000);

            // Connects this socket to the given remote host address and
            // port
            clientRec.connect(new InetSocketAddress("192.168.1.36", port));

            System.out.println("Just connected to "
                    + clientRec.getRemoteSocketAddress());
            System.out.println("SENTS Rec BEFORE");

            // output streams that write data to the network
            OutputStream outToServerRec = clientRec.getOutputStream();
            DataOutputStream outStreamRec = new DataOutputStream(
                    outToServerRec);

            outStreamRec.write(bData);
            System.out.println("SENTS Rec AFTER");

            // input streams that read data from network
            InputStream inFromServerRec = clientRec.getInputStream();
            // clientRec.setSoTimeout(5000);
            DataInputStream inStreamRec = new DataInputStream(
                    inFromServerRec);
            while ((lstream = inStreamRec.read(byterecv)) != -1) {
                System.out.println("startrec bytearray -- "
                        + byterecv.length);
                bos1.write(byterecv, 0, lstream);
            }

            inStreamRec.close();// for closing dataouputstream
            clientRec.close();// for closing socket connection
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}





Here is my receiver and player code..



  /**
   * start receiving the voice data from server
   * */
       protected void startplay() {
    System.arraycopy(frndid, 0, playByteData, 0, 4);
    System.arraycopy(userid, 0, playByteData, 4, 4);

        ByteBuffer.wrap(sessionid).order(ByteOrder.LITTLE_ENDIAN).asIntBuffer().
            put(call_sessionid);
    System.arraycopy(sessionid, 0, playByteData, 8, 4);
    int lstream;
    int port = 1014;
    while (true) {
        System.out.println("POOL-3");
        try {
            if (stopcall == true) {
                System.out.println("BREAKEDDDD1111");
                //break;
            }
            // Host name
            // port++;
            InetAddress addressPlay = InetAddress.getByName("192.168.1.36");
            // Creates a new streaming socket connected to the target host
            Socket clientPlay = new Socket(addressPlay, port);
            System.out.println("Just connected to play : " + 
                                                clientPlay.getRemoteSocketAddress());
            System.out.println("SENTS Play BEFORE");

            // output streams that write data

            OutputStream outToServer = clientPlay.getOutputStream();
            DataOutputStream outStreamPlay = new DataOutputStream(outToServer);
            outStreamPlay.write(playByteData);


            System.out.println("SENTS Play after");

            // input streams that read data
            InputStream inFromServerPlay = clientPlay.getInputStream();
            DataInputStream inStreamPlay = new DataInputStream(inFromServerPlay);
            //clientPlay.setSoTimeout(5000);
            while ((lstream = inStreamPlay.read(byteArray)) != -1) {
                System.out.println("startplay() bytearray -- " + 
                                                          byteArray.length);
                bos.write(byteArray, 0, lstream);
            }

            inStreamPlay.close();
            clientPlay.close();// for closing play socket connection

            responseBuffer = bos.toByteArray();
            System.out.println("BAOSSIZE " + bos.size());
            bos.reset();
            bos.flush();
            bos.close();
            playing = true;
            System.out.println("res length -- " + responseBuffer.length);
            rcvbb=ByteBuffer.wrap(responseBuffer).order(ByteOrder.LITTLE_ENDIAN).
                                                    asShortBuffer().get(playShortData);

              playVoiceReceived();// plays received data

            } catch (ParseException e) {
            e.printStackTrace();
            } catch (IOException e) {
            e.printStackTrace();
        }
    }
    }

  /**
   * start playing received the voice data from server
    * */
     public void playVoiceReceived() {

    System.out.println("POOL-4");
      try {
        if (at != null) {
            if (at.getPlayState() != AudioTrack.PLAYSTATE_PLAYING) {
                at.play();// starts playing
            } else {
                System.out.println("Play BEFORE WRITE");
                // Writes the audio data to the audio hardware for playback.
                at.write(playShortData, 0, BufferElements2Play);
                System.out.println("Play AFTER WRITE");
                at.flush();
            }
        }
          } catch (Exception e) {
        e.printStackTrace();
      }
    }
4

2 に答える 2

0

ソケットデータを送信しました...ローカルソケット送信バッファに。その後何が起こるかは、ローカル TCP スタック、ネットワーク、リモート TCP スタック、およびリモート アプリケーション次第です。リモート アプリケーションがデータを取得したかどうかを知りたい場合は、応答を送信する必要があります。

于 2013-03-07T04:55:30.640 に答える
0

オペレーターwriteは、データが配信されたかどうかを確認しません。そうしないと、長時間待機する必要があるためです。ネットワーク接続が実際にダウンしている場合、オペレーティング システムの TCP 層はとにかくデータを送信しようとしますが、反対側から確認メッセージを受信しないため、問題を検出するのは少し遅れます (1 分後など)。その後、データの再送信を数回試行し、問題が解決しないことを確認してから、ソケットで例外状態を報告します。ソケットが例外状態にあることを知るには、ソケットに対して何らかの演算子を実行する必要があります。つまり、別の書き込み試行です。次のようなループで write を実行してみてください。

while (真) { outStreamRec.write (データ); Thread.sleep (1000L); }

ネットワークがダウンしてから約 2 分後にエラーが発生するはずです。

なお、操作とは逆にwrite操作connectは同期なので、実際には反対側からの応答を待ち、応答がなければ例外をスローします。

于 2013-03-07T04:55:49.360 に答える