我在我的程序中的服务器上犹豫不决,当cleint发送消息时,我首先发送一个1字节的ACK,其中1个字节是我收到的msgType。
我的程序执行流程如下:
Socket connection = null;
connection = serverSocket.accept();
connection.setKeepAlive(true);
logger.info("server: connection received from " + connection.getInetAddress().getHostName());
out = new ObjectOutputStream(connection.getOutputStream());
.
.
switch(msgType) {
case 0:
// MSG_START
logger.info("Received MSG_START");
// send ACK
sendACK(out, 0);
logger.info("sent ACK for MSG_START");
break;
.
}
Then I have definition of sendAck function:
private static void sendACK(ObjectOutputStream out, int msgIntType) throws IOException {
// TODO Auto-generated method stub
byte[] msgType = new byte[1];
msgType[0] = (byte) (msgIntType & 0xFF);
logger.debug("Sending message to client: " + msgType.toString());
out.write(msgType);
out.flush();
logger.debug("Sending msg: " + Arrays.toString(msgType));
}
现在的问题是,在客户端,当客户端尝试in.read()时,它将byteRead设为-1而不是1。
这可能是什么问题?
提前致谢, -JJ
答案 0 :(得分:1)
尽管你的录取率......
您正在使用ObjectOutputStream发送确认,但此类型的流使用Java Serialization specification中所述的特殊协议。此类协议受制于实际有效载荷之前发送的某些标头。
因此,最好是使用其他不受这些装饰影响的流。
答案 1 :(得分:1)
ObjectOutputStream用于将Java对象写入流。在这种情况下,我认为您应该使用DataOutputStream(客户端也应如此)。
您可以这样做:
dataOutputStream.writeByte(0);
编辑:顺便说一下,客户端应该使用DataInputStream。