TCP實現多個客戶端同時向同一個伺服器端傳送圖片,也可以同一個客戶端多次向伺服器傳送圖片。當上傳圖片大於一定的限度(這裡指定為了10k)時,則停止上傳,將已經接收到但未接收完的檔案刪除。
阿新 • • 發佈:2018-12-06
伺服器端:
//多使用者上傳圖片 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時:
伺服器端:
客戶端: