温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java如何实现文件上传服务器和客户端

发布时间:2021-04-17 14:23:39 来源:亿速云 阅读:254 作者:小新 栏目:编程语言

这篇文章主要介绍Java如何实现文件上传服务器和客户端,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

具体内容如下

文件上传服务器端:

/**   * 使用TCP协议实现上传功能的服务器端   * 思路:   * 新建ServerSocket   * 等待客户端连接   * 连接上后开启子线程,把连接获取的Socket传给子线程   * 循环进行   * @author yajun   *   */  public class UploadServer {      public static void main(String[] args) {    UploadServer server=new UploadServer();    UploadThread command=new UploadThread();    server.start(command);   }      /**    * 功能:接受连接,开启子线程,循环    * @param command 用于下载的子线程对象,该对象实现了Runnable接口    */   private void start(UploadThread command){    //局部变量    ServerSocket serverSocket = null;    Socket transSocket;    //业务逻辑    try {     serverSocket=new ServerSocket(55555);     while(true){      System.out.println("等待连接……");      transSocket=serverSocket.accept();      int i=0;      i++;      System.out.println("第"+i+"个连接");      //用不用在下载完后关闭线程呢???      command.setSocket(transSocket);      Executors.newFixedThreadPool(5).execute(command);     }    //异常捕获    } catch (IOException e) {     e.printStackTrace();    //关闭资源    } finally{     try {      serverSocket.close();     } catch (IOException e) {      e.printStackTrace();     }    }//End of try   }//End of connect   @Test   public void testConnect() {    //测试任务:先运行服务器端,然后多次运行客户端,服务器段可以不断创建子线程,则测试成功    //测试准备:构造一个线程,用于模拟下载线程    UploadThread command=new UploadThread();    start(command);       }     @Test   public void testDown() throws IOException {    byte[] buf;    ByteArrayInputStream bis;    String str="canglaoshi.avi\ncontent,content,content";    buf=str.getBytes();    bis=new ByteArrayInputStream(buf);    UploadThread ut=new UploadThread();    ut.down(bis);   }  }  //完成各个传输任务的子线程  class UploadThread implements Runnable{      Socket socket;   public UploadThread(){}   public UploadThread(Socket socket){    this.socket=socket;   }   @Override   public void run() {    InputStream in;    try {          in = socket.getInputStream();     down(in);         //异常处理    } catch (IOException e) {     e.printStackTrace();    } finally{     try {      socket.close();     } catch (IOException e) {      e.printStackTrace();     }    }    //测试代码    /*try {     Thread.sleep(5000);     System.out.println(Thread.currentThread().getName()+",复制完毕");    } catch (InterruptedException e) {     e.printStackTrace();    }*/   }//End of run   public void setSocket(Socket socket){    this.socket=socket;   }   //下载方法   /**    * 目标:把InputStream中的数据写入到本地    * 思路:    * 1.获取输入流,最好传入输入流,而不是直接从Socket获取,传入有利用单元测试    * 2.从输入流中读到文件名    * 3.新建文件和文件输出流    * 4.从输入流中读到文件内容到文件输出流    * 5.    * @throws IOException    */   public void down(InputStream in) throws IOException{    //局部变量    char ch;    char[] nameArr=new char[256];    byte[] buf=new byte[1024];    String name="";    OutputStream out = null;    //业务逻辑    try {     //第一步:获取文件名,构造文件输出流     int i=0;     while((ch=(char) in.read())!='\n'){      nameArr[i++]= ch;     }     //name=nameArr.toString();//这句话无法将字符数组转换为字符串,需用下面的语句     name=new String(nameArr);     System.out.println("要下载的文件为:"+name);     out=new FileOutputStream("src\\down\\"+name);     //第二步:将输入流中的其他内容写入到文件     int len;     while((len=in.read(buf))!=-1){      out.write(buf,0,len);     }     out.flush();    //异常捕获    } catch (IOException e) {     e.printStackTrace();    //关闭资源    }finally{     //疑问:两个捕获可不可以放到一块呢,怎样处理关闭流时的异常最好呢?     in.close();     out.close();    }    //调试    System.out.println(name);   }     }//End of UploadThread

文件上传客户端:

/**   * 使用TCP协议实现上传功能的客户端   * @author yajun   */  public class UploadClient {      public static void main(String[] args) {    UploadClient client=new UploadClient();    client.upload("src\\thursday\\AsListTest.java");   }     /**    * 作用:上传文件到服务器    * 1.建立到服务器的连接    * 2.获取输出流    * 3.将文件内容写入到输出流    * 4.获取服务器的响应    */   private void upload(String name){    Socket socket=null;    OutputStream out;    try {     socket=new Socket("127.0.0.1", 55555);     out=socket.getOutputStream();     write2OutputStream(name, out);    //异常捕获    } catch (UnknownHostException e) {     e.printStackTrace();    } catch (IOException e) {     e.printStackTrace();    }   }   @Test   public void testUpload() {    upload("src\\status.xml");   }   /**    * 作用:传入文件名和输出流,将文件写入到输出流    * @param path    * @throws IOException    */   private void write2OutputStream(String path,OutputStream out) throws IOException{        FileInputStream fis = null;    byte[] buf=new byte[1024];    String fileName="";    //业务逻辑    try {          //1.写入文件名     fileName=path.substring(path.lastIndexOf('\\')+1);     System.out.println("您要上传的文件名为:"+fileName);     out.write(fileName.getBytes());     out.write('\n');     //2.写入文件内容     fis=new FileInputStream(path);     int len;     while((len=fis.read(buf))!=-1){      out.write(buf, 0, len);     }     out.flush();    //异常处理    } catch (IOException e) {     e.printStackTrace();    //关闭资源    } finally{     fis.close();     out.close();    }   }//End of upload   @Test   public void testWrite2OutputStream() throws IOException {    ByteArrayOutputStream out = null;    try {     out=new ByteArrayOutputStream();     write2OutputStream("src\\status.xml", out);     System.out.println(out.toString("utf-8"));    } catch (IOException e) {     e.printStackTrace();    } finally{     out.close();    }       }     }

以上是“Java如何实现文件上传服务器和客户端”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI