本文实例为大家分享了java实现客户端向服务器发送文件的具体代码,供大家参考,具体内容如下

服务器源代码:

import java.io.BufferedReader;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.ServerSocket;

import java.net.Socket;

/**

*

* 文件名:ServerReceive.java

* 实现功能:作为服务器接收客户端发送的文件

*

* 具体实现过程:

* 1、建立SocketServer,等待客户端的连接

* 2、当有客户端连接的时候,按照双方的约定,这时要读取一行数据

* 其中保存客户端要发送的文件名和文件大小信息

* 3、根据文件名在本地创建文件,并建立好流通信

* 4、循环接收数据包,将数据包写入文件

* 5、当接收数据的长度等于提前文件发过来的文件长度,即表示文件接收完毕,关闭文件

* 6、文件接收工作结束

*

*

* 【注:此代码仅为演示客户端与服务器传送文件使用,

* 每一个数据包之前没有文件协议命令

* 具体的协议传输和文件传出的使用阶段可根据自己程序自行放置】

*

*

* 作者:小菜鸟

* 创建时间:2014-08-19

*

* */

public class ServerReceive {

public static void main(String[] args) {

/**与服务器建立连接的通信句柄*/

ServerSocket ss = null;

Socket s = null;

/**定义用于在接收后在本地创建的文件对象和文件输出流对象*/

File file = null;

FileOutputStream fos = null;

/**定义输入流,使用socket的inputStream对数据包进行输入*/

InputStream is = null;

/**定义byte数组来作为数据包的存储数据包*/

byte[] buffer = new byte[4096 * 5];

/**用来接收文件发送请求的字符串*/

String comm = null;

/**建立socekt通信,等待服务器进行连接*/

try {

ss = new ServerSocket(4004);

s = ss.accept();

} catch (IOException e) {

e.printStackTrace();

}

/**读取一行客户端发送过来的约定信息*/

try {

InputStreamReader isr = new InputStreamReader(s.getInputStream());

BufferedReader br = new BufferedReader(isr);

comm = br.readLine();

} catch (IOException e) {

System.out.println("服务器与客户端断开连接");

}

/**开始解析客户端发送过来的请求命令*/

int index = comm.indexOf("/#");

/**判断协议是否为发送文件的协议*/

String xieyi = comm.substring(0, index);

if(!xieyi.equals("111")){

System.out.println("服务器收到的协议码不正确");

return;

}

/**解析出文件的名字和大小*/

comm = comm.substring(index + 2);

index = comm.indexOf("/#");

String filename = comm.substring(0, index).trim();

String filesize = comm.substring(index + 2).trim();

/**创建空文件,用来进行接收文件*/

file = new File(filename);

if(!file.exists()){

try {

file.createNewFile();

} catch (IOException e) {

System.out.println("服务器端创建文件失败");

}

}else{

/**在此也可以询问是否覆盖*/

System.out.println("本路径已存在相同文件,进行覆盖");

}

/**【以上就是客户端代码中写到的服务器的准备部分】*/

/**

* 服务器接收文件的关键代码*/

try {

/**将文件包装到文件输出流对象中*/

fos = new FileOutputStream(file);

long file_size = Long.parseLong(filesize);

is = s.getInputStream();

/**size为每次接收数据包的长度*/

int size = 0;

/**count用来记录已接收到文件的长度*/

long count = 0;

/**使用while循环接收数据包*/

while(count < file_size){

/**从输入流中读取一个数据包*/

size = is.read(buffer);

/**将刚刚读取的数据包写到本地文件中去*/

fos.write(buffer, 0, size);

fos.flush();

/**将已接收到文件的长度+size*/

count += size;

System.out.println("服务器端接收到数据包,大小为" + size);

}

} catch (FileNotFoundException e) {

System.out.println("服务器写文件失败");

} catch (IOException e) {

System.out.println("服务器:客户端断开连接");

}finally{

/**

* 将打开的文件关闭

* 如有需要,也可以在此关闭socket连接

* */

try {

if(fos != null)

fos.close();

} catch (IOException e) {

e.printStackTrace();

}//catch (IOException e)

}//finally

}//public static void main(String[] args)

}//public class ServerReceive

客户端源代码:

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.OutputStream;

import java.io.PrintStream;

import java.net.Socket;

/**

*

* 文件名:ClientSend.java

* 实现功能:作为客户端向服务器发送一个文件

*

* 具体实现过程:

* 1、建立与服务器端的连接,IP:127.0.0.1, port:4004

* 2、将文件的名字和大小通过自定义的文件传输协议,发送到服务器

* 3、循环读取本地文件,将文件打包发送到数据输出流中

* 4、关闭文件,结束传输

*

* 【注:此代码仅为演示客户端与服务器传送文件使用,

* 每一个数据包之前没有文件协议命令

* 具体的协议传输和文件传出的使用阶段可根据自己程序自行放置】

*

*

* 作者:小菜鸟

* 创建时间:2014-08-19

*

* */

public class ClientSend {

public static void main(String[] args) {

/**与服务器建立连接的通信句柄*/

Socket s = null;

/**定义文件对象,即为要发送的文件

* 如果使用绝对路径,不要忘记使用'/'和'\'的区别

* 具体区别,请读者自行查询

* */

File sendfile = new File("API.CHM");

/**定义文件输入流,用来打开、读取即将要发送的文件*/

FileInputStream fis = null;

/**定义byte数组来作为数据包的存储数据包*/

byte[] buffer = new byte[4096 * 5];

/**定义输出流,使用socket的outputStream对数据包进行输出*/

OutputStream os = null;

/**检查要发送的文件是否存在*/

if(!sendfile.exists()){

System.out.println("客户端:要发送的文件不存在");

return;

}

/**与服务器建立连接*/

try {

s = new Socket("127.0.0.1", 4004);

}catch (IOException e) {

System.out.println("未连接到服务器");

}

/**用文件对象初始化fis对象

* 以便于可以提取出文件的大小

* */

try {

fis = new FileInputStream(sendfile);

} catch (FileNotFoundException e1) {

e1.printStackTrace();

}

/**首先先向服务器发送关于文件的信息,以便于服务器进行接收的相关准备工作

* 具体的准备工作,请查看服务器代码。

*

* 发送的内容包括:发送文件协议码(此处为111)/#文件名(带后缀名)/#文件大小

* */

try {

PrintStream ps = new PrintStream(s.getOutputStream());

ps.println("111/#" + sendfile.getName() + "/#" + fis.available());

ps.flush();

} catch (IOException e) {

System.out.println("服务器连接中断");

}

/**

* 此处睡眠2s,等待服务器把相关的工作准备好

* 也是为了保证网络的延迟

* 读者可自行选择添加此代码

* */

try {

Thread.sleep(2000);

} catch (InterruptedException e1) {

e1.printStackTrace();

}

/**之前的准备工作结束之后

* 下面就是文件传输的关键代码

* */

try {

/**获取socket的OutputStream,以便向其中写入数据包*/

os = s.getOutputStream();

/** size 用来记录每次读取文件的大小*/

int size = 0;

/**使用while循环读取文件,直到文件读取结束*/

while((size = fis.read(buffer)) != -1){

System.out.println("客户端发送数据包,大小为" + size);

/**向输出流中写入刚刚读到的数据包*/

os.write(buffer, 0, size);

/**刷新一下*/

os.flush();

}

} catch (FileNotFoundException e) {

System.out.println("客户端读取文件出错");

} catch (IOException e) {

System.out.println("客户端输出文件出错");

}finally{

/**

* 将打开的文件关闭

* 如有需要,也可以在此关闭socket连接

* */

try {

if(fis != null)

fis.close();

} catch (IOException e) {

System.out.println("客户端文件关闭出错");

}//catch (IOException e)

}//finally

}//public static void main(String[] args)

}//public class ClientSend

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持聚米学院。

Java服务端向客户端写文件_java实现客户端向服务器发送文件相关推荐

  1. QtJava笔记-Qt与Java进行SSL双向认证(Qt客户端,Java服务端)

    这里使用Java作为服务端,使用Qt作为客户端. 程序运行截图如下: 这里的证书Qt使用的p12,Java使用的jks,看以前的博文生成. 源码打包下载地址: https://github.com/f ...

  2. C++客户端和java服务端互相加解密

    这段时间在公司做一个APP和移动网关通信加密的项目,本来是想采用https或者openssl来加密通道,但考虑到数据本身的安全性问题,还是打算自己编写加解密算法. 一.流程 1.客户端生成AES密钥和 ...

  3. 精品手游小精灵大作战源码 安卓+IOS+H5三端Cocos Creator 客户端 JAVA服务端

    小精灵大作战 数据库说明 数据库使用MySQL,推荐管理软件Navicat For MySQL. 创建数据库命名为pet_battle,字符集选用utf8 -- UTF-8 Unicode,排序规则选 ...

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

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

  5. Flex通信-Java服务端通信实例

    Flex与Java通信的方式有很多种,比较常用的有以下方式: WebService:一种跨语言的在线服务,只要用特定语言写好并部署到服务器,其它语言就可以调用 HttpService:通过http请求 ...

  6. 那些年,我们见过的 Java 服务端乱象

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 Photo by The Book Tutor @Youtube 文 | 陈昌毅 导读 查尔斯 ...

  7. 五子棋服务端程序java_9网上五子棋对战(java)服务端源码

    9网上五子棋对战(java)服务端源码 网上五子棋对战(java)服务端源码 /* 五子棋游戏是本人在学习java swing时写的一个程序,程序分两部分:服务器端和客户端.运行程序时先运行服务器端, ...

  8. 前端(Javascript) + JAVA 服务端如何处理 HTTP 断点续传

    需求场景 为什么需要断点续传? 假如在生产环境客户或操作上传一个很大的文件(可能有1个G),由于现场网络环境很差,上传到0.5个G的时候突然网络断开了,又要重新上传.客户或操作深吸了一口气,重新上传了 ...

  9. 聊一聊 Java 服务端中的乱象

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:阿里巴巴中间件 查尔斯·狄更斯在<双城记>中写道 ...

最新文章

  1. RDKit | BCUT:基于分子图结构的二维描述符
  2. [转]十分钟搞定Vue搭建
  3. Android存储路径你了解多少?
  4. linux卸载mariadb数据库,CentOS yum 安装、卸载MariaDB数据库
  5. python 爬虫 微博 github_GitHub - peanut-shi/weiboSpider: 新浪微博爬虫,用python爬取新浪微博数据...
  6. Patchwork Quilting(拼布和绗缝)
  7. Military Problem CodeForces 1006E (dfs序)
  8. 武汉Apache Hadoop大数据平台,金融行业如何搭建大数据平台?数据采集、分析、处理如何实现?...
  9. php 替换alt,PHP 实现自动添加或者替换 内容的IMG标签的 alt title 属性
  10. 用Python和Pygame写游戏-从入门到精通(实战三:植物大战僵尸1)
  11. html 显示闹钟,闹钟设置.html
  12. 如何提高平面设计的思维转向
  13. 2.灰尘对计算机的影响,灰尘对电脑有影响不?
  14. 联想android刷机教程,超详细的联想刷机教程~带你嘻刷刷
  15. photoshop 安装和使用 蓝湖上传设计图
  16. 5. 穿过拥挤的人潮,Spring已为你制作好高级赛道
  17. Microsoft Edge 浏览器cpu占用率莫名升高
  18. Solidity代码规范(官方建议)
  19. 应广PMS171B(1)--概述配置端口输出高低电平
  20. 套料软件XSuperNEST产品及成功因素介绍

热门文章

  1. arcgis10.1连接sqlserver数据库常见问题(转载)
  2. [2017.02.07] Lua入门学习记录
  3. 微信公众平台开发--判断终端使用的浏览器是否是微信浏览器
  4. linux 文件格式压缩
  5. PHP CI框架如何去掉 sql 里的反引号
  6. CreateFeatureClass COM异常
  7. java获取C盘下的隐藏目录文件名称
  8. CF245H Queries for Number of Palindromes
  9. [转载]监控 Linux 性能的 18 个命令行工具
  10. XML万能数据库设计