自己用java实现飞鸽传书 2 - 实现文件传输
第二步:实现文件传递。
上一步只是从服务端传递了一个字符串到客户端,这次需要对代码进行调整,实现从服务端获取文件,在客户端将文件存入目标地址。
调整后的代码:
服务端:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.ServerSocket;
import java.net.Socket; public class Server { public static void main(String[] args){
//创建服务端socket,用以网络信息的接收
ServerSocket serverSocket = null;
try {
//服务端socket使用本地IP,端口号使用36000
serverSocket = new ServerSocket(36000);
//保证服务端持续运行
while(true){
//接收网络信息,未接收到则阻塞当前线程
Socket socket = serverSocket.accept();
//将文件信息写入socket通信
writeFile(socket);
//关闭socket,防止客户端长时间等待
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 将文件信息写入socket通信流
* @param socket
* socket
*/
private static void writeFile(Socket socket){
try{
//获取本地文件
String filePath ="D:/test.pdf";
//创建文件对象
File file = new File(filePath);
//使用DataOutputStream传送文件信息
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
//写入文件名
dos.writeUTF(file.getName());
//写入文件大小
dos.writeLong(file.length());
//清空缓冲区
dos.flush();
//使用DataInputStream将文件写入
DataInputStream dis = new DataInputStream( new FileInputStream(file) );
byte[] buffer = new byte[1024];
int head = 0;
while((head=dis.read(buffer)) > 0){
dos.write(buffer, 0, head);
}
dis.close();
dos.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
客户端:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.net.Socket; public class Client { public static void main(String[] args){
DataInputStream input = null;
Socket clientSocket = null;
try {
//创建客户端socket,用以连接服务端
clientSocket = new Socket("127.0.0.1", 36000);
//读取服务端发送的信息流
input = new DataInputStream(clientSocket.getInputStream());
String fileName = input.readUTF();
long fileSize = input.readLong();
System.out.println("收到服务端发过来的文件,文件名称为:"
+ fileName + ",文件大小为:" + fileSize);
//将文件读入本地
String savePath = "E:\\just a test.pdf";
DataOutputStream fos = new DataOutputStream(new FileOutputStream(savePath));
byte[] buffer = new byte[1024];
int head = 0;
while((head=input.read(buffer)) > 0){
fos.write(buffer, 0, head);
} fos.close();
input.close();
clientSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
本次文件流的传送使用了DataOutputStream和DataInputStream,使用Data类型的字节流可以根据信息类型分别进行处理。
自己用java实现飞鸽传书 2 - 实现文件传输的更多相关文章
- 自己用java实现飞鸽传书 1 - 实现socket通信
第一步: 建立服务端客户端,实现端到端通信.因为要传递文件,信号量较大,故使用TCP/IP协议. 服务端和客户端都要建立socket,而后通过socket进行通信.目前只实现服务端到客户端的单向通信. ...
- Java Socket:飞鸽传书的网络套接字
在古代,由于通信不便利,一些聪明的人就利用鸽子会飞且飞得比较快.会辨认方向的优点,对其进行了驯化,用来进行消息的传递——也就是所谓的“飞鸽传书”.而在 Java 中,网络套接字(Socket)扮演了同 ...
- ubuntu下安装飞鸽传书
1.从官网下载Linux版本飞鸽传书(http://www.ipmsg.org.cn/) 2.解压后执行 ./QIpmsg 若报错 libstdc++.so.6: version `CXXABI_AR ...
- [Android源码]Android源码之高仿飞鸽传书WIFI热点搜索与创建(一)
(本文详情来源:android源码 http://www.eoeandroid.com/thread-296427-1-1.html 转载请注明出处!) [Android源码分享]飞鸽传书的An ...
- 飞鸽传书linux进程退出不彻底
问题描述: 飞鸽传书linux版本(QIpmsg)是有问题的. 在ubuntu14.04上运行的时候,没有任务栏图标,点击关闭也不能退出进程,端口仍然占用,无法再次运行. 这个问题截至1.2.1412 ...
- Mac 10.12安装飞鸽传书IPMessager
说明:这个版本的飞鸽传书不能和Linux的互通,但是可以和Windows的互通,我猜测是协议问题:如果想要互通只能是Mac和Linux同时安装iptux. 下载: (链接: https://pan.b ...
- Ubuntu+Mac使用飞鸽传书iptux进行互通
iptux不能直接与Mac版的IPMessage进行文件传输,但是可以和Windows的IPMessage进行互通.如果要实现Ubuntu和Mac下互通,就必须编译同一套代码,因为使用C++写的,所以 ...
- Win8 使用经验之飞鸽传书
参考资料: http://jingyan.baidu.com/article/c1a3101eb52cd8de656deba6.html Win8的UAC关闭不生效?彻底关闭Win8的UAC? 1. ...
- linux [Fedora] 下的 "飞秋/飞鸽传书"
官方网址: http://www.msec.it/blog/?page_id=11 http://software.opensuse.org/download.html?project=home:co ...
随机推荐
- 改变label中的某字体颜色
NSString *allString=@"你家在哪里,需要我送你么"; NSString *subString=@"在哪里"; UILabel *string ...
- 个案排秩 Rank (linear algebra) 秩 (线性代数)
非叫“秩”不可,有秩才有解_王治祥_新浪博客http://blog.sina.com.cn/s/blog_8e7bc4f801012c23.html 我在一个大学当督导的时候,一次我听一位老师给学生讲 ...
- pycharm调试
pycharm调试 flask app调试: 1.打开edit configurations面板 run===>edit configurations(图一或图二处都可以) 2.配置项目信息 点 ...
- 可采用两种方法得到一个EJB对象
(本文是转载其他人的技术文章,觉得说得挺浅显易懂,特借来学习) 在前面学习的例子中,只有一个EJB,但是对于一个真实的项目,EJB的数量可以有很多,而且EJB之间也会互相调用,那么在一个EJB ...
- 企业内部安全宣贯:乌云网停摆事件的思考与评论——By Me
2016年7月20日,“自由平等开放的漏洞报告平台”乌云网[1] 被迫停摆,包括乌云网创始人方小顿[2] 在内的多名高管突然被捕.乌云的存在可以说是为了修复人们长期缺失的安全意识和堪忧的安全生态,但是 ...
- struts 多文件上传 xml 版本
[本文简介] 本文将介绍 以配置 struts.xml 的方式 实现 多文件上传的功能. [文件夹结构] [struts.xml] <?xml version="1.0" ...
- git命令集合
git init # 初始化本地git仓库(创建新仓库) git config --global user.name "xxx" # 配置用户名 git config --glob ...
- pandas(三)汇总和计算描述统计
pandas对象有一些常用的数学和统计的方法,大部分都属于约简或汇总统计. SUM方法 DataFrame对象的sum方法,返回一个含有列小计的Series >>> df = Dat ...
- PHP获取与操作php.ini文件的几个函数示例
php有一套设置和获取配置信息的函数,用于设置与修改相关参数信息. 1.ini_get()获取配置参数,ini_set()设置配置参数 <?php 2.ini_get_all()获取所有配置 ...
- 快速排序算法Java版
网上关于快速排序的算法原理和算法实现都比较多,不过java是实现并不多,而且部分实现很难理解,和思路有点不搭调.所以整理了这篇文章.如果有不妥之处还请建议.首先先复习一些基础. 1.算法概念. ...