我正在编写一个java套接字程序来从服务器读取数据,我无法控制服务器,下面是协议约定,
例如:如果我的请求是"命令/ 1 / getuserlist"如何构造上述协议的请求匹配并将响应读回List
我是套接字编程的新手,不知道如何构建我的请求并阅读回复。
有人可以指导我如何构建请求并从
中读取响应答案 0 :(得分:1)
根据规范,您必须构建一个以下列方式形成的数据包
| 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
幻数,则无法传递文字幻数> 32767
,因为short
是用Java签名的。
答案 1 :(得分:0)
在`Socket.getOutputStream()周围的DataOutputStream
周围使用BufferedOutputStream
。然后你可以使用:
writeShort()
表示幻数writeShort()
的长度字write()
表示有效负载。同样,您可以使用DataInputStream
和相应的readXXX()
方法来阅读回复。
注意:您正在此处写入套接字,而不是服务器套接字。
答案 2 :(得分:-1)
注意大的内涵!
DataxxxStream - 尽管它非常方便 - 不能完全支持小端和大端数字以及任意字符串编码。
上的帖子