初期成果:

客户端:

 package FileUpload;

 import java.io.*;
 import java.net.Socket;
 import java.util.Scanner;

 public class Client {

     public static void main(String[] args) throws IOException {
         //1.让用户指定上传文件
         System.out.println("请输入需要上传的文件");
         Scanner scanner = new Scanner(System.in);
         String s = scanner.nextLine();
         File file = new File(s);
         //2.判断文件是否存在并告知用户
         if(!file.exists()){
             System.out.println("对不起您指定的文件不村子啊");
             return;
         }else{
         //3.创建客户端并绑定服务器IP和端口号
             Socket socket = new Socket("127.0.0.1", 8888);
             //4.使用Socket对象中的方法getOutputStream()获取网络字节输出OutputStream流对象
             OutputStream outputStream = socket.getOutputStream();
             //5.创建本地字节输入流读取文件
             FileInputStream fis = new FileInputStream(file);
             //6.读取文件并通过网络传送到服务器
             byte[] bytes = new byte[1024];
             int len = 0;
             while ((len = fis.read(bytes))!=-1){
                 outputStream.write(bytes,0,len);
             }
             //6.1因为程序会阻塞所以使用shutdownOutput结束输出流
             socket.shutdownOutput();
             //7.使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
             InputStream is = socket.getInputStream();
             //8.使用网络字节输入流InputStream对象中的read读取服务器回写的数据
             while ((len = is.read(bytes))!=-1){
                 System.out.println(new String(bytes,0,len));
             }
             //释放资源
             socket.close();
             fis.close();
         }
     }
 }

服务器端:

 package FileUpload;

 import java.io.*;
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.util.Random;

 public class ServerSocketTest {
     public static void main(String[] args) throws IOException {
         //1.创建服务器
         ServerSocket serverSocket = new ServerSocket(8888);
         //2.判断服务器文件夹是否存在
         File file = new File("E:\\aikang");
         if (!file.exists()){
             file.mkdirs();
         }
         //3.使用ServerSocket对象中的方法accept,获取到请求的客户端对象Socket
         Socket socket = serverSocket.accept();
         //4.使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
         InputStream is = socket.getInputStream();
         //5.获取本地输出流对象储存数据
         FileOutputStream fos = new FileOutputStream(file+"\\"+System.currentTimeMillis()+new Random().nextInt()+".jpg");
         //6.读取网络输入流对象的数据并输出到硬盘
         byte[] bytes = new byte[1024];
         int len = 0;
         while ((len = is.read(bytes))!=-1){
             fos.write(bytes,0,len);
         }
         //7.获取网络字节输出流回写给客户端提示
         OutputStream os = socket.getOutputStream();
         os.write("上传完成".getBytes());
         //8.释放资源
         serverSocket.close();
         socket.close();

     }
 }

第二次:优化服务器一直跑

服务器端:

 package FileUpload;

 import java.io.*;
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.util.Random;

 public class ServerSocketTest {
     public static void main(String[] args) throws IOException {

         //1.创建服务器
         ServerSocket serverSocket = new ServerSocket(8888);

         //2.判断服务器文件夹是否存在
         File file = new File("E:\\aikang");
         if (!file.exists()){
             file.mkdirs();
         }

         //加while
         while (true){
             //3.使用ServerSocket对象中的方法accept,获取到请求的客户端对象Socket
             Socket socket = serverSocket.accept();
             //4.使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
             InputStream is = socket.getInputStream();
             //5.获取本地输出流对象储存数据
             FileOutputStream fos = new FileOutputStream(file+"\\"+System.currentTimeMillis()+new Random().nextInt()+".jpg");
             //6.读取网络输入流对象的数据并输出到硬盘
             byte[] bytes = new byte[1024];
             int len = 0;
             while ((len = is.read(bytes))!=-1){
                 fos.write(bytes,0,len);
             }
             //7.获取网络字节输出流回写给客户端提示
             OutputStream os = socket.getOutputStream();
             os.write("上传完成".getBytes());
             //8.释放资源
             socket.close();
             fos.close();

         }

     }
 }

第三次优化:多用户同时上传使用多线程

 package FileUpload;

 import java.io.*;
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.util.Random;

 public class ServerSocketTest {
     public static void main(String[] args) throws IOException {

         //1.创建服务器
         ServerSocket serverSocket = new ServerSocket(8888);
         //2.判断服务器文件夹是否存在
         File file = new File("E:\\aikang");
         if (!file.exists()){
             file.mkdirs();
         }

         //加while
         while (true){
             //3.使用ServerSocket对象中的方法accept,获取到请求的客户端对象Socket
             Socket socket = serverSocket.accept();
             //使用多线程
             new Thread(new Runnable() {
                 //完成文件上传
                 @Override
                 public void run() {
                     try {//4.使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
                         InputStream is = socket.getInputStream();
                         //5.获取本地输出流对象储存数据
                         FileOutputStream fos = new FileOutputStream(file + "\\" + System.currentTimeMillis() + new Random().nextInt() + ".jpg");
                         //6.读取网络输入流对象的数据并输出到硬盘
                         byte[] bytes = new byte[1024];
                         int len = 0;
                         while ((len = is.read(bytes)) != -1) {
                             fos.write(bytes, 0, len);
                         }
                         //7.获取网络字节输出流回写给客户端提示
                         OutputStream os = socket.getOutputStream();
                         os.write("上传完成".getBytes());
                         //8.释放资源
                         socket.close();
                         fos.close();
                     }catch (IOException e){
                         System.out.println(e);
                     }
                 }
             }).start();

         }

     }
 }

最新文章

  1. 你必须知道的Javascript 系列
  2. 虚拟树Demos\Minimal 简单的例子
  3. 关于在终端运行rosrun时找不到对应的包的解决方法
  4. 算法设计和数据结构学习_5(BST&AVL&红黑树简单介绍)
  5. A PHP extension for Facebook's RocksDB
  6. nginx 的模块及处理流程
  7. EBS OAF开发中实现參数式弹出窗体
  8. 关于web标准的理解(转)
  9. 实用的PHP正则表达式
  10. linux ubuntu下如何安装并且切换java版本(Unsupported major.minor version 52.0)
  11. 【转载】彻底弄懂css中单位px和em,rem的区别
  12. matlab分割背景与物体
  13. FFT 专题讲解
  14. HTML5的Rang对象
  15. 分享几个实用的Chrome扩展程序
  16. 乘法原理,加法原理,多重集的排列数(多个系列操作穿插的排列数) 进阶指南 洛谷p4778
  17. 利用原生JS实现网页1920banner图滚动效果
  18. Android ComponentName的用法
  19. WordPress后台的文章、分类,媒体,页面,评论,链接等所有信息中显示ID并将ID设置为第一列
  20. 【转】.NET内存管理、垃圾回收

热门文章

  1. zjoi 2008 树的统计——树链剖分
  2. 高效率使用google,国外搜索引擎,国内顺利使用Google的另类技巧,可用谷歌镜像, 可用google学术, 如何使用robots不让百度和google收录
  3. SQL语句增加列、修改列、删除列
  4. 6. 第一个jmeter脚本开发-测试百度首页
  5. ecshop 学习笔记
  6. 《DSP using MATLAB》Problem 8.46
  7. 往github上上传项目
  8. ps-使用通道抠图为XX换背景
  9. Python匹马行天下之_循环
  10. 原来腾迅的QQ号竟然是个int变量