Java socket程序中客户端无法向服务器发送数据的bug

项目场景:

Java网络编程的Echo项目,该项目框架如下。
在这里插入图片描述

问题描述:

  • 当在客户端使用PrintWriter进行Socket写入时,发现服务器端无法接收到数据。
  • 在客户端使用Scanner接收命令行输入字符串,然后发送到服务器时,服务器无法读到数据

原因分析:

  • 字节流(Writer及其子类)写入数据(包括父类的write方法和打印流的print方法),写入的时候都是写到缓存里,需要手动情况缓存(flush)之后才是真正的写入到socket。因此如果没有手动清空缓存,实际上是并没有成功发送消息的。
  • Scanner接收数据时,通过nextLine方法读到字符串不会把结尾的换行符带上,这样服务器使用Scanner.nextLine读取时,因为没有换行符,所以无法把字符串读到。

解决方案:

  • 使用PrintStream向socket写入数据,或者使用PrintWriter写数据并且每次写入后手动清空缓存(flush)。
  • 使用BufferedReader.readLine或者Scanner.nextLine读取命令行输入后,字符串结尾手动添加换行。或者向Socket写入数据时,使用PrintStream的println方法自动追加换行。

版权声明:本文为u013165358原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。