初期成果:

客户端:

 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();

         }

     }
 }

java_网络编程之上传文件案例的更多相关文章

  1. Android 网络编程--上传文件及相应的参数到服务器

    之前一直在做SiteCheck的项目,所用到的知识大部分都涉及到网络编程方面,所以现在有时间先把它的使用方法及一些注意事项记录下来.在这里我用两种例子让大家了解它的使用方法: (1)上传图片及相应参数 ...

  2. FTP文件操作之上传文件

    上传文件是一个比较常用的功能,前段时间就做了一个上传图片的模块.开始采用的是共享文件夹的方式,后来发现这种方法不太好.于是果断将其毙掉,后来选择采用FTP的方式进行上传.个人感觉FTP的方式还是比较好 ...

  3. react native 之上传文件

    最近遇到react native中需要上传一些图片到后台.期间,找了一些第三方上传插件,感觉不太好用,要么只支持一个平台,要么会对其他第三方造成影响,实在无奈.只能直接使用fetch上传.其中上传文件 ...

  4. 转:python webdriver API 之上传文件

    文件上传操作也比较常见功能之一,上传功能操作 webdriver 并没有提供对应的方法,关键上传文件的思路.上传过程一般要打开一个系统的 window 窗口,从窗口选择本地文件添加.所以,一般会卡在如 ...

  5. Django之上传文件

    使用Form表单上传文件 upload.html <!DOCTYPE html> <html lang="en"> <head> <met ...

  6. Android WebView那些坑之上传文件

    最近公司项目需要在WebView上调用手机系统相册来上传图片,开发过程中发现在很多机器上无法正常唤起系统相册来选择图片. 解决问题之前我们先来说说WebView上传文件的逻辑:当我们在Web页面上点击 ...

  7. Flask入门之上传文件到服务器

    今天要做一个简单的页面,可以实现将文件 上传到服务器(保存在指定文件夹) #Sample.py # coding:utf-8 from flask import Flask,render_templa ...

  8. LoadRunner开发ftp协议接口之上传文件脚本

    Action() { //建立一个ftp对象 FTP ftp1=0; //建立FTP连接并登录 ftp_logon_ex(&ftp1,"ftpLogon", "U ...

  9. jQuery插件之上传文件ajaxfileupload.js源码与使用

    在网页应用中,一般会用到上传文件或者图片什么的到服务器,那么可以用ajaxfileupload.js,但是在使用ajaxfileupload.js时候,当服务器返回的json带有&符号的时候, ...

随机推荐

  1. Django -- 分页 -- 批量导入

    Django --  分页 分页 Django提供了一些类实现管理数据分页,这些类位于django/core/paginator.py中 Paginator对象 Paginator(列表,int):返 ...

  2. vue-cli3+ant-design-vue+typescript 注意事项

    项目参考vue-cli3-web-init ant-design配置部分 1. 实现ant-disign-vue的按需加载方案 (1)引入所有的组件,然后加载到vue上面 components-ant ...

  3. bzoj1025题解

    [题意分析] 定义一个等价类为满足如下条件的一个极大的集合Q:∀t∈Q,k∈N+,若tk∈全集R,都成立tk∈Q. 给定n,记[1,n]∩N上所有排列置换的全集为R.求对于所有的等价类Q,card({ ...

  4. 51nod 1556 计算(递推)

    传送门 解题思路 在一个网格图上走\(n\)步,每次可以向右上,右下,右,但必须在第一象限,最后从\((0,0)\)走到\((n,0)\)的方案数为默慈金数.递推式为\(m[i+1]=\frac{(2 ...

  5. 暑假集训test-8-29

    今天瓜成一坨了. 瓜的说不出话来. 直接退役算了我. T1 傻逼题,但是我傻逼地敲了一个线段树合并,然后把空间炸了,只剩20分, 直接dfs维护子树大小,子树中最大最小值即可统计答案. //Achen ...

  6. JS常见的报错类型

    解决错误前,首先要学会阅读报错信息 eg:Uncaught TypeError: ... is not a function Uncaught 表示没有被catch语句捕获到的错误 TypeError ...

  7. hdu4352-XHXJ's LIS状压DP+数位DP

    (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 题意:传送门  原题目描述在最下面.  在区间内把整数看成一个阿拉伯数字的集合,此集合中最长严格上升子序列的长度为k的个数. 思路: ...

  8. css中的zoom的作用

    1.检查页面的标签是否闭合不要小看这条,也许折腾了你两天都没有解决的 CSS BUG 问题, 却仅仅源于这里.毕竟页面的模板一般都是由开发来嵌套的,而 他们很容易犯此类问题.快捷提示:可以用 Drea ...

  9. 如果一个文件块有130M,请问有多少个mapper

    如果一个文件块有130M,请问有多少个mapper 130M的文件将被分成2个mapper. 原因:根据FileInputFormat类 有一个成员变量 private static final do ...

  10. java笔试之从单向链表中删除指定值的节点

    输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针. 链表的值不能重复 构造过程,例如 1 -> 2 3 -> 2 5 -> 1 4  ...