我试图通过套接字连接的C应用程序,期望某个头和数据体,但是,当我试图遵守该格式时出现一堆问题,它应该是这样的:JAVA - 使用自定义套接字协议
头:
- 2个字节的数据包开始。
- 4个字节,表示数据包大小加头。
- 数据包类型为1个字节。
正文:
- 4个字节表示params的数量。
每个参数的以下一个块:
- 参数经度的4个字节。
- 消息内容的X字节。
- 1个字节用于转义字符。
这里是服务器期待的示例:
[%%] [13 00 00 00] [0] [12 00 00 00] [0B 00 00 00] [OPERATIONPERFORMED \ 0]
我遇到的问题是,尝试通过PrintWriter的发送信息时,另一端是获得十六进制值作为ASCII字符,而不是实际值。 我已经尝试过使用ByteBuffer,DataOutputStream和几个选项,但它们仍然以这种格式出现,甚至更加怪异。
从我正在调查它似乎倒序,所以他们得到正确的字节,但在错误的顺序。
现在我想实现如下:
DataOutputStream stream = new DataOutputStream(socket.getOutputStream());
PrintWriter writer = new PrintWriter(socket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// Header
stream.writeChar(37);
stream.writeChar(37);
stream.writeInt(26);
stream.writeChar('\\0');
stream.writeInt(1);
stream.writeInt(11);
stream.writeUTF("SET_PROBLE\\0");
stream.flush();
StringBuilder sb = new StringBuilder();
boolean state = true;
while (state) {
if (in.ready()) {
sb.append((char) in.read());
}
else {
if (sb.length() > 0) {
state = false;
}
}
}
System.out.println(sb.toString().trim());
}
你能帮助我吗?
非常感谢!
请包括代码的关键部分 – amphibient
您应该使用发送* bytes *的原始'OutputStream',而不是字符或序列化对象。 –
听起来好像有人正在使用“文本”编辑器:)使用像wireshark这样的工具来查看单线数据,以确保有关发送内容的假设是正确的。 – 2012-10-26 18:50:23