套接字(C / Java)BufferedReader readLine()不会停止

时间:2014-12-06 11:37:17

标签: java c sockets readline forum

我正在创建一个包含Java界面和C服务器的论坛。

我无法将消息从C发送到Java ....

我创建了一个套接字(名为" socket"),它的工作方式如下:

socket = new Socket(adr, port);
//adr and port are defined before

但是在Java上执行此操作时:

String str =null;
try {
    BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream()) );
    while ((str=br.readLine()) != null && str.length()>0)
    {
        System.out.println("str = " + str);
    }
        br.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

它无法从服务器接收消息。 它只会在我残酷地关闭C服务器时显示消息。

以下是服务器如何通过套接字发送消息:

write(client_sock,"0\0",strlen("0\0"));

我不知道怎么收到这个" 0"没有关闭服务器。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您正在循环,直到readLine()返回null或空行。

它在流末尾返回null。当您从套接字读取时,只有在对等方关闭连接时才会发生。

当输入包含空行时,它返回一个空行。

Ergo 对等方既没有关闭连接也没有发送空行。

答案 1 :(得分:0)

readLine()已读取发送数据,但阻塞直到读取换行符或回车符 如果客户端仅在关闭服务器时才查看数据,则服务器永远不会发送换行符或回车符。
假设您希望逐行向客户端发送文件(例如在java中,它是我的主要语言):

Socket client = server.accept();
OutputStream os = client.getOutputStream();

BufferedReader br = new BufferedReader( new InputStreamReader(Files.newInputStream(file.toPath())));
String str;
while ((str = br.readLine()) != null && str.length() > 0) {
     os.write((str).getBytes());
}
br.close();
os.close();

如您所见,服务器不发送换行符或回车符。这些被readLine()删除!
因此,客户端上的readLine()阻塞,直到套接字关闭。

如果以这种方式更改写入指令:

os.write((str+"\n").getBytes());

即使服务器仍在编写以下行,您的客户端也能读取这些行。