【问题标题】:read socket in loop循环读取套接字
【发布时间】:2017-01-14 06:51:49
【问题描述】:

我正在编写套接字客户端-服务器程序。客户端在java中,服务器在C中。 我想从服务器中的文件中读取并逐行写入客户端。 客户端片段:

while(!(answer = input.readLine()).equals("end")) {
        System.out.println(answer);
    }

服务器:

char* line;
size_t len = 0;
ssize_t read;
FILE* out;
while((read = getline(&line, &len, out))!=-1){
    write(fd, line, read);
}
write(fd, "end", 3);

我从文件中输出每个人的行,但它永远不会从循环中消失。
我想做什么?
当客户端连接服务器读取行时,将其写入客户端,现在客户端可以向文件添加新行(其他客户端将读取)

有谁知道我该如何解决?

【问题讨论】:

    标签: java c sockets network-programming


    【解决方案1】:

    C read() 在流结束时返回零,而您并未对其进行测试。

    Java readLine() 在流结束时返回 null,您也没有对此进行测试。

    【讨论】:

    • 但我不会结束流。我想从文件中读取数据并做其他事情
    • 我正在尝试通过 write(fd, "end", 3);但它不起作用。在服务器循环结束但在客户端我无法读取“结束”
    • 你想从文件中读取数据并在流结束时停止这样做,我已经告诉你如何做到这一点。您无法在客户端中读取“结束”,因为您从未发送过它,因为您永远不会退出文件读取循环,原因我也给了您。之后没有什么能阻止你做其他事情。
    • 当我更改为 while((answer = input.readLine())!=null) 和 while((read = getline(&line, &len, out))!=0) 我得到无限循环.我不想关闭连接描述符,并且 input.readLine()!=null 将仅在连接关闭时出现。我在服务器循环中退出,但我无法在客户端中获取它
    • 我没有告诉你以这种特定方式更改readLine() 循环。我确实说过你必须检查 null,所以你这样做了,但是没有什么能阻止你在 "end" 处退出该循环。注意 read() 循环应该是 while ... > 0 以便在流结束和错误时停止,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多