【发布时间】:2013-11-08 12:41:24
【问题描述】:
我正在使用 Java 套接字使两个 android 设备与同一个应用程序进行通信。通讯协议为:
1. client sends packet size S
2. client sends byte array with size S
我正在使用DataOutputStream 和writeInt() 将大小作为原始值写入流。然后服务器读取DataInputStream 和readInt() 的这个值。
问题是readInt() 仅读取第一个数据包的正确值。该方法第二次返回一个随机的int。
相关代码sn-ps:
客户端:此方法在与服务器的有效 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() 发送第二个数据包时,服务器从流中读取了错误的大小。
DataOutputStream和DataInputStream是这样初始化的:
// Server
inputStream = clientSocket.getInputStream();
dataInputStream = new DataInputStream(inputStream);
// Client
outputStream = socket.getOutputStream();
dataOutputStream = new DataOutputStream(outputStream);
我错过了什么?
【问题讨论】:
-
丢弃读取数据包的循环并使用 readFully()。
标签: java android sockets datainputstream