1. 程式人生 > 其它 >檔案上傳的阻塞狀態

檔案上傳的阻塞狀態

技術標籤:JAVA基礎java

最近複習Java基礎中的網路程式設計,好多東西忘記了。導致遇見一個小坑,分享出來。
我們知道Java中提供了Socket套接字類來實現網路資料傳輸。
定義客戶端

public static void main(String[] args) throws IOException {
        FileInputStream fs = new FileInputStream("src/com/kang/Updata/abc.jpg");
        Socket sk = new Socket("127.0.0.1", 8887
); OutputStream sos = sk.getOutputStream(); int len=0; byte [] bytes= new byte[1024]; while ((len = fs.read(bytes))!= -1) { sos.write(bytes,0,len); } sk.shutdownOutput(); System.out.println("客戶端寫完"); //用socket的輸入流物件,讀取服務端給客戶端寫入的資料
InputStream sis = sk.getInputStream(); while ((len = sis.read(bytes) )!= -1) { System.out.println( new String(bytes,0,len)); } fs.close(); sk.close(); } **定義伺服器類**
public static void main(String[] args) throws IOException {
        //建立服務端物件
ServerSocket ssk = new ServerSocket(8887); File file = new File("d:\\updata"); if (!file.exists()) { file.mkdir(); } Socket accept = ssk.accept(); //接受socket輸入流 InputStream is = accept.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); String fileName="com.kang"+System.currentTimeMillis()+ new Random().nextInt();//防止重名 FileOutputStream fos = new FileOutputStream(file+"\\"+fileName+".jpg");// 加上兩個\\表示路徑分割 int len=0; byte [] bytes=new byte[1024]; while (( bis.read())!=-1){ fos.write(bytes,0,len); } //接受socket輸出流,回寫資料給客戶端 accept.getOutputStream().write("上傳成功了".getBytes()); fos.close(); accept.close(); }
		我們知道一個檔案的上傳就是下面這種程式碼
while ((len = fs.read(bytes))!= -1) {
            sos.write(bytes,0,len);
 		   }
 		   用個輸入流去讀檔案,給socket的輸出流寫檔案。
 		   關鍵在於這個socket的輸出流就寫不到檔案結束的那個字元
 		   導致了在伺服器的程式碼
 while (( bis.read())!=-1){
               fos.write(bytes,0,len);
             }

這個while迴圈一直在死迴圈,因為讀不到結束
而客戶端也休想得到服務端的回寫,這下好了,兩個人就一直等吧。

但是問題也好解決,直接在客戶端自己新增寫完標準就好了,具體是呼叫socket的shutdownOutput()方法,表明自己已經寫完了。

也就是下面這樣

  while ((len = fs.read(bytes))!= -1) {
                sos.write(bytes,0,len);
        }
         sk.shutdownOutput();
    

ok問題解決
在這裡插入圖片描述