Socket服务端和客户端文件传输
很多朋友在使用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服务端和客户端文件传输的更多相关文章
- C# Socket服务端与客户端通信(包含大文件的断点传输)
步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤: (1)建立一个Socket (2)接收 ...
- IE8下服务端获取客户端文件的路径为C:/fakePath问题的解决方案
上一篇文章上提到,IE8下服务端获取客户端文件的路径时,会变成C:/fakePath问题,于是乎通过文件路径去获得文件大小就失败了. 上网搜了一下,主要原因是IE8因为安全考虑,在上传文件时屏蔽了真实 ...
- Python3学习之路~8.3 socket 服务端与客户端
通过8.2的实例1-6,我们可以总结出来,socket的服务端和客户端的一般建立步骤: 服务端 步骤:1创建实例,2绑定,3监听,4阻塞,5发送&接收数据,6关闭. #Author:Zheng ...
- socket系列之socket服务端与客户端如何通信
上面已经分别介绍了ServerSocket跟Socket的工作步骤,并且从应用层往系统底层剖析其运作原理,我们清楚了他们各自的一块,现在我们将把他们结合起来,看看他们是如何通信的,并详细讨论一下他们之 ...
- 使用zlib模块实现HTTP服务端与客户端实现传输数据压缩
现如今在处理http请求的时候,由于请求的资源较多,如果不启用压缩的话,那么页面请求的流量将会非常大.启用gzip压缩,在一定程度上会大大的提高页面性能. 因此这写一个使用Node.js实现在http ...
- C# Socket服务端和客户端互相send和receive
服务端 { ]; ; { ...
- PHP socket服务端与客户端的简易通信
今天学习socket通信的同时,顺便整理了下以前初识socket的知识. 现在关于php的socket通信,有些框架已经十分成熟了,比如 swoole 和 workerman,这两个大家可以学习学习 ...
- golang的socket服务端与客户端
服务端 服务端的处理流程 监听端口 接收客户端的链接 创建goroutine,处理该链接 package main import ( "fmt" "net" ) ...
- Socket服务端和客户端(C++,CodeBlocks+GCC编译)
//main.cpp 1 #include "j_socket.h" #include <stdio.h> #include <pthread.h> ; j ...
随机推荐
- STL容器Map
Map的常见函数 Map的实现机制 STL中的Map底层实现机制是RB树(红-黑树)
- amazon-aws 使用 SNS 发送短信
jar-maven <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-sns --> <depen ...
- windows 10 x64系统 jdk1.7、jdk1.8 切换(jdk为exe安装版本)
电脑先安装的1.7,后来安装1.8,改JAVA_HOME为1.8后cmd->java.javac.java -version可用1.8 后想改为1.7,更改环境变量(步骤1)后cmd->j ...
- DDD领域驱动设计初探(二):仓储Repository(上)
前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...
- CF261E Maxim and Calculator (质数,完全背包)
CF261E Maxim and Calculator 题目大意: 有两个初始参数 $ a=1 $ , $ b=0 $ ,你可以对它们进行两个操作: $ b~+=1 $ 或 $ a~\times =b ...
- 【洛谷P2398】GCD SUM
题目大意:求 \[\sum\limits_{i=1}^n\sum\limits_{j=1}^ngcd(i,j)\] 题解: 最重要的一步变换在于. \[\sum\limits_{k=1}^n k \s ...
- React 应用设计之道 - curry 化妙用
使用 React 开发应用,给予了前端工程师无限"组合拼装"快感.但在此基础上,组件如何划分,数据如何流转等应用设计都决定了代码层面的美感和强健性. 同时,在 React 世界里提 ...
- 1.使用kubeadm安装kubernetes
一.环境准备 所有规划主机(一台master,两台node)均需操作 1.关闭防火墙,selinux [root@node1 ~]# systemctl stop firewalld [root@no ...
- MySQL集群安装与配置
MySQL集群安装与配置 文章目录 [隐藏] 一.mysql集群安装 二.节点配置 三.首次启动节点 四.测试服务是否正常 五.安全关闭和重启 MySQL Cluster 是 MySQL 适合于分 ...
- mysql NOT NULL约束 语法
mysql NOT NULL约束 语法 作用:约束强制列不接受 NULL 值. 东莞大理石平台 说明:NOT NULL 约束强制字段始终包含值.这意味着,如果不向字段添加值,就无法插入新记录或者更新记 ...