我有这个用于android的小应用程序,我使用套接字连接到我的服务器。但是当我尝试将字符串从客户端发送到服务器时,它只发送字符串,当我在写入PrintWriter.println(“message”)和PrintWriter.flush()后关闭套接字...
pw.println("user$" + user.getUserName() + "/" + user.getEmail() + "/" + user.getPassword());
pw.flush();
sock.close(); //Without this it doesn't work!
服务器端我有这个代码:
String message;
while((message = br.readLine()) != null) {
System.out.println("Message:" + message);
}
我已尝试过所有内容,我在邮件中添加了'\ n',我使用了BufferedWrite等等,但没有任何效果......
编辑:我没有完全关闭Socket,我只能调用sock.shutdownOutput()......但这当然也是一个问题......编辑2:我正在使用Nexus 7,这是一个真正的设备,如果有帮助的话。
好吧,这似乎是一个普遍的问题......我做了一个非常简单的例子(不是android),但它仍然无效。它只是在我使用localhost时才有效,但是一旦我使用我的IP地址,我就必须关闭OutputStream才能发送消息......有什么想法吗?
答案 0 :(得分:1)
您的服务器读取完整行(reader.readLine()
),必须以“\r
”,“\n
”或两者(“\r\n
”)终止。但是您的客户端从不写任何这些行终止字符(writer.write("Hello")
仅写入字符Hello
而已。)
因此,当您关闭客户端上的套接字时,服务器上的套接字 - InputStream
也会关闭,并导致readLine()
调用将所有字符数据作为一行返回。 (然后,对readLine()
的下一次调用将返回null
,因为该流已经关闭。)
(我认为这正是@EJP在他/她的回答中的意思!)
解决方案:每当一行完成时调用writer.newLine()
,或将其包装到PrintWriter
而不是BufferedWriter
。然后,您可以使用众多println(...)
方法之一。
答案 1 :(得分:0)
如果你调用了println()和flush(),readline()将返回一行。但是,在关闭套接字之前, loop 不会退出,因为这是导致readLine()返回null的唯一原因。