我将代码修改成功了,可是又有了新问题,一下是正确代码:
- public class DaServer {
- public static void main(String[] args) throws IOException {
- ServerSocket ss = new ServerSocket(30009);
- Socket s = ss.accept();
- DataOutputStream datout = new DataOutputStream(s.getOutputStream());
- PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
- pw.println("你好");
- s.getOutputStream().flush();
- // pw.flush();//这样写第一次运行时成功的,可是第二次运行又出错,这是什么原因???
- datout.writeBoolean(false);
- datout.flush();
- ss.close();
- datout.close();
- pw.close();
- }
- }
复制代码
这句话
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);不是说明pw.println("你好")是自动刷新吗,可是在这里好像没有,我于是在其后添加一句pw.flush(),结果丝毫没改变,于是我将pw.flush()替换为s.getOutputStream().flush();后,程序成功运行。
我对以上现象的猜想解释:
pw.flush()和pw.println(),dataout.flush()的刷新可能仅仅将pw,dataout中的数据刷入到了s.getOutputStream()流中,当pw刷新时,pw中的数据被刷到了s.getOutputStream()这个流中,但是这个流中的数据还没有传输出去到客户端,仍停留在这个s.getOutputStream()这个流中,当dataout.flush()后,dataout流中的数据也被刷入到了s.getOutputStream()这个流中,当时这个数据应该放在最前面,于是s.getOutputStream()
中的数据是:false你好\r\n,false在前面,当客户端运行到String str = bufr.readLine();这一句时,便将数据全部读取出来了,datain在读取是就碰到了结束标记,抛出EOFException
希望我的猜想没有错,望指正
|