2013-09-24 57 views
0

使用DataInputStream獲取從Android客戶端發送到此Java桌面服務器的int和long。之後,從Android客戶端收到一個pdf文件。總共有3個文件由客戶端發送到服務器。問題是在向另一個方向發送時。如何重新打開一個封閉的套接字以便將消息發送回客戶端

我必須在while循環後立即關閉輸入和輸出流。如果我不這樣做,PDF文件將被損壞,程序將停止並卡住while循環,而不是繼續執行到線程末尾。

如果我必須關閉輸入和輸出流量,套接字會關閉。我如何重新打開相同的套接字?

我需要重新打開相同的套接字,因爲需要發送一條消息回到Android客戶端,服務器收到PDF文件以發送確認文件已被服務器安全接收。

有多個Android客戶端連接到相同的單個Java服務器,所以我想象需要相同的套接字發送消息回到客戶端。如果沒有套接字,將很難確定將消息發送到哪個客戶端。

 byte[] buffer = new byte[fileSizeFromClient]; 

     while((count = dis.read(buffer)) > 0){ 
      bos.write(buffer, 0, count); 
     } 

     dis.close(); // closes DataInputStream dis 
     bos.close(); // closes BufferedOutputStream bos 

編輯:

從客戶端代碼

dos.writeInt((int)length); // sends the length as number bytes is file size to the server 
    dos.writeLong(serial); // sends the serial number to the server 

       int count = 0; // number of bytes 

       while ((count = bis.read(bytes)) > 0) { 
        dos.write(bytes, 0, count); 
       } 

    dos.close(); // need to close outputstream or result is incomplete file sent to server 
        // and the server hangs, stuck on the while loop 
        // if dos is closed then the server sends error free file 

回答

1

號不能重新打開一個插座。你必須做一個新的。完成文件傳輸後,您不必關閉套接字。服務器仍然可以重複使用它發送消息回覆。由於您已經發送了文件大小,您的服務器可以使用它來了解您的客戶端何時完成發送完整文件。之後,您的服務器可以將您的回覆發送給客戶端。

試試你的當前循環。

int bytesRead = 0; 
while((count = dis.read(buffer)) > 0 && bytesRead != fileSizeFromClient){ 
    bytesRead += count; 
    bos.write(buffer, 0, count); 
} 
bos.close(); 
//don't close the input stream 
+0

我試過這段代碼,並且由於某種原因每次文件到達不完整時。小於實際尺寸。 – Kevik

+0

@Kevik你如何將文件大小發送到服務器?你的客戶的代碼是什麼? – Robbie

+0

我將客戶端代碼添加到代碼的其餘部分 – Kevik

相關問題