很多朋友在使用socket编程时不可避免的都做过文件传输,而视频电影等需要一个字节一个字节的传输;
但是客户端一般都通过-1进行终止,服务也一样;但是存在的问题是客户端永远不会把-1传递给服务端;
因此经常会遇到服务端卡死报错;所以在传输时先把文件接收标示传递给服务端,比如文件长度,或者终止字符等

Server:

public class Server {

    public static void main(String[] args) throws Exception {
        ServerSocket server =new ServerSocket(8888);
        Socket client =server.accept();

        DataInputStream dis =new DataInputStream(client.getInputStream());
        long size =dis.readLong();
        String fileName =dis.readUTF();
        System.out.println("文件大大小为:"+size+",文件名为:"+fileName);

        String dir ="D:/tmp/";
        File dest =new File(dir+fileName);
        BufferedInputStream bis =new BufferedInputStream(client.getInputStream());
        BufferedOutputStream bos =new BufferedOutputStream(new FileOutputStream(dest));
        long readSize =0;
        while(true){
            if (readSize > size) {
                break;
            }
            int data =bis.read();
            bos.write(data);
            readSize++;
        }
        System.out.println("上传完毕");
        bos.flush();
    }
}

Client:

public class Client {
    public static void main(String[] args) throws Exception {
        Socket client =new Socket("localhost",8888);
        File src =new File("D:/spark-1.6.1-bin-hadoop2.6.tgz");
        String name =src.getName();
        long size =src.length();
        DataOutputStream dos =new DataOutputStream(client.getOutputStream());
        dos.writeLong(size);
        dos.writeUTF(name);
        dos.flush();

        BufferedInputStream bis =new BufferedInputStream(new FileInputStream(src));
        BufferedOutputStream bos =new BufferedOutputStream(client.getOutputStream());
        long writeSize =0;
        while(true){
            bos.write(bis.read());
            writeSize++;
            if(writeSize>size){
                break;
            }
        }
        bos.flush();

    }
}

运行方式:

  先启动server 再启动client

   

打印结果

  文件大大小为:289405702,文件名为:spark-1.6.1-bin-hadoop2.6.tgz
  上传完毕

Socket服务端和客户端文件传输的更多相关文章

  1. C# Socket服务端与客户端通信(包含大文件的断点传输)

    步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收 ...

  2. IE8下服务端获取客户端文件的路径为C:/fakePath问题的解决方案

    上一篇文章上提到,IE8下服务端获取客户端文件的路径时,会变成C:/fakePath问题,于是乎通过文件路径去获得文件大小就失败了. 上网搜了一下,主要原因是IE8因为安全考虑,在上传文件时屏蔽了真实 ...

  3. Python3学习之路~8.3 socket 服务端与客户端

    通过8.2的实例1-6,我们可以总结出来,socket的服务端和客户端的一般建立步骤: 服务端 步骤:1创建实例,2绑定,3监听,4阻塞,5发送&接收数据,6关闭. #Author:Zheng ...

  4. socket系列之socket服务端与客户端如何通信

    上面已经分别介绍了ServerSocket跟Socket的工作步骤,并且从应用层往系统底层剖析其运作原理,我们清楚了他们各自的一块,现在我们将把他们结合起来,看看他们是如何通信的,并详细讨论一下他们之 ...

  5. 使用zlib模块实现HTTP服务端与客户端实现传输数据压缩

    现如今在处理http请求的时候,由于请求的资源较多,如果不启用压缩的话,那么页面请求的流量将会非常大.启用gzip压缩,在一定程度上会大大的提高页面性能. 因此这写一个使用Node.js实现在http ...

  6. C# Socket服务端和客户端互相send和receive

    服务端           {          ];          ;                                       {                       ...

  7. PHP socket服务端与客户端的简易通信

    今天学习socket通信的同时,顺便整理了下以前初识socket的知识. 现在关于php的socket通信,有些框架已经十分成熟了,比如  swoole 和 workerman,这两个大家可以学习学习 ...

  8. golang的socket服务端与客户端

    服务端 服务端的处理流程 监听端口 接收客户端的链接 创建goroutine,处理该链接 package main import ( "fmt" "net" ) ...

  9. Socket服务端和客户端(C++,CodeBlocks+GCC编译)

    //main.cpp 1 #include "j_socket.h" #include <stdio.h> #include <pthread.h> ; j ...

随机推荐

  1. pull request的使用

    在git中,不少开发者对自己的提升非常看重,github中的开源项目就是一个非常好的学习资料. github中的开源项目并不是完全正确的,而成为项目贡献者是一件值得骄傲的事情. 所以如何才能对开源项目 ...

  2. js倒计时功能中newData().getTime()在iOS下会报错,显示 nan

    最近在做移动端项目 ,有个设置开始时间和结束时间,然后倒计时 这个活动还有几天.在安卓上能正确转换时间,但在iOS上不能显示,为NaN-NaN1-NaN  Invalid Date, 就好比new D ...

  3. sharepoint 2010 创建自定义的ASP.NET Web Service (上)

    项目背景 根据客户需求在SharePoint 2010 中创建自定义的ASP.NET Web Service可以分为3种方式(我所知道的).废话少说,下面一一列举: 创建方式 MSDN 官方博客自己的 ...

  4. 【LOJ#6036】[雅礼集训2017Day4]编码

    传送门 题意简述 判定 n 个含 ? 字符的二进制串是否存在一种把 0/1 填入 ? 中的方案使得任意两个串不具有前缀关系. (一个串最多一个 ?) Sol 二进制串 ,并且一个串最多一个 '?' 很 ...

  5. vue组件学习(二)

    父子组件之间的数据传递, 父传给子: 直接在组件上传,如:<count :number="2"> (冒号和不要冒号的区别,有冒号会自动转为相应的类型)在名为count的 ...

  6. UI Recorder安装与使用

    现在的互联网公司,普遍在尝试并执行敏捷开发模式,那么必然要涉及到频繁的更新迭代,在每次更新迭代时,老功能的回归成为了老大难.当系统日益复杂,涉及到的回归点逐渐增多,UI自动化测试即使成本在大,也需要提 ...

  7. echart-如何画自定义的图形,三角形为例

  8. AOP代理

  9. nasm不是内部或外部命令

    使用nasm编译汇编的源文件: nasm -f bin first.asm -o first.bin 报错:nasm不是内部或外部命令,这种错误一看就知道,是没有配置环境变量. 点开后,选择path, ...

  10. 【bzoj1146】[CTSC2008]网络管理Network

    题目描述: M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条 ...