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();}}