黑马程序员技术交流社区
标题:
为什么会阻塞,求详解
[打印本页]
作者:
吴玉辉
时间:
2012-4-15 03:20
标题:
为什么会阻塞,求详解
import java.io.*;
import java.net.*;
class TextClient
{
public static void main(String[] args) throws Exception
{
Socket s = new Socket("169.254.115.35",10006);
BufferedReader bufr =
new BufferedReader(new FileReader("RemoveDir.java"));
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String line = null;
while((line=bufr.readLine())!=null)
{
out.println(line);
}
//s.shutdownOutput();//关闭客户端的输出流。相当于给流中加入一个结束标记-1.
//
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
String str = bufIn.readLine();
System.out.println(str);
bufr.close();
s.close();
}
}
class TextServer
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(10006);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"....connected");
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter out = new PrintWriter(new FileWriter("server.txt"),true);
String line = null;
while((line=bufIn.readLine())!=null)
{
//if("over".equals(line))
//break;
out.println(line);
}
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
pw.println("上传成功");
out.close();
s.close();
ss.close();
}
}
复制代码
作者:
刘少伟
时间:
2012-4-15 03:52
24行的s.shutdownOutput()注释没去掉,客户端读完文件,接下来在等待服务端返回的信息,但由于没有关闭输出流(加结束标记),服务端循环没有结束,还在一直等待读入,readLine()是额阻塞式方法,所以两边都阻塞了。但其实文件还是上传成功了。
作者:
王德南
时间:
2012-4-15 08:05
从硬盘上读文件的话while((line=bufIn.readLine())!=null) 这个会自动结束的, 但是在往外写的时候,out.println(line),写完了却没有结束标记,那样对方在读取的时候循环就不会结束,所以要在写完后加个结束标记,也就是s.shutdownOutput()。但是你这个结束标记注释没去掉,所以会一直循环下去啊
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2