0

サーバークライアントアプリケーションを開発しています。サーバーはJava(PC)で実行され、クライアントはJavaで実行されます。(アンドロイド)

次の実装で問題が発生しています。

サーバーはビットマップを取得します->rawバイト->TCP->クライアント(非同期ストリーム

これで、バイト配列はクライアントで長さの異なる複数のパケットで配信されます。したがって、これを適切に処理するには、prefixメソッドを使用する必要があります。

プレフィックスモードを使用するには、メッセージの長さをバイト単位で4バイトとして送信してから、メッセージを送信する必要があります。

私のコード

public void sendScreenshot(byte[] buffer) throws IOException {
    OutputStream os = socket.getOutputStream();
    os.write(buffer.length + 1);
    os.write((byte) 0);
    os.write(buffer, 0, buffer.length);
    os.flush();
}

VB.netでは、これは次のコードで実現されます。

Private Sub dat(ByVal dat As String)
    Dim nstream As NetworkStream = sock.GetStream()
    Dim bit As Byte() = System.Text.Encoding.UTF8.GetBytes(dat)
    Dim bw As New BinaryWriter(sock.GetStream())
    bw.Write(bit.Length + 1)
    bw.Write((byte)command)
    bw.Write(bit, 0, bit.length)

End Sub

Javaでそれを実装する助けは大歓迎ですか?

4

1 に答える 1

3

を使用しDataOutputStreamます:

DataOutputStream out = new DataOutputStream(os);
out.writeInt(buffer.length + 1);
// This writes a single byte
out.write(0);
out.write(buffer);
out.flush();

これ.writeInt()はあなたが引用したテキストのこの部分から来ています:

メッセージの長さをバイト単位で4バイトとして送信する必要があります

これはを意味しintます。これにより、intがネットワーク順に書き込まれることに注意してください。これはあなたの抜粋では指定されていませんが、私はこれが期待されていることだと思います。

同様に、受信側では、を使用してDataInputStream、長さをintとして読み取り、次にペイロードを読み取ることができます。

于 2013-01-11T22:23:32.953 に答える