gpt4 book ai didi

java - 从尚未关闭的服务器套接字读取所有字符串

转载 作者:太空宇宙 更新时间:2023-11-04 12:51:27 24 4
gpt4 key购买 nike

我在 Java 中进行套接字编程时遇到问题。有一个像这样用 python 编写的服务器,我不应该改变它。

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send('from server\nnewline\0')
data = s.recv(BUFFER_SIZE)
s.close()

现在我想用 Java 编写一段代码,从服务器读取字符串。像这样的事情:

public static String readStr(Socket client) throws IOException {
InputStreamReader inStream = new InputStreamReader(
client.getInputStream());
BufferedReader inBuff = new BufferedReader(inStream);
String answer = new String();
String str = inBuff.readLine();
while (str!=null) {
answer = answer.concat(str + "\n");
str = inBuff.readLine();
}
answer = answer.substring(0, answer.length() - 1);
System.out.println("answer:\n "+answer);
return answer;
}

但它似乎在消息最后一行的 str = inBuff.readLine(); 行处阻塞。我尝试了 read() 方法,但它也被阻止了。

最佳答案

在设计 TCP 协议(protocol)时,最好的方法是包含某种成帧器。在当前协议(protocol)中,这是通过使用 NUL 字节来完成的。

当从socket读取数据时,首先应该通过一些操作将其分成 block /帧,然后再解析各个 block 。

将数据包分成 block 的一种粗略方法是读取,直到找到 NUL 字节,然后将该 block 作为字节数组返回。 (这不是最有效的实现)

public byte[] readPacket(InputStream in) throws IOException {
ByteArrayOutputStream tempStr = new ByteArrayOutputStream();
int read;
read=in.read();
while(read > 0){
tempStr.write(read);
read=in.read();
}
if(read == -1)
throw new EOFException();
return tempStr.toByteArray();
}

因为您现在拥有适合数据的框架,所以您现在可以轻松读取数据:

byte[] frame = readPacket(in);
String[] lines = new String(frame, StandardCharsets.UTF8).split("\n");
// Do something with the lines

关于java - 从尚未关闭的服务器套接字读取所有字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35790516/

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