有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何确定读取结束

我有简单的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的唯一解决方案是关闭服务器端的socket,但我不能使用它。我还尝试了以下内容:
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);  

谁能帮帮我我做错了什么?谢谢


共 (1) 个答案

  1. # 1 楼答案

    你的读者有两个问题。您假设总是读取一个完整的缓冲区。除非一次只读取一个字节,否则不能假设这一点。您还假设您将始终读取整个多字节字符,这不太可能是真的,除非您从未使用多字节字符

    既然你在写文本,我建议你在消息之间发送新行,并以文本的形式阅读流

    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);
    }
    

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