Android套接字仅在关闭时发送

时间:2013-12-05 15:49:20

标签: java android sockets

我有这个用于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才能发送消息......有什么想法吗?

2 个答案:

答案 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的唯一原因。