gpt4 book ai didi

java - 在 Java 中读取 tcp 流的最有效方法

转载 作者:可可西里 更新时间:2023-11-01 02:45:55 24 4
gpt4 key购买 nike

我不得不修改一些客户端代码,因为没有正确定义通信协议(protocol)。

我假设来自服务器的 tcp 消息将在一个新行中终止,所以我使用 reader.readLine() 来读取我的数据。

现在我被告知情况并非如此,消息的前 4 个字符是消息长度,然后我必须阅读消息的其余部分。

执行此操作最有效、最明智的方法是什么?

我的大致思路如下:

  1. 创建一个 4 字符数组
  2. 读入前 4 个字符
  3. 确定消息的长度
  4. 创建一个新的消息长度数组
  5. 读入新数组。

下面是代码示例(reader 是在别处创建的 BufferedReader):

char[] chars = new char[4];
int charCount = reader.read(chars);
String messageLengthString = new String(chars);
int messageLength = Integer.parseInt(messageLengthString);
chars = new char[messageLength];
charCount = reader.read(chars);
if (charCount != messageLength)
{
// Something went wrong...
}

我知道该怎么做,但我是否需要担心字符缓冲区未被填充?如果是这样,我应该如何处理这种情况?

最佳答案

Java 中的字符用于文本 数据。您确定协议(protocol)真的以这种方式定义了消息的长度吗?更有可能是表示 32 位长度的前四个字节

如果您正在与 C 或 C++ 开发人员交谈,他们可能会使用“char”作为“byte”的同义词。

编辑:好的,基于评论:

我会创建一个方法,它接受一个 Reader 和一个计数,并重复调用 read() 直到它读取了正确数量的数据,或者抛出异常。像这样:

public static String readFully(Reader reader, int length) throws IOException
{
char[] buffer = new char[length];
int totalRead = 0;
while (totalRead < length)
{
int read = reader.read(buffer, totalRead, length-totalRead);
if (read == -1)
{
throw new IOException("Insufficient data");
}
totalRead += read;
}
return new String(buffer);
}

那么你的代码可以是:

String lengthText = readFully(reader, 4);
int length = Integer.parseInt(lengthText);
String data = readFully(reader, length);
// Use data now

你应该检查当他们想要发送少于 1000 个(或多于 9999 个)字符时会发生什么......

关于java - 在 Java 中读取 tcp 流的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/833744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com