自己用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 ...
随机推荐
- c# public private protected internal protected internal
一个 访问修饰符 定义了一个类成员的范围和可见性.C# 支持的访问修饰符如下所示: public:所有对象都可以访问: private:对象本身在对象内部可以访问: protected:只有该类对象及 ...
- Nginx-rtmp直播之业务流程分析 http://www.mamicode.com/info-detail-2287896.html
Nginx-rtmp直播之业务流程分析 http://www.mamicode.com/info-detail-2287896.html
- 接口测试工具 — jmeter(参数化)
1.用户定义的变量 添加一个用户定义的变量 添加变量值 2.函数生成器 函数生成 随机数生成 取当前时间 3.从文件中读取 1)新建一个TXT文档,录入数据 2)读取文件 3)使用数据,用 ${pho ...
- 基于vue + typescrpt +vuecli 搭建开发环境
打算学习typeScript与vue集成,先放几个链接,留着自己学习用,后续自己写使用新的~ https://segmentfault.com/a/1190000013676663 https://j ...
- 迭代器模拟for循环
s = 'wgugq wgugfgfqwihqwohd' it = s.__iter__() # 生成一个迭代器 while 1: try: # 尝试 el = it.__next__() # 下一个 ...
- Django的model模型
一:字段选项 1,null =True 表示数据库的中可以存为null 默认值是False 2,blank=True 表示字段可以为空 默认值是False 3,chioces 由二项元组构成的一 ...
- mui请求数据
var rh = new Object(); rh.ReqId = "ls123"; rh.Salt = "sssseee"; var rb = new Obj ...
- Android Studio 启动时不自动打开项目
主界面中,选择单击菜单栏 File ,单击 Settings 选择 Appearance & Behavior 选项.选择System Settings选项.取消勾选Reopen last p ...
- lucene实现初级搜索引擎
一.系统设计 搜索引擎项目代码主要分为三个部分,第一部分是构建索引,全文检索:第二部分是输入问题,对问题进行分词.提取关键词.关键词扩展:第三部分是将搜索结果输出到GUI图形用户界面. 二.搜索引擎 ...
- Hadoop集群的配置的主机和IP
集群配置如下: hadoop 192.168.80.100 hadoop1 192.168.80.101 hadoop2 192.168.80.102 (注:ha ...