java 如何确定读取结束

wqnecbli  于 2023-03-28  发布在  Java
关注(0)|答案(2)|浏览(190)

我有简单的C服务器和Java客户端。我从服务器向客户端逐行发送文本文件:

do {
        send(sockfd, line, strlen(line), 0);
        printf("%s\n", line);
    } while ((fgets(line, 100, fp)) != NULL);

并在Java客户端中读取它:

Client.getCl().getInputStream().read(inmsg);
    do{             
         decoded = new String(inmsg, "UTF-8");
         System.out.println(decoded);
    }while(Client.getCl().getInputStream().read(inmsg) > 0);

我的问题是,我不知道如何从服务器发送“读取结束”到客户端。客户端在最后一次读取时冻结。我知道方法read()返回接收字节数的整数,当没有任何内容可读取时返回-1,当缓冲区长度为零时返回0。唯一的解决方案是关闭服务器端的套接字,但我不能用它。我也试过以下方法:
1)在发送方法的末尾发送0长度,以告诉客户端,该长度为零:

send(sockfd, NULL, NULL, 0);

2)定义标志并发送:

#define MSG_FIN 0x200
#define MSG_EOR 0x0080

再次使用两个标志:

send(sockfd, NULL, NULL, MSG_FIN);
 send(sockfd, NULL, NULL, MSG_EOR);

有没有人帮帮我,我做错了什么?谢谢

efzxgjgh

efzxgjgh1#

如果你想在同一个TCP套接字上发送间歇性的数据,你需要在你发送的数据中对你发送的信息的边界进行编码。一个例子是发送带有长度前缀的数据“包”,这样一个包的接收者将从套接字上读取长度前缀所表示的字节数。

vuktfyat

vuktfyat2#

你的阅读器有两个问题。你假设你总是读满缓冲区。除非你一次只读一个字节,否则你不能这样假设。你还假设你总是读整个多字节字符,这不太可能是真的,除非你从不使用多字节字符。
由于您正在编写文本,我建议您在消息之间发送新行,并将流作为文本读取。

BufferedReader br = new BufferedReader(new InputStreamReader(
                        Client.getCl().getInputStream(), "UTF-8"));
for(String line; (line = br.readLine()) != null; ) {
    // process a whole line of text at once. e.g.
    System.out.println(line);
}

这将解码文本,读取整行并处理任何多字节字符。

相关问题