A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 犹豫铅笔 于 2014-10-6 10:00 编辑

以下是代码:
  1. import java.io.BufferedReader;
  2. import java.io.DataInputStream;
  3. import java.io.DataOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.net.InetAddress;
  7. import java.net.Socket;
  8. import java.net.UnknownHostException;

  9. public class DaClient {
  10.         public static void main(String[] args) throws UnknownHostException, IOException {
  11.                 Socket s = new Socket(InetAddress.getLocalHost(), 30009);
  12.                 DataInputStream datain = new DataInputStream(s.getInputStream());
  13.                 BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream()));
  14.                
  15.                 String str = bufr.readLine();
  16.                 System.out.println(str);
  17.                
  18.                 boolean b = datain.readBoolean();
  19.                 System.out.println(b);
  20.         
  21.                 s.close();
  22.                 datain.close();
  23.                 bufr.close();
  24.         }
  25. }
复制代码
  1. import java.io.BufferedWriter;
  2. import java.io.DataOutputStream;
  3. import java.io.IOException;
  4. import java.io.PrintWriter;
  5. import java.net.ServerSocket;
  6. import java.net.Socket;

  7. public class DaServer {
  8.         public static void main(String[] args) throws IOException {
  9.                 ServerSocket ss = new ServerSocket(30009);
  10.                 Socket s = ss.accept();
  11.                 DataOutputStream datout = new DataOutputStream(s.getOutputStream());
  12.                 PrintWriter pw = new PrintWriter(s.getOutputStream(),true);

  13.                 pw.println("你好");
  14.                 datout.writeBoolean(false);
  15.                 datout.flush();
  16.                
  17.                 ss.close();
  18.                 datout.close();
  19.                 pw.close();
  20.         }
  21. }
复制代码

麻烦帮我看下,总是报一下异常:

Exception in thread "main" java.io.EOFException
        at java.io.DataInputStream.readBoolean(DataInputStream.java:244)
        at other.test.DaClient.main(DaClient.java:21)


7 个回复

倒序浏览
WakeUp 来自手机 中级黑马 2014-10-5 19:04:51
沙发
你在pw.println(你好)后面加一句s.shutDownInputStream(),手机上看的,我没试过,你试试看行不
回复 使用道具 举报
WakeUp 发表于 2014-10-5 19:04
你在pw.println(你好)后面加一句s.shutDownInputStream(),手机上看的,我没试过,你试试看行不 ...

不行额, 还是一样的结果
回复 使用道具 举报
我说说我的想法吧,也许是错的,但是你可以试试
你的错误提示是EOFException,也就是到达了文件的末尾,EOFException - 如果此输入流已经到达末尾
你在客户端首先读取了一行
那么接下来读取Boolean的时候,可能已经到了流的结尾
方法1:试一试打印出str的内容,看看到底是什么。
你在服务端写入的时候,先写的“你好”,然后写的“flase”,本来读取的时候,你读一行,当然会是读到“你好”,但是你在
服务端写完之后是先刷新的datout,那么也许流中的第一行是“boolean”,但是后面并没有换行,接着是“你好”,及“false你好”
在客户端,你读一行就读到流的末尾了,所以
方法2,你试一试在服务端重新试一下刷新的顺序
当然,这只是我的一个思路,希望有用
回复 使用道具 举报
hollywood2014 发表于 2014-10-5 23:05
我说说我的想法吧,也许是错的,但是你可以试试
你的错误提示是EOFException,也就是到达了文件的末尾,EOFE ...

谢谢,我试试
回复 使用道具 举报
我将代码修改成功了,可是又有了新问题,一下是正确代码:
  1. public class DaServer {
  2.         public static void main(String[] args) throws IOException {
  3.                 ServerSocket ss = new ServerSocket(30009);
  4.                 Socket s = ss.accept();
  5.                 DataOutputStream datout = new DataOutputStream(s.getOutputStream());
  6.                 PrintWriter pw = new PrintWriter(s.getOutputStream(),true);

  7.                 pw.println("你好");
  8.                 s.getOutputStream().flush();
  9. //                pw.flush();//这样写第一次运行时成功的,可是第二次运行又出错,这是什么原因???
  10.                 datout.writeBoolean(false);
  11.                 datout.flush();
  12.                 ss.close();
  13.                 datout.close();
  14.                 pw.close();
  15.         }
  16. }
复制代码


这句话
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


希望我的猜想没有错,望指正
回复 使用道具 举报
犹豫铅笔 发表于 2014-10-6 10:35
我将代码修改成功了,可是又有了新问题,一下是正确代码:

小弟也是菜鸟,现在处于混技术分阶段.....
根据Flushable接口中flush()的解释是,通过将所有已缓冲输出写入底层流来刷新此流。
所以,你的猜想应该是正确的
你选择刷新底层流问题解决了吗?
回复 使用道具 举报
hollywood2014 发表于 2014-10-6 16:40
小弟也是菜鸟,现在处于混技术分阶段.....
根据Flushable接口中flush()的解释是,通过将所有已缓冲输出写 ...

解决了,上面的代码运行没问题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马