TCP实现多个客户端同时向同一个服务器端发送图片,也可以同一个客户端多次向服务器发送图片。当上传图片大于一定的限度(这里指定为了10k)时,则停止上传,将已经接收到但未接收完的文件删除。

服务器端:

//多用户上传图片
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class UploadPicServer1 {

	public static void main(String[] args) throws IOException {
		
		//创建TCP的socket服务
		ServerSocket ss=new ServerSocket(8888);
		//由于不是只有一个用户上传文件,所以循环接收客户端对象
		while(true){
			//接收客户端对象
			Socket s=ss.accept();
			//为每个客户端开启一个线程,每进来一个客户端就开启一个线程,
			//用于上传文件
			new Thread(new UploadTask1(s)).start();
		}

	}

}

使用多线程,处理接收数据的线程:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class UploadTask1 implements Runnable{

	//读取的文件的最大大小
	private static final int SIZE=1024*10;//定义最大容许10K
	private Socket s;
	public UploadTask1(Socket s) {
		this.s=s;
	}
	@Override
	public void run() {
		//得到客户端的ip地址
		String ip=s.getInetAddress().getHostAddress();
		System.out.println(ip+"...connected");
		int count=0;
		//读取客户端发来的数据
		try {
			InputStream is=s.getInputStream();
			//确定图片存储到服务器中的一个位置,也就是确定服务器的目标文件
			//将图片放到一个文件夹下
			File dir=new File("d:\\aa");
			if(!dir.exists()){
				//如果文件夹不存在则创建
				dir.mkdir();
			}
			//关联目标文件对象,即将读取的内容存储到哪个文件中 
			//file对象不管文件存在与否,都可以关联,但不自动创建,只有与IO输出流关联往文件写入的时候,如果文件不存在,自动创建
			//只要直接和IO输出流关联的文件如果不存在,会自动创建
			File file=new File(dir,ip+".jpg");
			//如果文件已经存在于客户端,可以一个客户端向服务器端多次发送数据
			while(file.exists()){
				file=new File(dir,ip+"("+(++count)+").jpg");
			}
			//file文件只有真正写的时候才会创建
			//将IO流与文件进行关联
			FileOutputStream fos=new FileOutputStream(file);
			//定义缓冲区
			byte[] buf=new byte[1024];
			int len=0;
			//is流进行读操作
			while((len=is.read(buf))!=-1){//将输入流中的数据读取到buf数组中
				//fos流进行写操作
				fos.write(buf, 0, len);
				//如果文件
				if(file.length()>SIZE){
					System.out.println(ip+"文件体积过大");
					//文件体积过大,将流关闭,不进行上传
					
					
					OutputStream os=s.getOutputStream();
					os.write("文件上传失败".getBytes());
					is.close();
					fos.close();
					s.close();
					//将文件删除掉
					//再删除文件之前,一定要把IO流都关闭掉,否则会出现文件删除失败的情况
					System.out.println(ip+"..."+file.delete());
					return;//return后面什么都没跟意味着程序的结束
				}
			}
			//获取socket输出流,将上传成功提示发送给客户端
			OutputStream os=s.getOutputStream();
			os.write("文件上传成功".getBytes());
			fos.close();
			s.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
			
	}
}

客户端:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class UploadPicClient1 {

	public static void main(String[] args) throws UnknownHostException, IOException {

		//1.创建socket客户端
		Socket s=new Socket(InetAddress.getLocalHost(), 8888);
		//2.读取客户端要上传的图片文件
		//读取,所以需要定义输入流
		FileInputStream fis=new FileInputStream("d:\\16.jpg");
		//3.读取socket输出流,将读取到的图片数据发送给服务器
		OutputStream os=s.getOutputStream();
		
		//定义一个缓冲区
		byte[] buf=new byte[1024];
		int len=0;
		//边读边写
		while((len=fis.read(buf))!=-1){
			os.write(buf, 0, len);
			
		}
		//告诉服务器说,这边的数据传输完毕,让服务器停止读取
		s.shutdownOutput();
		//读取服务器发回的内容
		InputStream is=s.getInputStream();
		byte[] b=new byte[1024];
		int length=is.read(b);
		String str=new String(b, 0, length);
		System.out.println(str);
		s.close();

	}

}

注意:

1.file对象不管文件存在与否,都可以关联,但不自动创建,只有与IO输出流关联往文件写入的时候,如果文件不存在,自动创建。只要直接和IO输出流关联的文件如果不存在,会自动创建

2.再删除文件之前,一定要把IO流都关闭掉,否则会出现文件删除失败的情况。

3.先开启服务器端,在开启客户端。

运行结果为:

当所传文件小于10k时:
服务器端:
在这里插入图片描述
客户端:
在这里插入图片描述
当所传文件大于10k时:
服务器端:
在这里插入图片描述
客户端:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wyhluckydog/article/details/84572655