我有简单的 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);
我的问题是我不知道如何将“读取结束”从服务器发送到客户端。客户端在上次读取时冻结。我知道 methode
read()
返回带有接收字节数的整数,当没有任何内容可读时返回 -1,当缓冲区长度为零时返回 0。向客户端返回 -1 的唯一解决方案是关闭服务器端的套接字,但我不能使用它。我也试过以下: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);
任何人请帮助我在这里做错了什么?谢谢
如果你想通过同一个 TCP 套接字发送间歇性数据,你需要在你发送的数据中编码你发送的信息的边界。这方面的一个例子是发送带有长度前缀的数据“数据包”,这样数据包的接收者就会从套接字中读取与长度前缀相同的字节数。
你的读者有两个问题。您假设您将始终读取一个完整的缓冲区。除非您一次只读取一个字节,否则您不能假设这一点。您还假设您将始终读取整个多字节字符,除非您从不使用多字节字符,否则这不太可能是真的。
由于您正在编写文本,我建议您在消息之间发送新行并将流作为文本阅读。
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);
}
这将解码文本,读取整行并处理任何多字节字符。