Java中使用多线程实现文件上传和下载

上一篇中说的是单线程实现的文件上传,接下来说说多线程实现文件上传

首先搞清楚应该是对于服务器端的多线程,因为是多个客户端同时向服务器端上传

编写客户端代码,先读取本地文件,然后给服务器端发送数据,最后接收一下是否上传成功

//实现图片上传的客户端
        Socket socket = new Socket(InetAddress.getByName("10.0.185.144"),44444);

        //读取本地图片的字节读取流
		FileInputStream fis = new FileInputStream("new.jpg");

		//给服务器端发送数据的字节输出流
		OutputStream out = socket.getOutputStream();

		//读取"上传成功"的字节读取流
		InputStream in = socket.getInputStream();

		//循环读取本地图片,发送给服务器端
		byte[] arr = new byte[1024];
		int len = 0;
		while((len = fis.read(arr))!=-1)
		{
			out.write(arr,0,len);
		}
		//向服务器写入结束标记
		socket.shutdownOutput();

		//读取"上传成功"
        int num = in.read(arr);
		System.out.println(new String(arr,0,num));

		fis.close();
		socket.close();

接下来是服务器端

首先要创建一个实现了Runnable或者继承了Thread(因为实现Runnable的方式,线程和线程任务是分离的,所以我使的是这种方式)的类将每次都要执行的代码写到run方法中,然后创建一个线程去执行就可以了

class PicUpload implements Runnable 
{
	private Socket socket;
	public PicUpload(Socket socket)
	{
		this.socket = socket;
	}

	public void run()
	{
		try{
			//把上传的图片放到统一的目录下
			File dir = new File("pictures");
			if(!dir.exists())
				dir.mkdir();

			String ip = socket.getInetAddress().getHostAddress();
			System.out.println(ip+"连接到客户端");
            
			int num = 0;
                        File file = new File(dir,ip+(++num)+".jpg");

			while(file.exists())
			{
				file = new File(dir,ip+(++num)+".jpg");
			}

			FileOutputStream fos = new FileOutputStream(file);
			InputStream  in = socket.getInputStream();
			OutputStream out = socket.getOutputStream();

			byte[] arr = new byte[1024];
			int len = 0;
			while((len = in.read(arr))!=-1)
			{
				fos.write(arr,0,len);
			}
			fos.close();

			out.write("上传成功".getBytes());
			socket.close();
		}
        catch(Exception e)
		{
			e.printStackTrace();
		}
	}
}

写一下服务器端
class Test 
{
	public static void main(String[] args)throws IOException 
	{
		ServerSocket server = new ServerSocket(44444);

        while(true)
		{
			Socket socket = server.accept();
			new Thread(new PicUpload(socket)).start();
		}

	}
}
这样就可以实现多个客户端同时向服务器端上传文件了


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值