1. 程式人生 > >TCP實現多個客戶端同時向同一個伺服器端傳送圖片,也可以同一個客戶端多次向伺服器傳送圖片。當上傳圖片大於一定的限度(這裡指定為了10k)時,則停止上傳,將已經接收到但未接收完的檔案刪除。

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時:
伺服器端:
在這裡插入圖片描述
客戶端:
在這裡插入圖片描述