2011-06-07 62 views
1

我正在向一個套接字寫入一堆數據,然而,在64k左右的東西寫入後,套接字被關閉,出現「對等連接重置」錯誤。我相信發生的事情是讀取套接字(Android媒體播放器)時嘗試讀取比套接字中提供的更多數據時正在死亡。這是一首正在流式播放的歌曲,當id3標籤相當大時,它會失敗。但是,當我從歌曲中刪除id3信息時,它工作正常。關閉錯誤的套接字

因爲我認爲在沒有足夠的數據時讀取端失敗,所以我想知道是否可以在調用socket.accept()接受連接來讀取它之前將一堆數據寫入套接字。我的想法是,當媒體播放器連接到套接字時,將有足夠的數據供它讀取,因此不會崩潰。那麼你可以在accept()之前調用write()嗎?

這裏是我當前的代碼一些psudocode:

ServerSocket socket = new ServerSocket(port, 0, InetAddress.getByAddress(new byte[] {127,0,0,1})); 

    socket.setSoTimeout(10000); 
    port = socket.getLocalPort(); 

    Socket client = socket.accept(); 

    ... 

    while (isRunning && (readBytes = data.read(buff, 0, buff.length)) != -1) { 

     client.getOutputStream().write(buff, 0, readBytes);   

    } 

回答

1

這通常意味着你已經寫到已經被另一端關閉連接。換句話說,應用程序協議錯誤。 64k可能只是代表你和同行之間的緩衝量。

在accept()之前寫入套接字的問題在引用服務器時沒有意義。但是,如果您的意思是客戶端寫入套接字,那確實可能發生。客戶端可以連接,寫入(達到可用緩衝區的限制)並在服務器接受呼叫之前關閉。這是由於TCP「積壓」隊列導致TCP堆棧異步完成連接並將它們排隊,準備被應用程序接受。

+0

謝謝!現在我正在使用socket.accept()來創建客戶端(如您在上面的僞代碼中看到的那樣)。由於此時我不想調用accept(),創建客戶端然後調用accept()打開連接的最佳方法是什麼? – Nick 2011-06-07 02:01:03

+1

@Nick accept()不會創建客戶端。它*接受*客戶。客戶端創建客戶端並進行連接。只要在準備好時調用accept()即可。 – EJP 2011-06-07 02:22:19