问题:
通过Socket,服务端向客户端发送数据时,客户端一直接收不到
服务端发送代码:
ClientWriteHandler.this.printStream.print(msg);
原因:
在socket代码中使用print方法时,要想将数据发送出去,必须在发送的数据后面添加”\n”换行符标识并且调用flush()方法。
printwriter如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。这些方法使用平台自有的行分隔符概念,而不是换行符。
此外,在println中,已经调用过flush()方法,源代码如下:
public void println() {
newLine();
}
private void newLine() {
try {
synchronized (lock) {
ensureOpen();
out.write(lineSeparator);
if (autoFlush)//这里就调用了flush()方法
out.flush();
}
}catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}catch (IOException x) {
trouble = true;
}
}
在print中则没有,源代码如下:
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
}
解决办法:
1、使用print()方法时在发送的数据后加换行符"\n"并调用flush()方法
ClientWriteHandler.this.printStream.print(msg+"\n");
ClientWriteHandler.this.printStream.flush();
2、直接调用println()方法
ClientWriteHandler.this.printStream.println(msg);