2014-12-06 40 views
1

我创建一个Java接口和C服务器的论坛。插座(C/JAVA)的BufferedReader的readLine()不停止

我有麻烦,从C到Java的消息发送....

我创建了一个插座(名为“插座”)这样的作品,这样的:

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服务器。

这里是服务器如何通过Socket发送消息:

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

我不知道如何获得这个“0”,而无需关闭服务器。有任何想法吗 ?

回答

0

的readLine()读取了发送数据,但块,直到一个换行符或回车读取
如果您的客户端看到的数据仅当您关闭服务器,比你的服务器永远不会发送一个换行符或回车。
假设,要通过线路发送一个文件行客户端(例如在Java中,这是我的主要语言):

​​

正如你所看到的,服务器不发送一个换行符或回车。这些被readLine()删除!
因此,的readLine()在你的客户方阻止,直至插槽将关闭。

如果改变这种方式,写指令:

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

你的客户能够读取行,即使服务器仍在编写以下行。

0

你循环,直到readLine()回报null或空行。

它在流的末尾返回null。当你从套接字中读取数据时,只有当对端关闭连接时才会发生。

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

ergo对等体既不关闭连接也不发送空行。

+0

好了,所以我就必须向另一个写一个空行? – user3749056 2014-12-06 11:45:57

+0

即使我这样做((str = br.readLine())!=“0”)它不起作用... – user3749056 2014-12-06 12:44:38