1. 程式人生 > >connect reset 與connect reset by peer 原因分析

connect reset 與connect reset by peer 原因分析

     在專案組經常遇到TCP連線的問題,一直是遇到了網上查資料,沒有自己總結,感覺對這兩種錯都是模模糊糊,正好,今天又有個現場遇到此種問題需要我幫忙分析解決。通過查閱各種資料,算是比之前理解更加深刻。
     connect reset:原因是因客戶方已經把TCP連線斷開了,服務方還在往socket中寫資料。要重現connect reset  需要滿足條件:客戶端程式碼中程式碼要增加socket.setSoLinger(true, 0);檢視java api,此句只對呼叫socket.close()有用,其作用就是當客戶端呼叫socket.close()會像服務端傳送reset訊號,如果服務端再對此連線進行讀、寫操作時,服務端就會報connection reset的異常。
connect reset by peer :此異常常見與服務端處理異常退出時,客戶端還在往socket裡面寫資料。前提條件也是:服務端程式碼也設定了socket.setSoLinger(true, 0);
下面是驗證程式碼

客戶端程式碼:
package com.test.client;

import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Client {
private static int port = 9999;
private static String host = “127.0.0.1”;
public static SimpleDateFormat sdf = new SimpleDateFormat(“yy-MM-dd HH:mm:ss.SSS”);

public static void main(String[] args) throws Exception {
    Socket socket = new Socket();
    socket.setSoLinger(true, 0);

// CASE 3