1. Server.java
  2. package com.huaxin.lesson02;
    
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.ObjectInputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    /**
    * @thing 实现客户端发送文件到服务器
    * @thing 客户端发送到客户端(本代码未实现)
    * @author Administrator
    *
    */ public class Severs {
    public static void main(String[] args) {
    new Severs().initServer();
    } public void initServer() {
    try {
    ServerSocket sSocket = new ServerSocket(9191);
    System.out.println("服务器创建成功!");
    Socket socket = sSocket.accept();
    System.out.println("有客户端链接成功!");
    //准备两个流:文件输出流,socket输入流
    InputStream ins = socket.getInputStream();
    //将客户端上传的文件存到服务器里面
    ObjectInputStream ois = new ObjectInputStream(ins);
    FileOutputStream fos = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\临时文档\\test\\2016毕晚策划4月19(1).doc");
    System.out.println("开始读取文件……"); //1.读取的数组长度
    int lenght = ois.readInt();
    //2.读取次数
    long times = ois.readLong();
    //3.读取最后一次字节长度
    int lastBytes = ois.readInt();
    byte[] bytes = new byte[lenght];
    // ois.read(bytes);
    /**和read相比,都是读一个字节数组
    * read不一定能读完2048个字节里面的全部字节,会继续往下走
    * readFully是通信里面才用到的函数,将会判断流里面还有没有字节剩余
    * 有一种情况,会在字节数组里面没有将全部字节传送到位,而阻塞在网络上,或者阻塞到发送端的网卡上
    * readFully方法,会等大byte数组中所有数据全部读取完毕后,继续往下执行
    * read方法,会检测流中是否还有剩余字节,如果没有,则会继续往下执行
    *
    **/
    //循环读取文件
    while(times > 1){
    ois.readFully(bytes);
    fos.write(bytes);
    fos.flush();
    times -- ;
    }
    //处理最后一次字节数组
    bytes = new byte[lastBytes];
    ois.readFully(bytes);
    fos.write(bytes);
    fos.flush(); // //即将读取的文件字节数
    // long fileSize = ois.readLong();
    // System.out.println(fileSize);
    //
    // int value = ins.read();
    // while(fileSize > 0){
    // fileSize--;
    // fos.write(value);
    // fos.flush();
    // value = ins.read();
    // }
    System.out.println("文件接收完毕!已保存到服务器。");
    ois.close();
    fos.close();
    socket.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    } }
  3. Client.java
  4. package com.huaxin.lesson02;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.ObjectOutputStream;
    import java.io.OutputStream;
    import java.net.Socket; import org.omg.CORBA.portable.InputStream; public class Client {
    public int val = 2048;
    public static void main(String[] args) {
    new Client().initClient();
    } public void initClient() {
    try {
    Socket socket = new Socket("localhost",9191);
    //准备两个流,文件输入流,socket输入流
    //本地的输入流
    FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\临时文档\\test\\2016毕晚策划4月19.doc");
    //把本地的输入流发出去
    OutputStream ous = socket.getOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(ous); System.out.println("开始读发送文件……!");
    //先获取文件大小
    File file = new File("C:\\Users\\Administrator\\Desktop\\临时文档\\test\\2016毕晚策划4月19.doc");
    long fileSize = file.length();
    byte[] bytes = new byte[val]; //算出即将发送字节数组的字数
    long times = fileSize/val+1;
    //算出最后一组字节数组的有效字节数
    int lastBytes = (int)fileSize%2048;
    //1.发送字节数组长度
    oos.writeInt(val);
    //2.发送次数
    oos.writeLong(times);
    oos.flush();
    //3.最后一次字节个数
    oos.writeInt(lastBytes);
    oos.flush(); //读取字节数组长度的字节,返回读取字节数中的数据个数
    int value = fis.read(bytes);
    while(value != -1){
    //偏移字节数读取
    oos.write(bytes,0,value);
    oos.flush();
    value = fis.read(bytes);
    } // oos.writeLong(fileSize);
    // oos.flush();
    // System.out.println(fileSize);
    //// ous.write((int)fileSize);
    //// ous.flush();
    //// System.out.println(fileSize);
    //// Thread.sleep(2000);
    //
    // //读取文件中的字节数据
    // int value = fis.read();
    // while(value != -1){
    // ous.write(value);
    // ous.flush();
    // value = fis.read();
    // }
    System.out.println("文件发送完毕!");
    Thread.sleep(2000);
    //关闭流
    fis.close();
    ous.close();
    socket.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
  5. 笔记都在代码里面

【代码笔记】Java深入学习——实现客户端发送文件到服务器的文件传输的更多相关文章

  1. 编写Java程序,实现客户端向服务端上传文件的功能

    查看本章节 查看作业目录 需求说明: 实现客户端向服务端上传文件的功能 当启动服务端后,运行客户端程序,系统提示客户在客户端输入上传文件的完整路径.当客户在客户端输入完成后,服务端实现文件上传 实现思 ...

  2. [笨木头FireFly 02]入门篇2_客户端发送请求,服务器处理请求

    原地址:http://www.9miao.com/question-15-53940.html 好,经过上一篇不权威的讲解,大家已经能轻易地让客户端和服务端连接起来了. 但是,仅仅是连接了,可它们俩不 ...

  3. 集合总结(全是代码)----------java基础学习

    前言:在刚学习的时候,切记不能粘贴复制,更不能眼高手低,再简单的代码,都要自己独立动手写. 第一步:目录结构 第二步:代码区 Student.java:(一个学生的实体类) package com.m ...

  4. 学习笔记:oracle学习一:oracle11g体系结构之服务器结构、数据字典

    目录 1.服务器架构 1.1 系统全局区SGA 1.1.1 高速数据缓冲区(database buffer cache) 1.1.2 重做日志缓冲区(redo log buffer cache) 1. ...

  5. Java爬虫学习(2)之用对象保存文件demo(1)

    package com.mieba.spider; import java.util.ArrayList; import java.util.List; import java.util.Vector ...

  6. [原创]java WEB学习笔记18:java EE 中的MVC 设计模式(理论)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  7. java web学习笔记-Servlet篇

    Servlet基础 1.Servlet概述 JSP的前身就是Servlet.Servlet就是在服务器端运行的一段小程序.一个Servlet就是一个Java类,并且可以通过“请求-响应”编程模型来访问 ...

  8. Android(java)学习笔记206:利用开源SmartImageView优化网易新闻RSS客户端

    1.我们自己编写的SmartImageView会有很多漏洞,但是我们幸运的可以在网上利用开源项目的,开源项目中有很多成熟的代码,比如SmartImageView都编写的很成熟的 国内我们经常用到htt ...

  9. Android(java)学习笔记205:网易新闻RSS客户端应用编写逻辑过程

    1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,bl ...

随机推荐

  1. Android蓝牙连接自动测试工具

    蓝牙连接自动测试工具 1.需求产生 开发不按着需求走都是耍流氓且浪费时间.此工具的需求产生是研发人员在开发产品时涉及到蓝牙驱动和安卓蓝牙两个东西.但是呢,蓝牙不太稳定,那么工作来了.就需要研发人员一边 ...

  2. flex弹性布局,好用

    一直不太喜欢自己布局前端页面,都是扒别人的页面 ,最近在练习小程序,页面无处可扒,只有自己布局 发现flex弹性布局真好用,布局起来很简单,实现的效果也很好,赞 以后可以自己写一点前端了,哈哈

  3. 记一个SpringBoot中属性注入失败的问题Consider defining a bean of type ''' in your configuration

    今天遇到的一个问题: 代码检查了好几次,都没有错误,但是启动时就会报错Consider defining a bean of type ''' in your configuration. 启动类在c ...

  4. nginx 之 proxy_pass

    nginx中有两个模块都有proxy_pass指令 ngx_http_proxy_module的proxy_pass 语法: proxy_pass URL; 场景: location, if in l ...

  5. Kibana6.x.x源码分析--JavaScript中 "!~" 这样的符号是啥意思?

    看到源码中有一段JS代码不太懂,如下: 里面这个 "!~" 符号看到后有点儿方啊O__O "…,毛线意思? [查资料,解释如下]: indexOf returns -1 ...

  6. 【算法笔记】B1032 挖掘机技术哪家强

    1032 挖掘机技术哪家强 (20 分) 为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第 1 行给出不超过 1 ...

  7. ASP.NET 设计模式分为三种类型

    设计模式分为三种类型,共23类.  一.创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式.      二.结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代 ...

  8. 青蛙的约会----POJ1061

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 133905   Accepted: 29707 Descript ...

  9. RMQ、POJ3264

    这里说几篇博客,建议从上到下看 https://blog.csdn.net/qq_31759205/article/details/75008659 https://blog.csdn.net/sgh ...

  10. python查看模块版本及所在文件夹

    # 以Numpy为例 第一种方法:import numpy as np np.__version__ >>> '1.12.1' np.__file__ >>> '/ ...