黑马程序员技术交流社区

标题: 在tcp上传文件中,怎样先让服务器端获得文件名? [打印本页]

作者: hello_world!    时间: 2012-10-23 15:03
标题: 在tcp上传文件中,怎样先让服务器端获得文件名?
在毕老师讲的,用TCP向服务端上传文件中,他提到过一般我们传文件,先是将文件名传给服务器。我想过现在客户端创建一个PrintWriter对象将文件名发送过去,再在服务器端创建一个BufferedReader对象,读一行文本,获得文件名。
客户端实现的代码如下:
  1. package uploadFile;

  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.BufferedReader;
  5. import java.io.File;
  6. import java.io.FileInputStream;
  7. import java.io.IOException;
  8. import java.io.InputStreamReader;
  9. import java.io.OutputStream;
  10. import java.io.PrintWriter;
  11. import java.net.InetAddress;
  12. import java.net.Socket;
  13. import java.net.UnknownHostException;
  14. import java.util.Scanner;

  15. public class TransClient {


  16.         public static void main(String[] args) {
  17.                 try {
  18.                         Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 10010);
  19.                         OutputStream out = socket.getOutputStream();
  20.                                                
  21.                         Scanner scanner = new Scanner(System.in);
  22.                         File file = null;
  23.                         while (true) {
  24.                                 System.out.println("Please put in the name of file:");
  25.                                 String fileName = scanner.nextLine();
  26.                                 file = new File(fileName);
  27.                                
  28.                                 if (!file.exists()) {
  29.                                         System.out.println(fileName + " isn't exists");
  30.                                 }else{
  31.                                         break;
  32.                                 }
  33.                         }
  34.                        
  35. <font color="#ff0000">                        PrintWriter pw = new PrintWriter(out, true);
  36.                         pw.println(file.getName());                                        //发送文件名</font>
  37.                        
  38.                         BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
  39.                         BufferedOutputStream bos = new BufferedOutputStream(out);
  40.                         byte[] buf = new byte[1024];
  41.                         int len;
  42.                         while (-1 != (len = bis.read(buf))) {
  43.                                 bos.write(buf, 0, len);
  44.                                 bos.flush();//注意这里一定要刷新,要不然数据没有出缓冲区。更谈不上发送了
  45.                         }
  46.                        
  47.                         socket.shutdownOutput();
  48.                        
  49.                         BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  50.                         System.out.println(br.readLine());
  51.                        
  52.                         bis.close();
  53.                         socket.close();//是不是与socket相关的流,都被关闭了                       
  54.                 } catch (UnknownHostException e) {
  55.                         e.printStackTrace();
  56.                 } catch (IOException e) {
  57.                         e.printStackTrace();
  58.                 }
  59.         }               
  60. }
复制代码
服务器端实现的代码:
  1. package uploadFile;

  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.BufferedReader;
  5. import java.io.File;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.InputStreamReader;
  9. import java.io.PrintWriter;
  10. import java.net.ServerSocket;
  11. import java.net.Socket;

  12. public class TransServer {

  13.         public static void main(String[] args) {
  14.                 try {
  15.                         ServerSocket ss = new ServerSocket(10010);
  16.                         Socket s = ss.accept();
  17.                         System.out.println(s.getInetAddress().getHostAddress() + "...contected");
  18. <font color="#ff0000">                        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
  19.                         File file = new File(br.readLine());                                //获得文件名
  20. </font>                       
  21.                         BufferedInputStream bis = new BufferedInputStream(s.getInputStream());
  22.                         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\" + file.getName()));
  23.                         byte[] buf = new byte[1024];
  24.                         int len;
  25.                         while (-1 != (len = bis.read(buf))) {
  26.                                 bos.write(buf, 0, len);                               
  27.                         }
  28.                        
  29.                         bos.flush();
  30.                        
  31.                         PrintWriter pw = new PrintWriter(s.getOutputStream(), true);//注意一定要加true,(如果为 true,则 println、printf 或 format 方法将刷新输出缓冲区)要不然就自己刷新缓冲区
  32.                         pw.println("上传成功");//这里就不要用write(),因为它不会自动刷新的
  33.                        
  34.                         s.shutdownOutput();
  35.                        
  36. //                        s.close();
  37.                 } catch (IOException e) {
  38.                         e.printStackTrace();
  39.                 }
  40.         }
  41. }
复制代码
求高手,给个专业的解法!!!





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