只实现了传送文件的功能。

编写Socket客户端和服务器程序,客户端读取本地文件的数据,发送到服务器,服务器接收并存储到文件中。

消息格式:

字段 长度(单位字节) 内容

--------------------------------------------------------------------

len 8 整个消息长度,不包括这4个字节,类型为long

file_name_length 1 文件名长度,byte

file_name file_name_length 文件名,String

data_length 8 文件数据长度,long

data data_length 文件数据

mac 8 消息的MAC码,byte

客户端执行:

java FileClient -i 192.168.1.171 -p 8888 -f localFileName -r remoteFileName

服务器能连续不断的服务。

服务器端:

1 packagetest.socket;2

3 importjava.io.BufferedInputStream;4 importjava.io.BufferedOutputStream;5 importjava.io.DataInputStream;6 importjava.io.DataOutputStream;7 importjava.io.FileOutputStream;8 importjava.io.IOException;9 importjava.net.ServerSocket;10 importjava.net.Socket;11

12 public classFileServer {13 private int port = 4000;14

15 public FileServer(intport){16 this.port =port;17 }18

19 voidstart(){20 Socket socket = null;21 ServerSocket server = null;22 DataInputStream inputStream = null;23 DataOutputStream fileOut = null;24 long len = 0;25 int bufferSize = 8192; //缓冲区大小

26 byte[] buf = new byte[bufferSize];27 String savePath = null;28 while (true) {29 try{30 server = newServerSocket(port);31 socket =server.accept();32 System.out.println("建立socket链接");33

34 savePath = "d:\\\\";35 inputStream = new DataInputStream(newBufferedInputStream(socket.getInputStream()));36 savePath += inputStream.readUTF(); //接收从客户端传来的文件名

37

38 int passedlen = 0; //文件大小

39 len = inputStream.readLong(); //接收从客户端传来的文件的大小

40 fileOut = new DataOutputStream(new BufferedOutputStream(newFileOutputStream(savePath)));41 System.out.println("文件的长度为:" + len + "\n");42 System.out.println("开始接收文件!" + "\n");43 while (true) {44 int read = 0;45 if (inputStream != null) {46 read =inputStream.read(buf);47 }48 passedlen +=read;49 if (read == -1) { //文件末尾

50 break;51 }52 //打印传输百分比

53 System.out.println("文件接收了" + (passedlen * 100L/ len) + "%");54 fileOut.write(buf, 0, read);55 }56 fileOut.close();57 inputStream.close();58 System.out.println("接收完成,文件存为" +savePath);59 }60 //}

61 catch(NumberFormatException e) {62 e.printStackTrace();63 }64 catch(IOException e){65 e.printStackTrace();66 }67 finally{68 try{69 if(null !=server){70 socket.close();71 server.close();72 }73 }74 catch(IOException e) {75 e.printStackTrace();76 System.out.println("出错了");77 }78 }79 }80 }81

82 public static voidmain(String[] args){83 String usageMsg = "格式错误,请在带参数的eclipse下按照格式输入:\r\n"

84 + "java FileServer -p port";85 int port = 4000; //默认端口是4000

86

87 if (2 !=args.length){88 System.out.println(usageMsg);89 System.exit(1);90 }91

92 for (int i = 0; i < args.length; i++){93 if (args[i].equals("-p") || args[i].equals("-P")){94 port = Integer.parseInt(args[i+1]);95 break;96 }97 }98 newFileServer(port).start();99 }100 }

客户端:

packagetest.socket;importjava.io.BufferedInputStream;importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.net.Socket;public classFileClient {private int port = 4000; //默认短裤为4000

private String ipAddress = "localhost"; //默认地址是本机

privateString localFileName;privateString remoteFileName;public FileClient(intport,String ipAddress,String localFileName,String remoteFileName){this.port =port;this.ipAddress =ipAddress;this.localFileName =localFileName;this.remoteFileName =remoteFileName;

}voidstart(){int bufferSize = 8192;byte[] buf = new byte[bufferSize];

Socket socket= null;//读取文件

DataInputStream is = null;//输出数据到服务器端

DataOutputStream os = null;try{

File localFile= newFile(localFileName);//本地保存路径,文件名会自动从服务器端继承而来。

socket = newSocket(ipAddress, port);//发送数据到服务器端

is = new DataInputStream(new BufferedInputStream(newFileInputStream(localFileName)));

os= newDataOutputStream(socket.getOutputStream());//传送localFile文件名和remoteFile文件

os.writeUTF(remoteFileName);

os.flush();

os.writeLong((long) localFile.length());

os.flush();while (true) {int read = 0;if (is != null) {

read=is.read(buf);

}if (read == -1) {break;

}

os.write(buf,0, read);

}

os.flush();

os.close();

is.close();

}catch(IOException e){

e.printStackTrace();

System.out.println("接收消息错误" + "\n");

}finally{if( null !=socket){try{

socket.close();

System.out.println("文件传输完成");

}catch(IOException e) {

e.printStackTrace();

}

}

}

}public static voidmain(String[] args) {

String usageMsg= "格式错误,请在带参数的eclipse下按照格式输入:\r\n"

+ "java FileClient -i ipAddress"

+ "-p port -f localFileName -r remoteFileName";int port = 4000;

String ipAddress= null;

String localFileName= null;

String remoteFileName= null;if(8 !=args.length){

System.out.println(usageMsg);

System.exit(1);

}for(int i = 0; i < args.length; i++){if(args[i].equals("-p") || args[i].equals("-P")){

port= Integer.parseInt(args[i+1]);

}else if(args[i].equals("-i") || args[i].equals("-I")){

ipAddress= args[i+1];

}else if(args[i].equals("-f") || args[i].equals("-F")){

localFileName= args[i+1];

}else if(args[i].equals("-r") || args[i].equals("-R")){

remoteFileName= args[i+1];

}

}newFileClient(port,ipAddress,localFileName,remoteFileName).start();

}

}

java接收并存储文件_客户端读取本地文件的数据,发送到服务器,服务器接收并存储到文件中...相关推荐

  1. 基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互

    基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互 一.前言 1.Java服务端程序代码的项目名为TcpSocketServerOfJava,包名为com.exam ...

  2. web端读取本地excel表数据

    听说发文有积分,我就来试试了,请大家不要喷我,我只是个孩子. 使用的js插件是js-xlsx,下载地址:https://github.com/SheetJS/js-xlsx,大家可以自行下载. var ...

  3. 如何将本地python项目部署到服务器上_如何将本地的Django项目部署到云服务器

    如何将本地的Django项目部署到云服务器 开发环境 开发语言: Python 后台框架:Django 前端框架:bootstrap web服务器:nginx wsgi服务器:uwsgi 查看本地项目 ...

  4. python 串口读取地磅仪表_串口读取称或是地磅数据

    论坛里经常碰到称或是地磅对接的问题,想当年我也是一路问过来啊,自动一人在客户那磨练下就知道怎么做的了,今天总结下吧.我接触的称或是地磅都是串口输出数据,貌似都是串口输出(可能有别的我没接触到的). 1 ...

  5. form提交后台注解拿不到数据_浏览器是如何将用户数据发送到服务器的?

    今天是刘小爱学习Java的第89天. 感谢你的观看,谢谢你. 话不多说,开始今天的学习: 在学习之前,先思考如下问题: 对于浏览器来说: 如何将用户数据发送到服务器呢? 数据传输的格式是怎么样的呢? ...

  6. java 原生 json 转 xml java json转xml 实现代码 读取本地json文件 转成 xml数据 用springboot 发布xml格式数据

    结果xml截图 json数据 main启动 import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; ...

  7. python 浏览器显示本地文件夹_浏览器读取本地文件

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  8. java调用微信加密_用spring搭建微信公众号开发者模式下服务器处理用户消息的加密传输构架(java)...

    要搭建加密传输的微信公众号消息传输,首先要在开发这平台下载一下微信加密的相关jar包,并做一些准备.准备的步骤如下: 1.打开开发者文档,找到消息加减密--->接入指引,如下图所示: 2.在页面 ...

  9. Java 线程池 +生产者消费者+MySQL读取300 万条数据

    1.1需求 数据库300 万条用户数据 ,遍历获取所有用户, 各种组合关联, 获取到一个新的json ,存到redis 上. 1.2 难点 数据库比较多, 不可能单线程查询所有的数据到内存. 1.3解 ...

最新文章

  1. php 为什么定义常量,php-将预定义常量定义为什么
  2. 学习 lodash 源码整体架构,打造属于自己的函数式编程类库
  3. html静态页面引用其他页面,Shtml完美解决静态页面内部调用其他页面(非Iframe、Object、Js方法)...
  4. mysql关键字使用顺序_MySQL数据库之单表查询中关键字的执行顺序
  5. chrome本地文件加载跨域请求
  6. oracle的hr工资待遇,oracle的hr用户里employees表
  7. drtek收音机使用说明_美国人拿本国收音机与中国德生PL380做对比,结果怎么样?...
  8. ORACLE数据库常见问题诊断方法 ---(常见错误篇)
  9. Cocos2dx 之 PhysicsHandler 简单实现
  10. [Search Engine] 搜索引擎技术之查询处理
  11. IBM计划收购Resilient Systems以扩大安全事件响应能力
  12. 2019 数学建模 省一·国赛(高教杯-C题 “互联网+”时代的出租车资源配置
  13. WEP/WPA/WPA2/WPA3初识
  14. Arcgis中topolopy(摘自网络)
  15. redis crackit入侵事件总结
  16. 企业员工全面激励训练整体解决方案 (节选)
  17. 键盘鼠标是计算机标准输入输出设备,微型计算机输入输出设备之键盘和鼠标(ppt 32页).ppt...
  18. Python+班级管理系统 毕业设计-附源码171809
  19. 有一个棋盘,有64个方格,在第一个方格里面放1粒芝麻重量是0.00001kg,第二个里面放2粒,第三个里面放4,棋盘上放的所有芝麻的重量
  20. ApacheCN 翻译活动进度公告 2019.4.23

热门文章

  1. clustered和nonclustered索引的区别
  2. MyBatis框架学习笔记02:利用MyBatis实现CRUD操作
  3. Java案例:Java版生命游戏
  4. 统计学基础学习笔记:正态分布
  5. 安卓学习笔记13:安卓触摸事件
  6. 【BZOJ1003】【codevs1655】物流运输,最短路+DP
  7. mybatis plus使用雪花算法_11.雪花算法与精度丢失
  8. 电脑怎么改网络ip地址_电脑的桌面路径怎么改?
  9. 2017.2.19 loli测试
  10. Intel超线程技术 Hyper-Threading Technology (3) - 处理器资源与超线程(复制的资源)