TCP实现图片上传

上一篇博客写了TCP的文本上传,可是在平时上传的文件大多数不是文本,本篇博客再介绍一下图片的上传。

先是客户端:

		//创建客户端socket服务
		Socket s=new Socket("10.152.79.174", 1004);
		//读取要上传的图片文件
		FileInputStream fis=new FileInputStream("d:\\015.jpg");
		//获取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 in=s.getInputStream();
		byte[] bufIn=new byte[1024];
		int lenin=in.read(buf);
		String text=new String(buf,0,lenin);
		System.out.print(text);
		fis.close();
		s.close();

然后是服务端:

		//创建服务端socket端口
		ServerSocket ss=new ServerSocket(1004);
		//获取客户端
		Socket s=ss.accept();
		//读取客户端发来的数据
		InputStream is=s.getInputStream();
		//将读取到的数据存储到
		File dir=new File("d:\\pic");
		if (!dir.exists()) {
			dir.mkdirs();
			
		}
		
		String ip=s.getInetAddress().getHostName();
		System.out.println(ip+"......connected");
		File file=new File(dir, ip+".jpg");
		FileOutputStream fos=new FileOutputStream(file);
		byte[] buf=new byte[1024];
		int len=0;
		while ((len=is.read())!=-1) {
			fos.write(buf, 0, len);
			
		}
		//获取socket输出流,将上传成功的消息返回给客户端
		OutputStream os=s.getOutputStream();
		os.write("上传成功!".getBytes());
		
		fos.close();
		s.close();
		ss.close();

这样基本就实现了图片上传功能,但是作为一个Demo是可以的,但离实用标准还差很远。比如说服务端有多人同时访问可是上面的代码每次只能处理一个客户端的连接。所以要实现多个客户端的并发访问,就要实用多线程。修改后的代码如下:

			
		//创建tcp的socket服务端。
		ServerSocket ss = new ServerSocket(10006);
		
		while(true){
			Socket s = ss.accept();			
			
			new Thread(new UploadTask(s)).start();		
			
		}

UploadTask的代码如下:

public class UploadTask implements Runnable {

	private static final int SIZE = 1024*1024*2;
	private Socket s;

	public  UploadTask(Socket s) {
		this.s = s;
	}

	@Override
	public void run() {

		int count = 0;
		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip + ".....connected");
		
		try{

		// 读取客户端发来的数据。
		InputStream in = s.getInputStream();

		// 将读取到数据存储到一个文件中。
		File dir = new File("c:\\pic");
		if (!dir.exists()) {
			dir.mkdirs();
		}
		File file = new File(dir, ip + ".jpg");
		//如果文件已经存在于服务端 
		while(file.exists()){
			file = new File(dir,ip+"("+(++count)+").jpg");
		}
		
		
		FileOutputStream fos = new FileOutputStream(file);

		byte[] buf = new byte[1024];

		int len = 0;

		while ((len = in.read(buf)) != -1) {
			
			
			
			fos.write(buf, 0, len);
			
			if(file.length()>SIZE){
				System.out.println(ip+"文件体积过大");
				
				fos.close();
				s.close();
				
				
				System.out.println(ip+"...."+file.delete());
				
				return ;
			}
		}

		// 获取socket输出流,将上传成功字样发给客户端。
		OutputStream out = s.getOutputStream();
		out.write("上传成功".getBytes());

		fos.close();
		s.close();
		}catch(IOException e){
		
		}

	}

}

这样才算一个真正的实现了图片上传功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值