第二步:实现文件传递。

上一步只是从服务端传递了一个字符串到客户端,这次需要对代码进行调整,实现从服务端获取文件,在客户端将文件存入目标地址。

调整后的代码:

服务端:

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 - 实现文件传输的更多相关文章

  1. 自己用java实现飞鸽传书 1 - 实现socket通信

    第一步: 建立服务端客户端,实现端到端通信.因为要传递文件,信号量较大,故使用TCP/IP协议. 服务端和客户端都要建立socket,而后通过socket进行通信.目前只实现服务端到客户端的单向通信. ...

  2. Java Socket:飞鸽传书的网络套接字

    在古代,由于通信不便利,一些聪明的人就利用鸽子会飞且飞得比较快.会辨认方向的优点,对其进行了驯化,用来进行消息的传递——也就是所谓的“飞鸽传书”.而在 Java 中,网络套接字(Socket)扮演了同 ...

  3. ubuntu下安装飞鸽传书

    1.从官网下载Linux版本飞鸽传书(http://www.ipmsg.org.cn/) 2.解压后执行 ./QIpmsg 若报错 libstdc++.so.6: version `CXXABI_AR ...

  4. [Android源码]Android源码之高仿飞鸽传书WIFI热点搜索与创建(一)

    (本文详情来源:android源码 http://www.eoeandroid.com/thread-296427-1-1.html   转载请注明出处!)  [Android源码分享]飞鸽传书的An ...

  5. 飞鸽传书linux进程退出不彻底

    问题描述: 飞鸽传书linux版本(QIpmsg)是有问题的. 在ubuntu14.04上运行的时候,没有任务栏图标,点击关闭也不能退出进程,端口仍然占用,无法再次运行. 这个问题截至1.2.1412 ...

  6. Mac 10.12安装飞鸽传书IPMessager

    说明:这个版本的飞鸽传书不能和Linux的互通,但是可以和Windows的互通,我猜测是协议问题:如果想要互通只能是Mac和Linux同时安装iptux. 下载: (链接: https://pan.b ...

  7. Ubuntu+Mac使用飞鸽传书iptux进行互通

    iptux不能直接与Mac版的IPMessage进行文件传输,但是可以和Windows的IPMessage进行互通.如果要实现Ubuntu和Mac下互通,就必须编译同一套代码,因为使用C++写的,所以 ...

  8. Win8 使用经验之飞鸽传书

    参考资料: http://jingyan.baidu.com/article/c1a3101eb52cd8de656deba6.html Win8的UAC关闭不生效?彻底关闭Win8的UAC? 1. ...

  9. linux [Fedora] 下的 "飞秋/飞鸽传书"

    官方网址: http://www.msec.it/blog/?page_id=11 http://software.opensuse.org/download.html?project=home:co ...

随机推荐

  1. less-符号之逗号,空格,父级选择器

    Less符号 逗号 example: .test() { box-shadow+: inset 0 0 10px #555; } .study { .test(); box-shadow+: 0 0 ...

  2. python中pip工具的安装与使用

    1.在网址https://pip.pypa.io/en/latest/installing 下载get-pip.py文件,放在python更目录,如python3.6目录下 2.在dos命令行中进入g ...

  3. 翻页bug 在接口文档中应规范参数的取值区间

    <?php$a=array("red","green","blue","yellow","brown&q ...

  4. Open System Interconnection

    https://zh.wikipedia.org/wiki/Secure_Shell Secure Shell(缩写为SSH),由IETF的网络工作小组(Network Working Group)所 ...

  5. Eclipse打包java工程

    Eclipse打包java工程步骤如下: 1.选择预打包的工程->Export. 2.选择java->JAR file. 3.导出JAR文件设置. 这里有几个选项: Export gene ...

  6. php5.4 的 php-fpm 的重启

    php 5.3.3以后 源码中已经内嵌了 php-fpm,不用象以前的php版本一样专门打补丁了,只需要在configure的时候添加编译参数即可. 关于php-fpm的编译参数有 –enable-f ...

  7. 我的Android进阶之旅------>Android【设置】-【语言和输入法】-【语言】列表中找到相应语言所对应的列表项

    今天接到一个波兰的客户说有个APP在英文状态下一切运行正常,但是当系统语言切换到波兰语言的时候,程序奔溃了.所以首先我得把系统的语言切换到波兰语,问题是哪个是波兰语呢? 我还真的不认识哪个列表项代表着 ...

  8. Git的使用(1)

    一.Git简介 Git 是一个开源的分布式版本控制软件,用以有效.高速的处理从很小到非常大的项目版本管理. Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发.Git ...

  9. MyBatis For .NET学习- 初识MyBatis

    MyBatis的框架. Introduction MyBatis本是apache的一个开源项目iBatis,2010年这个项目由 apache software foundation迁移到了googl ...

  10. js验证真实姓名

    var regName = /^[\u4e00-\u9fa5]{2,4}$/; if (!regName.test(examinee.name)) { wx.showToast({ title: &q ...