网络编程TCP文件上传案例优化(java)

31 篇文章 1 订阅
3 篇文章 0 订阅
本文展示了如何使用Java实现客户端上传文件到服务器,服务器接收并保存文件的过程,同时通过多线程提高了效率。客户端上传本地文件到服务器的特定端口,服务器接收到文件后保存到本地,并回复上传成功信息。整个过程确保了服务器能够持续监听并处理多个客户端的上传请求。
摘要由CSDN通过智能技术生成

该项目实现的功能为:让客户端从本地上传一个文件给服务器,服务器接接收到文件数据后,在上传到本地。并且服务器一直处于监听状态,所以客户端可以一直上传文件。这里使用到了多线程,可以提高效率

首先先创建一个客户端

package Demo03_文件上传案例的优化;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class Demo01_Socket {

	public static void main(String[] args) throws IOException{
		//读取本地文件并上传给服务器
		Socket socket = new Socket("127.0.0.1",888);
		//为了上传效率,这里使用了缓冲流
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\File\\1.jpg"));
		OutputStream os = socket.getOutputStream();
		int len =0;
		byte[] bytes = new byte[1024];
		while((len = bis.read(bytes)) != -1){
			os.write(bytes,0,len);
		}
		
		//调用socket中的shutdownOutput(),否则程序进入死循环
		socket.shutdownOutput();
		
		//接受服务器的回复
		InputStream is = socket.getInputStream();
		InputStreamReader isr = new InputStreamReader(is,"UTF-8");
		char[] charArr = new char[1024];
		while((len = isr.read(charArr)) != -1){
			System.out.println(new String(charArr,0,len));
		}
		
		
//		byte[] bytes2 = new byte[1024];
//		while((len = isr.read(bytes2)) != -1){
//			System.out.println(new String(bytes,0,len));
//		}
		
		
		
		//释放资源
		socket.close();
		bis.close();
	}
}

再创建一个服务器

package Demo03_文件上传案例的优化;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;


/**
 * 将服务器上传的文件复制到C:\\File\\upload文件夹中
 * 优化:
 * 使服务器一直在运转,并且复制的文件名字不会重复
 * @author 邱锦宏
 *
 */
public class Demo02_ServerSocket {

	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket(888);
		while(true){
			Socket socket = server.accept();
			
			/*
			使用多线程技术,提高程序的效率
			有一个客户端上传文件,就开启一-个线程,完成文件的上传
			*/
			
			new Thread(new Runnable(){
				@Override
				public void run(){
					//注意这里的异常要使用try...catch	否则会出错
					try{
						//判断这个文件夹是否存在,不存在则创建该文件夹
						InputStream is = socket.getInputStream();
						File file = new File("C:\\File\\upload");
						if(!file.exists()){
							file.mkdirs();
						}
						
						String fileName = "qjh" + System.currentTimeMillis() + new Random().nextInt(999999) + ".jpg";
						
						//将文件上传到本地
						BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file + "\\" + fileName));
						byte[] bytes = new byte[1024];
						int len = 0;
						while((len = is.read(bytes)) != -1){
							bos.write(bytes,0,len);
						}
						
						
						//回复服务器上传成功
						OutputStream os = socket.getOutputStream();
						//使用转换流,不然传到客户端的信息会乱码
						OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");
						osw.write("文件上传成功");
						
						
						//释放资源
						osw.close();
						socket.close();
						bos.close();
					}catch(IOException e){
						System.out.println(e);
					}
				}
			}).start();
			
		}
		//server.close();
		
	}
}

在上传文件前,要先运行服务器,在运行客户端,否则会报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兴奋の大公猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值