黑马程序员技术交流社区

标题: 上传文件出现的问题 [打印本页]

作者: 秦桂胜    时间: 2013-11-14 19:39
标题: 上传文件出现的问题
  1. import java.io.*;
  2. import java.io.InputStream;
  3. import java.net.*;


  4. class UploadFileClient {

  5.         /**
  6.          * @param args
  7.          * @throws Exception
  8.          */
  9.         public static void main(String[] args) throws Exception {
  10.                 // TODO Auto-generated method stub
  11.                 Socket s=new Socket("127.0.0.1",10006);
  12.                 OutputStream out=s.getOutputStream();
  13.                 FileInputStream  fis=new FileInputStream("a.txt");
  14.                 byte[] buf=new byte[1024];
  15.                 int len=0;
  16.                 while((len=fis.read(buf))!=-1){
  17.                         out.write(buf, 0, len);
  18.                 }
  19.                 System.out.println("hehe ");
  20.                
  21.                 s.close();

  22.         }
  23.        

  24. }
  25. class UploadFileServer{
  26.          public static void main(String[] args) throws Exception {
  27.                         // TODO Auto-generated method stub
  28.                         ServerSocket ss=new ServerSocket(10006);
  29.                         FileOutputStream fos=new FileOutputStream("b.txt");
  30.                         while(true){
  31.                                 Socket s=ss.accept();
  32.                                 InputStream in=s.getInputStream();
  33.                                 byte[] buf=new byte[1024];
  34.                                 int len=0;
  35.                                 while((len=in.read(buf))!=-1){
  36.                                         fos.write(buf, 0, len);
  37.                                 }
  38.                                 ss.close();
  39.                         }
  40.                        
  41.                        

  42.                 }
  43. }


复制代码
上传成功但是报了异常

H7~}WO(]GMJ3F(NBZ9H3UF3.jpg (12.32 KB, 下载次数: 7)

H7~}WO(]GMJ3F(NBZ9H3UF3.jpg

作者: 七道    时间: 2013-11-14 20:12
  1. ServerSocket ss=new ServerSocket(10006);
  2.                         FileOutputStream fos=new FileOutputStream("b.txt");
  3.                         Socket s=ss.accept();//把这一行放出while循环就可以了
  4.                         while(true){
  5.                                 InputStream in=s.getInputStream();
  6.                                 byte[] buf=new byte[1024];
  7.                                 int len=0;
  8.                                 while((len=in.read(buf))!=-1){
  9.                                         fos.write(buf, 0, len);
  10.                                 }
  11.                                 ss.close();
  12.                         }
  13.                        
  14.                        

  15.                 }
复制代码

作者: 秦桂胜    时间: 2013-11-14 20:33
七道 发表于 2013-11-14 20:12

这个方法不行呀
作者: 七道    时间: 2013-11-14 20:50
秦桂胜 发表于 2013-11-14 20:33
这个方法不行呀

我运行过了,不会报错,把a.txt 文件上传到服务端bao保存到b.txt,我的可以
作者: cuilitang    时间: 2013-11-14 22:54
本帖最后由 cuilitang 于 2013-11-14 22:59 编辑
  1. package cn.itcast;

  2. import java.io.FileOutputStream;
  3. import java.io.InputStream;
  4. import java.net.ServerSocket;
  5. import java.net.Socket;

  6. public class UploadFileServer{
  7.     public static void main(String[] args) throws Exception {
  8.            
  9.                    ServerSocket ss=new ServerSocket(10006);
  10.                    FileOutputStream fos=new FileOutputStream("b.txt");
  11.                   
  12.                     while(true){
  13.                             Socket s=ss.accept();
  14.                            InputStream in=s.getInputStream();
  15.                            byte[] buf=new byte[1024];
  16.                            int len=0;
  17.                            while((len=in.read(buf))!=-1){
  18.                                    fos.write(buf, 0, len);
  19.                            }
  20.                         //   ss.close();
  21.                    }
  22.                   
  23.                   

  24.            }
  25. }

  26. /**直接把ss.close()那一句注掉就可以了

  27. //你吧serverSocket关掉之后这个对象就没了,serversoket不在循环中,也没有创建新的serversocket对象,调用 acceppt()方法当然报异常了。

  28. //ss.accept()那句放到外面,那么accept()方法接收完一次客户端的连接后便已经不再阻塞等待客户新的连接了,上传新的文件会报连接拒绝

  29. //综上所述,accept必须放进循环中,等待客户新的连接,这样才能保证服务器保持等待连接状态,等待客户端上传的新的文件。
  30. 至于为啥你要在循环中关掉ServerSocket对象,建议你看一下基础知识中while的执行流程,好好想想服务器为啥能继续等待新的连接,而不是接受完就退出。

  31. //验证:你若是吧整个方法体都放进while循环中,不注掉close(),一句程序也正常继续接受客户端连接,因为每次都会new 新的ServerSocket对象 。
  32. *
  33. */

复制代码

作者: cuilitang    时间: 2013-11-14 22:56
七道 发表于 2013-11-14 20:12

//ss.accept()那句放到外面,那么accept()方法接收完一次客户端的连接后便已经不再阻塞等待客户新的连接了,上传新的文件会报连接拒绝




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