Java Socket输出流print方法失效:为何与println表现不同?
为什么PrintWriter的print方法无法替代println实现Socket通信?
换行符是客户端读取的触发条件
你的客户端应该是用BufferedReader.readLine()这类按行读取的方法,这类方法必须等到输入流中出现**换行符(\n)**才会返回读取到的内容。println()方法会自动在输出内容末尾添加换行符,客户端读到换行符就会处理消息;而print()只写入内容,不会加换行,客户端会一直阻塞在读取操作上,看起来就是无法接收消息。缓冲区刷新机制差异
PrintWriter默认带有缓冲区,println()在创建时如果开启了autoFlush=true(通常Socket场景会这么设置),会在每次调用时自动刷新缓冲区,把内容立刻发送到Socket输出流。但print()不会触发自动刷新——即使开了autoFlush也不行,autoFlush只对println()、printf()、format()生效。如果没手动调用flush(),print()写入的内容会一直留在缓冲区里,不会发送给客户端。修正方法
如果一定要用print(),需要手动补充换行符并确保缓冲区刷新:// 示例:用print实现和println相同的效果 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); out.print("你的消息内容\n"); // 手动添加换行符 // 若autoFlush为false,还需要手动调用flush // out.flush();
内容的提问来源于stack exchange,提问作者mohamed nait moussa
相关产品推荐
相关产品推荐

