黑马程序员技术交流社区

标题: 客户端和服务端文件传输问题 [打印本页]

作者: 张淼    时间: 2012-9-27 12:20
标题: 客户端和服务端文件传输问题
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class UploadClient {
public static void main(String[] args) {
  Socket s = null;
  BufferedReader br = null;
  try {
   s = new Socket("192.168.1.100", 10001);
   br = new BufferedReader(new FileReader("a.txt"));
   PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
   String line = null;
   while ((line = br.readLine()) != null) {
    pw.println(line);
   }
   BufferedReader brServer = new BufferedReader(new InputStreamReader(
     s.getInputStream()));
   String text = brServer.readLine();
   System.out.println("Server:" + text);
  } catch (UnknownHostException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   if (br != null) {
    try {
     br.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
   if (s != null) {
    try {
     s.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
}
}
--------------------------上面是客户端,下面是服务端-------------------------------------------
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadServer {
public static void main(String[] args) {
  ServerSocket ss = null;
  PrintWriter pw = null;
  try {
   ss = new ServerSocket(10001);
   Socket s = ss.accept();
   BufferedReader br = new BufferedReader(new InputStreamReader(
     s.getInputStream()));
   pw = new PrintWriter(new FileWriter("b.txt"), true);
   String line = null;
   while ((line = br.readLine()) != null) {
    pw.println(line);
   }
   PrintWriter pw2 = new PrintWriter(s.getOutputStream(), true);
   pw2.println("上传文件成功");
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   if (ss != null) {
    try {
     ss.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
}
}

我的问题是:当先开启服务端,后开启客户端的情况下,没有任何反应。
上课的时候老师讲了,说是readLine()是阻塞式的,但是我还是没理解,具体两个程序是阻塞在了哪条语句呢,以及阻塞式是什么意思?应该怎么理解呢?

作者: 冯培军    时间: 2012-9-27 14:15
    /*
    通常的,对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞 与非阻塞 。
    所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止。
    而对于非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待 。
    */
readLine()方法是阻塞式的方法,通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
但是你只是PrintWriter pw = new PrintWriter(s.getOutputStream(), true); 没有写换回或回车。
这个时候服务器短实际上是接受到客户端了,也就是服务器端运行到这里了String str = br.readLine(); 但是客户端这个时候已经运行完毕,并且关闭了连接。
所以就会出现异常。你PrintWriter pw = new PrintWriter(s.getOutputStream()+"\n",true)这样写试试。






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