我正在创建一个包含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"没有关闭服务器。有什么想法吗?
答案 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());
即使服务器仍在编写以下行,您的客户端也能读取这些行。