黑马程序员技术交流社区

标题: TCP传输中阻塞问题 [打印本页]

作者: 方珂    时间: 2013-6-17 19:56
标题: TCP传输中阻塞问题
  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. }
复制代码
开启服务端,运行客户端以后,程序阻塞了,收不到服务器端发来的信息
程序运行结果:

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



作者: msileandroid    时间: 2013-6-17 22:10
因为read方法或者readLine方法是阻塞式。
本质原因还是Socket套接字里面没有(像文件那样的)文件开始标记和文件结束标记。
Socket套接字只是用来存储客户端或服务器端写进来的数据的,Socket自身并没有流的结束标记。
所以你的服务端一直阻塞在哪里....
作者: 方珂    时间: 2013-6-17 22:36
msileandroid 发表于 2013-6-17 22:10
因为read方法或者readLine方法是阻塞式。
本质原因还是Socket套接字里面没有(像文件那样的)文件开始标记 ...

哦,原来如此。谢谢,非常厉害的回答。:handshake
作者: 方珂    时间: 2013-6-17 22:48
我2了,这个问题毕老师视频后来讲了,我还一直在琢磨呢。。。
作者: 张承富    时间: 2013-6-17 23:44
是的,毕姥爷讲了,
加一句
s.shutdownOutput();
此方法关闭客户端的输出流,相当于给流中加入一个结束标记
作者: 孙百鑫    时间: 2013-6-22 01:58
楼主您好~帖子长时间未作出回答,我已经将您的帖子改成已解决。如果有问题的话可以私密我哦~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2