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

  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. 笔记都在代码里面
时间: 2024-10-26 16:32:38

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

java接受从安卓客户端发送过来的get请求时,出现乱码的解决思路及方法

今天下午遇到了这样一个感觉很常见的问题,但是度娘了N遍,却始终找不到有效的解决方法,于是乎,在苦求他人无果的情况下,研究出了一种简单有效的方法,具体实现思路如下: (1).让安卓客户端在发送get请求之前,先通过String str = URLEncode.encode(str, "utf-8");指定编码格式为UTF-8:这样安卓客户端在给服务器端发送请求时就会以UTF-8的格式发送. (2).服务器端通过request.getParameter("str");方

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

前言:在刚学习的时候,切记不能粘贴复制,更不能眼高手低,再简单的代码,都要自己独立动手写. 第一步:目录结构 第二步:代码区 Student.java:(一个学生的实体类) 1 package com.mon11.day13.collection.po; 2 /** 3 * 类说明 :实体类 4 * @author 作者 : Administrator 5 * @version 创建时间:2017年11月13日 6 */ 7 public class Student { 8 9 private

经测试,unity客户端发送消息给服务器,然后服务器控制PLC的方案完全是可行的!

1.unity 2. 3. 4.服务器: 5.PLC 博图软件: 6. 7. 8. 9. 手机测试,没问题.

[原创]java WEB学习笔记18:java EE 中的MVC 设计模式

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

Java Servlet学习笔记

Java Servlet组件 Java Servlet组件的原理及编程 Java Servlet 的配置和生命周期 Servlet的生命周期:     1,创建servlet对象时,会调用init方法进行初始化     2,任何来自客户端的请求,都会调用service方法服务     3,当servlet销毁之前,会调用destory方法进行销毁 Servlet原理 Servlet: Server服务器  let小型程序 运行在服务器端的小型程序. 请求是以线程的方式访问目标Servlet! S

Java并发学习之五——线程的睡眠和恢复

本文是学习网络上的文章时的总结,感谢大家无私的分享. 1.Thread类的sleep方法,可以使线程睡眠.此方法接收一个整数作为参数,表示线程暂停运行的毫秒数.在调用sleep方法后,当时间结束时,JVM会安排他们CPU时间,线程会继续按指令执行. 另一种可能是使用一个有TimeUnit列举元素的sleep方法,使用线程类的sleep方法让当前线程睡眠,但是它接收的参数单位后会转成毫秒的. 2.当你调用sleep()方法,Thread离开CPU并在一段时间内停止运行.在这段时间内,他是不消耗CP

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

1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,blog和wiki,主要的版本有0.91, 1.0, 2.0.使用RSS订阅能更快地获取信息,网站提供RSS输出,有利于让用户获取网站内容的最新更新.网络用户可以在客户端借助于支持RSS的聚合工具软件,在不打开网站内容页面的情况下阅读支持RSS输出的网站内容. 例如如下的网易RSS订阅: 2.由于我们这

[原创]java WEB学习笔记6:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

[原创]java WEB学习笔记44:Filter 简介,模型,创建,工作原理,相关API,过滤器的部署及映射的方式,Demo

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------