2013-09-16 85 views
0

我在寫一個自定義協議。我有一個命令名稱的代碼,代碼如下所示。發送和創建文件

if(commandString.equals("PUT")){ 
    File f = new File(currentFolder, "test.txt"); 
    if(!f.exists()) 
     f.createNewFile(); 
    FileOutputStream fout = new FileOutputStream(f); 
    long size = 150; 
    long count = 0; 
    int bufferLeng = 0; 
    byte[] buffer = new byte[512]; 
    while((bufferLeng = dis.read(buffer))>0) //dis is a data input stream. 
    { 
     count =+ bufferLeng; 
     fout.write(buffer); 
    } 
    System.out.println("All Good"); 
    fout.flush(); 
    fout.close(); 

} 

該命令被客戶端發送到服務器如下pWriter.println("PUT");。現在我運行它,它創建文件test.txt,但然後凍結,並且服務器不顯示所有好消息。爲什麼會這樣,什麼是簡單的修復?

服務器和客戶端工作!

謝謝

+0

'dis.read(緩衝器)'是阻塞呼叫。你的客戶是否關閉了連接? –

+0

我不會想象代碼甚至會編譯;看看第一行:'if(commandString.equels(「PUT」)){'除非'commandString'不是'java.lang.String'(在這種情況下你的命名約定看起來不準確),'equels(String) '方法不存在。也許你的意思是'如果(commandString.equals(「PUT」)){' –

+0

是客戶端關閉連接 –

回答

0

也許消除dis.read(buffer)並使用以下內容。

if(commandString.equals("PUT")){ 
    File f = new File(currentFolder, "test.txt"); 
    if(!f.exists()) 
     f.createNewFile(); 
    FileOutputStream fout = new FileOutputStream(f); 
    long size = 150; 
    long count = 0; 

    byte[] buffer = new byte[512]; 
    int bufferLeng = buffer.length; 
    while(count < size && bufferLeng>0) //dis is a data input stream. 
    { 

     fout.write(buffer); 
     count =+ bufferLeng; 
    } 
    System.out.println("All Good"); 
    fout.flush(); 
    fout.close(); 

} 

這應該工作

+0

謝謝你的完美工作。 –

1

服務器等待客戶端關閉套接字。這會傳輸文件結束,導致dis.read()返回-1。

通常,這不是你想要的。解決方案是在數據前發送文件大小,然後精確讀取這些數據量。

確保客戶端在寫入文件數據的最後一個字節後調用socket.flush(),否則數據可能會卡在緩衝區中,這也會導致服務器掛起。

+0

當我在寫入文件的最後一個字節後刷新它仍然掛起。 –

+0

確保您不會讀取比客戶端發送的字節更多的字節。如果你讀了太多的單個字節,它將會掛起。您將需要使用read(buffer,offset,length)方法並計算循環的每次迭代的長度。 –

+0

還要確保你只寫入'read()'放入緩衝區的那些字節 - >'write(buffer,offset,length)' –