我正在写一个Java套接字程序从服务器读取数据,我没有控制,服务器,下面是约定的协议,如何写字节服务器套接字
- 2个字节:幻数
- 2个字节:数据长度
- N-二字节:ASCII字符串数据有效载荷
- 大端的幻数和数据长度
例如:如果我的重新任务是“命令/ 1/getuserlist”如何构建协议上面的请求匹配和读取响应返回列表
我是新来的套接字编程,并不知道如何构建我的请求并阅读回应。
可以有人指导我如何建立请求和读
我正在写一个Java套接字程序从服务器读取数据,我没有控制,服务器,下面是约定的协议,如何写字节服务器套接字
例如:如果我的重新任务是“命令/ 1/getuserlist”如何构建协议上面的请求匹配和读取响应返回列表
我是新来的套接字编程,并不知道如何构建我的请求并阅读回应。
可以有人指导我如何建立请求和读
响应据你必须建立形以下列方式
| 2 | 2 | N ........ |
包规格现在,这可能是很容易的,有多种方法可以做到这一点,我建议你一个:
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
static byte[] buildPacket(int magicNumber, String payload) throws UnsupportedEncodingException
{
// 4 bytes for header + payload
ByteBuffer buffer = ByteBuffer.allocate(2 + 2 + payload.length());
// we set that we want big endian numbers
buffer.order(ByteOrder.BIG_ENDIAN);
buffer.putShort((short)magicNumber);
buffer.putShort((short)payload.length());
buffer.put(payload.getBytes("US-ASCII"));
return buffer.array();
}
public static void main (String[] args) throws java.lang.Exception
{
try
{
byte[] bytes = buildPacket(0xFF10, "foobar");
for (byte b : bytes)
System.out.printf("0x%02X ", b);
}
catch (Exception e)
{
e.printStackTrace();
}
}
记住,如果你声明的方法接受一个short
幻数直接,因为short
是用Java签名的,所以您将无法传递一个文字幻数> 32767
。
围绕`Socket.getOutputStream()`使用围绕BufferedOutputStream
的DataOutputStream
。然后你可以使用:
writeShort()
的幻数writeShort()
为有效载荷长度字write()
。同样,您可以使用DataInputStream
和相应的readXXX()
方法来读取响应。
注意您正在此处写入套接字,而不是服务器套接字。
小心大坏消息!
DataxxxStream - 尽管它非常方便 - 不提供对小端和大端数字以及任意字符串编码的全面支持。
这个问题明确指定了big-endian字节顺序。 – EJP
EJP,我尊重你的答案。我想知道为什么你忽略那些DataXxxxStream *不是*解决方案的边缘情况,比如小端数据和两个单独问题中的非utf8字符串编码? –
杰克,我怎么能读取顺序相同的反应如何? – Sam
检查'ByteBuffer'文件,这里有你需要的一切:https://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html – Jack