2011-05-17 59 views
0

我試圖歌曲數據寫入套接字但之後大約66338個字節以下異常被拋出:寫入插座X字節失敗後

E/  (1016): Connection reset by peer 
    E/  (1016): java.net.SocketException: Connection reset by peer 
    E/  (1016): at org.apache.harmony.luni.platform.OSNetworkSystem.writeSocketImpl(Native Method) 
    E/  (1016): at org.apache.harmony.luni.platform.OSNetworkSystem.write(OSNetworkSystem.java:723) 
    E/  (1016): at org.apache.harmony.luni.net.PlainSocketImpl.write(PlainSocketImpl.java:578) 
    E/  (1016): at org.apache.harmony.luni.net.SocketOutputStream.write(SocketOutputStream.java:59) 
    E/  (1016): at com.myprogram.StreamProxy.processRequest(StreamProxy.java:307) 
    E/  (1016): at com.myprogram.StreamProxy.run(StreamProxy.java:145) 
    E/  (1016): at java.lang.Thread.run(Thread.java:1096) 

這隻能使用特定的歌曲發生,如果一首歌呢整個專輯中的所有歌曲都會做同樣的事情。我想知道是否與歌曲的標題信息有關?

有關如何調試或修復此問題的任何建議將不勝感激。謝謝。

編輯:這是從InputStream讀取並寫回到套接字的代碼。代碼非常直接,所以我不確定爲什麼它會崩潰,除非接收端的連接被關閉。 (注意:這僅僅是僞代碼,但給人的總體思路)

InputStream data = realResponse.getEntity().getContent(); 
    Socket socket = new ServerSocket(port, 0, InetAddress.getByAddress(new byte[] {127,0,0,1})); 
    socket.setSoTimeout(5000); 
    port = socket.getLocalPort(); 
    Socket client = socket.accept(); 

    ...some code... 

    byte[] buff = new byte[1024 * 50]; 
    while (isRunning && (readBytes = data.read(buff, 0, buff.length)) != -1) { 
     client.getOutputStream().write(buff, 0, readBytes); 
    } 

此外,可這有什麼關係套接字緩衝區填滿?特別是因爲它似乎每次都以64k的速度崩潰。

+0

你能發表相關的代碼嗎?你更有可能得到這樣的幫助。 – cdmckay 2011-05-17 03:29:47

+0

我發佈了一些僞代碼,以便更好地瞭解發生了什麼。謝謝。 – Nick 2011-05-17 18:28:48

回答

1

另一方的服務器進程可能有異常終止(例如SIGKILL)。這會導致連接休息。

0

stacktrace表示對等體(服務器或客戶端)關閉了連接,對我來說可能是您正在讀取(解析)服務器對客戶端的響應錯誤,反之亦然。

+0

由於它是一個連接重置,它很可能意味着某些聲音很糟糕(進程死亡),而不是簡單的連接關閉或錯誤處理有線協議。 – seand 2011-05-17 03:29:22

0

最有可能的錯誤是在你的代碼。如果你可以附上代碼,將有助於縮小錯誤的範圍。如果你覺得它與頭部使用wireshark有關,看看發生了什麼。

編輯:我覺得它與setSoTimeout(毫秒)有關,這將在5秒鐘不活動之後超時,正如您在代碼中寫入的那樣。我想這應該是你的以下陳述的原因:「如果一首歌能完成整個專輯中的所有歌曲都做同樣的事情」。

嘗試增加超時值。

+0

我將超時設置爲0,因此沒有超時。但是,我仍然遇到同樣的錯誤。 – Nick 2011-05-18 22:46:21