我使用SSLStream类实现协议。我开始阅读这样的消息(在消息中接收ASCII字符):
byte [] buffer = new byte[2048];
StringBuilder messageData = new StringBuilder();
int bytes = -1;
do
{
// Read the client's test message.
bytes = sslStream.Read(buffer, 0, buffer.Length);
// Use Decoder class to convert from bytes to UTF8
// in case a character spans two buffers.
Decoder decoder = Encoding.UTF8.GetDecoder();
char[] chars = new char[decoder.GetCharCount(buffer,0,bytes)];
decoder.GetChars(buffer, 0, bytes, chars,0);
messageData.Append (chars);
// Check for EOF or an empty message.
if (messageData.ToString().IndexOf("<EOF>") != -1)
{
break;
}
} while (bytes !=0);
但是,现在协议已更改,我不需要搜索消息结束,但我需要先读取消息长度(以字符数表示),然后以接收到的长度读取消息。我怎么能这样做?
答案 0 :(得分:0)
您必须使用TLV(类型长度值)格式,或者只使用LV。 使用前两个字节的长度,这给出了一个短的int的大小,我想这对你的练习来说已经足够了,但如果需要你可以使用更多的字节。所以总是读2字节。收到2个字节后,您将获得该数字(例如,它以二进制格式发送),并且您读取指定数量的八位字节/字节或字符。注意结束,肯定是小端。在此链接中,您可以在我的回复中看到我如何为Java执行此操作:How to read all of Inputstream in Server Socket JAVA