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时:
服务器端:
在这里插入图片描述
客户端:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较典型的网络编程问题。针对这个问题,我们可以简单地分为以下几个步骤: 1. 创建服务器程序:服务器程序需要创建一个Socket,并绑定IP地址和口号。然后监听客户的连接请求,一旦有客户连接,就需要接受客户的请求并处理。在这个问题中,服务器需要读取文档,然后将文档的内容发送客户。 2. 创建客户程序:客户程序需要连接服务器的Socket。连接成功后,客户需要向服务器发送一个请求,请求读取文档。然后客户需要等待服务器的响应,一旦收到服务器的响应,就需要将文档的内容显示出来。 下面是一个比较简单的Python代码示例,只读取本地的文件,可以根据自己的需求进行修改: 服务器代码: ```python import socket # 创建一个TCP/IP socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定IP地址和口号 server_address = ('localhost', 8888) server_socket.bind(server_address) # 开始监听客户请求 server_socket.listen(1) while True: # 等待客户连接 print('等待客户连接...') client_socket, client_address = server_socket.accept() print('客户连接成功!', client_address) # 接收客户请求 request = client_socket.recv(1024) # 读取文档内容 with open('test.txt', 'r') as file: content = file.read() # 发送文档内容给客户 client_socket.sendall(content.encode('utf-8')) # 关闭客户连接 client_socket.close() ``` 客户代码: ```python import socket # 创建一个TCP/IP socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器的socket server_address = ('localhost', 8888) client_socket.connect(server_address) # 发送请求给服务器 request = 'read_document' client_socket.sendall(request.encode('utf-8')) # 接收服务器的响应 response = client_socket.recv(1024) # 显示文档内容 print(response.decode('utf-8')) # 关闭客户连接 client_socket.close() ``` 注意事项: 1. 服务器需要在一个无限循环中等待客户连接,所以需要使用while True循环。 2. 在这个示例中,我们假设文档内容较小,可以一次性读取并发送客户。如果文档内容较大,需要分批次发送。 3. 在实际项目中,需要考虑异常处理、多线程处理等问题。上述示例只是提供一个简单的思路。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值