您好,登錄后才能下訂單哦!
這篇文章主要介紹Java如何實現文件上傳服務器和客戶端,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
具體內容如下
文件上傳服務器端:
/** * 使用TCP協議實現上傳功能的服務器端 * 思路: * 新建ServerSocket * 等待客戶端連接 * 連接上后開啟子線程,把連接獲取的Socket傳給子線程 * 循環進行 * @author yajun * */ public class UploadServer { public static void main(String[] args) { UploadServer server=new UploadServer(); UploadThread command=new UploadThread(); server.start(command); } /** * 功能:接受連接,開啟子線程,循環 * @param command 用于下載的子線程對象,該對象實現了Runnable接口 */ private void start(UploadThread command){ //局部變量 ServerSocket serverSocket = null; Socket transSocket; //業務邏輯 try { serverSocket=new ServerSocket(55555); while(true){ System.out.println("等待連接……"); transSocket=serverSocket.accept(); int i=0; i++; System.out.println("第"+i+"個連接"); //用不用在下載完后關閉線程呢??? command.setSocket(transSocket); Executors.newFixedThreadPool(5).execute(command); } //異常捕獲 } catch (IOException e) { e.printStackTrace(); //關閉資源 } finally{ try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } }//End of try }//End of connect @Test public void testConnect() { //測試任務:先運行服務器端,然后多次運行客戶端,服務器段可以不斷創建子線程,則測試成功 //測試準備:構造一個線程,用于模擬下載線程 UploadThread command=new UploadThread(); start(command); } @Test public void testDown() throws IOException { byte[] buf; ByteArrayInputStream bis; String str="canglaoshi.avi\ncontent,content,content"; buf=str.getBytes(); bis=new ByteArrayInputStream(buf); UploadThread ut=new UploadThread(); ut.down(bis); } } //完成各個傳輸任務的子線程 class UploadThread implements Runnable{ Socket socket; public UploadThread(){} public UploadThread(Socket socket){ this.socket=socket; } @Override public void run() { InputStream in; try { in = socket.getInputStream(); down(in); //異常處理 } catch (IOException e) { e.printStackTrace(); } finally{ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } //測試代碼 /*try { Thread.sleep(5000); System.out.println(Thread.currentThread().getName()+",復制完畢"); } catch (InterruptedException e) { e.printStackTrace(); }*/ }//End of run public void setSocket(Socket socket){ this.socket=socket; } //下載方法 /** * 目標:把InputStream中的數據寫入到本地 * 思路: * 1.獲取輸入流,最好傳入輸入流,而不是直接從Socket獲取,傳入有利用單元測試 * 2.從輸入流中讀到文件名 * 3.新建文件和文件輸出流 * 4.從輸入流中讀到文件內容到文件輸出流 * 5. * @throws IOException */ public void down(InputStream in) throws IOException{ //局部變量 char ch; char[] nameArr=new char[256]; byte[] buf=new byte[1024]; String name=""; OutputStream out = null; //業務邏輯 try { //第一步:獲取文件名,構造文件輸出流 int i=0; while((ch=(char) in.read())!='\n'){ nameArr[i++]= ch; } //name=nameArr.toString();//這句話無法將字符數組轉換為字符串,需用下面的語句 name=new String(nameArr); System.out.println("要下載的文件為:"+name); out=new FileOutputStream("src\\down\\"+name); //第二步:將輸入流中的其他內容寫入到文件 int len; while((len=in.read(buf))!=-1){ out.write(buf,0,len); } out.flush(); //異常捕獲 } catch (IOException e) { e.printStackTrace(); //關閉資源 }finally{ //疑問:兩個捕獲可不可以放到一塊呢,怎樣處理關閉流時的異常最好呢? in.close(); out.close(); } //調試 System.out.println(name); } }//End of UploadThread
文件上傳客戶端:
/** * 使用TCP協議實現上傳功能的客戶端 * @author yajun */ public class UploadClient { public static void main(String[] args) { UploadClient client=new UploadClient(); client.upload("src\\thursday\\AsListTest.java"); } /** * 作用:上傳文件到服務器 * 1.建立到服務器的連接 * 2.獲取輸出流 * 3.將文件內容寫入到輸出流 * 4.獲取服務器的響應 */ private void upload(String name){ Socket socket=null; OutputStream out; try { socket=new Socket("127.0.0.1", 55555); out=socket.getOutputStream(); write2OutputStream(name, out); //異常捕獲 } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Test public void testUpload() { upload("src\\status.xml"); } /** * 作用:傳入文件名和輸出流,將文件寫入到輸出流 * @param path * @throws IOException */ private void write2OutputStream(String path,OutputStream out) throws IOException{ FileInputStream fis = null; byte[] buf=new byte[1024]; String fileName=""; //業務邏輯 try { //1.寫入文件名 fileName=path.substring(path.lastIndexOf('\\')+1); System.out.println("您要上傳的文件名為:"+fileName); out.write(fileName.getBytes()); out.write('\n'); //2.寫入文件內容 fis=new FileInputStream(path); int len; while((len=fis.read(buf))!=-1){ out.write(buf, 0, len); } out.flush(); //異常處理 } catch (IOException e) { e.printStackTrace(); //關閉資源 } finally{ fis.close(); out.close(); } }//End of upload @Test public void testWrite2OutputStream() throws IOException { ByteArrayOutputStream out = null; try { out=new ByteArrayOutputStream(); write2OutputStream("src\\status.xml", out); System.out.println(out.toString("utf-8")); } catch (IOException e) { e.printStackTrace(); } finally{ out.close(); } } }
以上是“Java如何實現文件上傳服務器和客戶端”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。