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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 方珂 中级黑马   /  2013-6-17 19:56  /  1441 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.io.*;
  2. import java.net.*;
  3. class  ClientDemo
  4. {
  5.         public static void main(String[] args) throws Exception
  6.         {
  7.                 Socket s = new Socket("127.0.0.1",10002);

  8.                 DataOutputStream out =new DataOutputStream(s.getOutputStream());

  9.                 out.write("TCP 来了".getBytes());

  10.                 DataInputStream in = new DataInputStream(s.getInputStream());

  11.                 byte[] buf = new byte[1024];

  12.                 int len = in.read(buf);

  13.                 String text = new String(buf,0,len);

  14.                 System.out.println("server:"+text);

  15.                 s.close();
  16.         }
  17. }

  18. class  ServerDemo
  19. {
  20.         public static void main(String[] args) throws Exception
  21.         {
  22.                 ServerSocket ss = new ServerSocket(10002);

  23.                 Socket s = ss.accept();//该方法是阻塞式的。
  24.                
  25.                 String ip = s.getInetAddress().getHostAddress();
  26.                 System.out.println(ip+".....connected");

  27.                 DataInputStream in = new DataInputStream(s.getInputStream());

  28.                 byte[] buf  = new byte[1024];
  29.                 int len = 0;
  30.                 while(( len = in.read(buf))!=-1);
  31.                 {
  32.               String text = new String(buf,0,len);

  33.                       System.out.println(text);
  34.                 }

  35.                 DataOutputStream out =new DataOutputStream(s.getOutputStream());

  36.                 out.write("已收到".getBytes());

  37.                 s.close();
  38.                 ss.close();
  39.         }
  40. }
复制代码
开启服务端,运行客户端以后,程序阻塞了,收不到服务器端发来的信息
程序运行结果:

这个方法为什么会阻塞?可否解答一下?谢谢了。


评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

5 个回复

倒序浏览
因为read方法或者readLine方法是阻塞式。
本质原因还是Socket套接字里面没有(像文件那样的)文件开始标记和文件结束标记。
Socket套接字只是用来存储客户端或服务器端写进来的数据的,Socket自身并没有流的结束标记。
所以你的服务端一直阻塞在哪里....

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

回复 使用道具 举报
msileandroid 发表于 2013-6-17 22:10
因为read方法或者readLine方法是阻塞式。
本质原因还是Socket套接字里面没有(像文件那样的)文件开始标记 ...

哦,原来如此。谢谢,非常厉害的回答。:handshake
回复 使用道具 举报
我2了,这个问题毕老师视频后来讲了,我还一直在琢磨呢。。。
回复 使用道具 举报
是的,毕姥爷讲了,
加一句
s.shutdownOutput();
此方法关闭客户端的输出流,相当于给流中加入一个结束标记
回复 使用道具 举报
楼主您好~帖子长时间未作出回答,我已经将您的帖子改成已解决。如果有问题的话可以私密我哦~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马