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实现客户端向服务器发送文件的操作,布布扣,bubuko.com

时间: 2024-08-04 05:00:41

java实现客户端向服务器发送文件的操作的相关文章

介绍一款chrom浏览器插件 DHC是一款使用chrome模拟REST客户端向服务器发送测试数据的谷歌浏览器插件

先打个小广告哈 公司招java架构师,月薪25K以上,负责电商平台架构工作,工作地点在北京 1号线永安里站 附近,如有意向 请把简历发我邮箱[email protected] 可以内部推荐. DHC是一款使用chrome模拟REST客户端向服务器发送测试数据的谷歌浏览器插件. DHC的开发背景 在web开发中,服务器端和客户端的开发和测试必不可少,但是测试的工作往往需要服务器端完成之后,客户端才能进行测试,这无疑延后了测试流程,导致服务器端开发完成后,无法进行充分的数据测试,很容易造成服务器端和

android 向服务器Get和Post请求的两种方式,android向服务器发送文件,自己组装协议和借助第三方开源

/** * @author [email protected] * @time 20140606 */ package com.intbird.utils; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream

C语言 Socket入门示例1—— 单工通信(客户端向服务器发送消息)

如果对Windows API不太熟悉.对TCP/IP通信协议不太熟悉,或者对C语言本身不太熟悉的话,学习Socket会有点难受的.以前学习操作系统的时候,被API吓怕了,很多莫名其妙的API有着多如牛毛的参数,令人费解.学习计算机网络的时候,又有那么多的协议,并且很多协议本身比较复杂,什么三次握手建立连接,什么四次握手释放链接等等,也没有学得特别透彻.更遗憾的是,以前学C的时候,误以为自己把C学会了,误以为C就那么几个头文件而已,就一个黑框子而已. 现在,经过一段时间的痛苦磨练,又有了一些新的认

C语言 Socket入门示例2——模拟远程CMD(客户端向服务器发送命令,服务端执行该命令)

只要把上一篇文章"C语言 Socket入门示例1"中的两段程序彻底搞懂,那么再看本文就没有任何难度了,因为仅仅是对上篇文章中服务端代码的简单修改扩充.但是简单修改过后,功能变得异常强大,犹如一个远程CMD.随着不断深入学习,功能将会变得越来越强大.欢迎大家评论指点. 1.服务端(Server): #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib")

[JAVA] Tcp客户端和服务器简单代码

服务器: 1 import java.io.DataInputStream; 2 import java.io.DataOutputStream; 3 import java.io.IOException; 4 import java.net.ServerSocket; 5 import java.net.Socket; 6 7 public class TcpServer { 8 public static void main(String [] args) throws IOExceptio

C语言Socket-模拟远程CMD(客户端向服务器发送命令,服务器执行该命令)

服务端(server) #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") //把ws2_32.lib加到Link页的连接库 #define PORT 15001 //通信的端口(指服务器端) #define ERROR 0 #define BUFFER_SIZE 1024 //注意:此Server端数据接收缓冲区 >= Client端数据发送缓冲区 ,否则造

C语言Socket-单工通信(客户端向服务器发送数据)

服务端(server) #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") //把ws2_32.lib加到Link页的连接库 #define PORT 15001 //通信的端口(指服务器端) #define ERROR 0 #define BUFFER_SIZE 1024 //注意:此Server端数据接收缓冲区 >= Client端数据发送缓冲区 ,否则造

观察HTTP协议中客户端向服务器发送的请求,理解并实现一个最简单的AJAX请求案例

一.什么是HTTP协议 HTTP协议即超文本传输协议,网站就是基于HTTP协议的,例如网站的图片.CSS.JS等都是基于HTTP协议进行传输的.HTTP协议是由从客户机到服务器的请求(Request)和从服务器到客户机的响应(Response)进行了约束和规范. 大白话的说,就是你在浏览器输入一个网址,例如http://baidu.com,这时你就是向百度的服务器发送了请求了....经过一系列你看不到的处理之后,你的浏览器出现一个百度的首页,这就是百度的服务器对你的浏览器的成功的响应. 二.在浏

java 学习笔记之 流、文件的操作

ava 学习笔记之 流.文件的操作 对于一些基础的知识,这里不再过多的解释, 简单的文件查询过滤操作 package com.wfu.ch08; import java.io.File; import java.io.FilenameFilter; public class Test1 { public static void main(String[] args) { File file=new File("F:\\2017-2018-1\\javase"); // //获取该目录下