Java 伺服器多執行緒檔案上傳

來源:互聯網
上載者:User

 

import java.io.*;import java.net.*;class UploadThread implements Runnable  //將上傳封裝到線程裡{private Socket client;public UploadThread(Socket s){this.client=s;}public void run(){String ip = client.getInetAddress().getHostAddress(); //得到 IP地址try {BufferedInputStream sin = new BufferedInputStream(client.getInputStream()); //Socket 讀取流File file  = new File ("C:\\1.jpg");BufferedOutputStream fout = new BufferedOutputStream(new FileOutputStream(file)); // 檔案輸出資料流byte buf[] = new byte[1024];int len  = 0;System.out.println(ip+"...connecting...");//開始從網路中讀取資料while((len = sin.read(buf))!=-1){fout.write(buf,0,len);}//BufferedOutputStream sout = new BufferedOutputStream(client.getOutputStream());PrintStream sout = new PrintStream(client.getOutputStream());sout.write("發送成功".getBytes());//sout.flush();//雖然是位元組流,但其用的是BufferedOutputStreamfout.close();sin.close();sout.close();}catch(Exception ex){System.out.println("上傳檔案失敗");}}}public class Server {public static void main(String args[]) throws Exception {ServerSocket server = new ServerSocket(2222);while(true){Socket client = server.accept();new Thread(new UploadThread(client)).start();}}}/* * 伺服器處理多線程問題 *  * 1.因為伺服器是要很多人訪問的,因此裡面一定要用多線程來處理,不然只能一個人一個人的訪問,那還叫Y啥伺服器 *  * 2,拿上面這個檔案上傳的例子來說,它將每個串連它的使用者封裝到線程裡面去,把使用者要執行的操作定義到 run 方法裡面 * 一個使用者拿一個線程,拿到線程的就自己去執行,如果有其它使用者來的時候,再給新來的使用者指派一個新的線程 * 這樣就完成了伺服器處理多線程的問題 * 3. 在伺服器與用戶端互傳資料時,我們要特別注意的是,防止兩個程式造成 死等的狀態,一般原因有以下: *  * 1.  用戶端向資料端發送資料時,當發送的是字元時,第次以一行來發送,而服務端在讀取的時候,也是以 *  一行來讀取,readLine() 而發送的時候往往只是發送換行以行的內容,而不能發換行也發送過去, * 那麼服務端在讀取的時候就不讀取不到換行 ,那麼 readLine() 就不會停止 * 2. 用戶端發送資料時,如果處理的是用  字元流 或是緩衝流的話,一定要記得重新整理流,不然的話,資料就會發不出來 * 3 在用IO 讀取檔案裡面的資料然後發送到服務端 時,當家讀取檔案 while(in.read()) 讀取檔案結束時,而在 * 服務端的接收程式  while(sin.read())不會接到一個發送完畢的提示,所以會一直等待下去,所以我們在處理這 * 個問題的時候,還要將其發送一個檔案讀取結束的標誌,告訴接收端檔案已經讀取完結,不要再等待了 * 而socket 裡面給我們封裝了 shutdownInput shutdownOutput 兩個操作,此可以關閉 流,兩樣也可以起到告訴 * 接收方檔案傳送完畢的效果  *  *  *  * */

 

import java.net.*;import java.io.*;public class Upload {public static void main(String args[]) throws Exception{Socket client = new Socket("172.16.215.105",2222);File file = new File("F:\\e.jpg");BufferedInputStream fin = new BufferedInputStream(new FileInputStream(file)); //檔案讀取流PrintStream sout = new PrintStream(client.getOutputStream(),true);   //得到socket 流byte buf [] = new byte[1024];int len =0;while((len=fin.read(buf))!=-1){sout.write(buf,0,len);System.out.println(len+"...發送中");}client.shutdownOutput();BufferedInputStream sin = new BufferedInputStream(client.getInputStream());len = sin.read(buf);System.out.println(len);System.out.println(new String(buf,0,len));sin.close();sout.close();fin.close();}}

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.