Java ソケットを使用して、同じアプリと通信する 2 つの Android デバイスを作成しています。通信プロトコルは次のとおりです。
1. client sends packet size S
2. client sends byte array with size S
私はDataOutputStream
andwriteInt()
を使用して、サイズをストリームの生の値として書き込みます。次に、サーバーはこの値を読み取りDataInputStream
ますreadInt()
。問題はreadInt()
、最初のパケットに対してのみ正しい値を読み取ることです。2 回目は、このメソッドが random を返しますint
。
関連するコード スニペット:
クライアント側: このメソッドは、サーバーとの有効な TCP 接続の上で呼び出されます
public void write(byte[] packet)
{
try
{
dataOutputStream.writeInt(packet.length);
dataOutputStream.flush();
dataOutputStream.write(packet);
dataOutputStream.flush();
}
catch (IOException e)
{
Log.e(ERROR_TAG, "write() failed", e);
}
}
サーバー側: これはデータを読み取るループです
...
int readBytes = 0;
int packetSize = 0;
while (true) {
byte[] buffer = new byte[NET_BUFF_SIZE];
try // first it reads the packet size from packet header
{
packetSize = dataInputStream.readInt();
} catch (IOException e) {
Log.e(ERROR_TAG, "readInt() failed", e);
return;
}
while (readBytes < packetSize) {
try {
int readResult = dataInputStream.read(buffer);
if (readResult != -1) {
readBytes += readResult;
} else {
break;
}
} catch (IOException e) {
Log.e(ERROR_TAG, "read() failed", e);
break;
}
}
}
そのため、クライアントがwrite()
2 番目のパケットを送信するために呼び出すと、サーバーはストリームから間違ったサイズを読み取ります。
DataOutputStream
次のようにDataInputStream
初期化されます。
// Server
inputStream = clientSocket.getInputStream();
dataInputStream = new DataInputStream(inputStream);
// Client
outputStream = socket.getOutputStream();
dataOutputStream = new DataOutputStream(outputStream);
私は何が欠けていますか?