程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> TCP實現圖片上傳

TCP實現圖片上傳

編輯:C++入門知識

上一篇博客寫了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){
		
		}

	}

}

這樣才算一個真正的實現了圖片上傳功能。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved