2008-09-25 35 views
65

tôi đã không thể tìm thấy một câu trả lời đầy đủ cho chính xác những gì các lỗi sau có nghĩa:java.net.SocketException: Phần mềm kết nối gây ra hủy bỏ: recv thất bại

java.net.SocketException: Software caused connection abort: recv failed

Ghi chú:

  • Lỗi này là không thường xuyên và không thể đoán trước; mặc dù nhận được lỗi này có nghĩa là tất cả các yêu cầu trong tương lai cho URI cũng sẽ không thành công.
  • Giải pháp duy nhất hoạt động (thỉnh thoảng, chỉ thỉnh thoảng) là khởi động lại Tomcat và/hoặc máy thực (Windows trong trường hợp này).
  • URI chắc chắn có sẵn (như được xác nhận bằng cách yêu cầu trình duyệt thực hiện tìm nạp).

đang liên quan:

BufferedReader reader; 
try { 
URL url = new URL(URI); 
reader = new BufferedReader(new InputStreamReader(url.openStream()))); 
} catch(MalformedURLException e) { 
throw new IOException("Expecting a well-formed URL: " + e); 
}//end try: Have a stream 

String buffer; 
StringBuilder result = new StringBuilder(); 
while(null != (buffer = reader.readLine())) { 
result.append(buffer); 
}//end while: Got the contents. 
reader.close(); 
+3

Hey ở đó. Bạn đã đánh dấu câu trả lời là chính xác - bất kỳ cơ hội nào bạn nhớ những gì bạn tìm thấy bằng cách thực hiện một số đánh hơi? Vấn đề này đã có tôi. (Xem câu hỏi của tôi http://stackoverflow.com/questions/6772215/java-net-socketexception-software-caused-connection-abort-recv-failed-with-jav) –

+1

Tôi cũng gặp vấn đề này. Giải pháp duy nhất là khởi động lại toàn bộ máy. Bất cứ ai có một câu trả lời hoàn chỉnh? –

+0

@KevinWong Giải pháp là sửa chữa mạng. – EJP

Trả lời

21

Điều này thường có nghĩa là đã xảy ra lỗi mạng, chẳng hạn như thời gian chờ TCP. Tôi sẽ bắt đầu bằng cách đặt một sniffer (wireshark) vào kết nối để xem bạn có thể thấy bất kỳ vấn đề nào không. Nếu có một lỗi TCP, bạn sẽ có thể nhìn thấy nó. Ngoài ra, bạn có thể kiểm tra nhật ký bộ định tuyến của mình, nếu điều này có thể áp dụng. Nếu không dây có liên quan đến bất cứ nơi nào, đó là một nguồn khác cho các loại lỗi này.

3

Bạn đang truy cập vào dữ liệu http? Bạn có thể sử dụng thư viện HttpClient thay vì thư viện chuẩn không? Thư viện có nhiều tùy chọn hơn và sẽ cung cấp thông báo lỗi tốt hơn.

http://hc.apache.org/httpclient-3.x/

4

Lần duy nhất mà tôi đã nhìn thấy một cái gì đó như thế này xảy ra là khi tôi có một kết nối xấu, hoặc khi ai đó đang đóng ổ cắm mà tôi đang sử dụng từ một bối cảnh chủ đề khác nhau.

2

Hãy thử thêm 'autoReconnect = true' với chuỗi kết nối jdbc

1

này sẽ xảy ra bất cứ lúc nào, hoặc khi kết nối lần ra hoặc khi một máy chủ từ xa kết thúc kết nối của họ (ứng dụng khép kín, tắt máy tính, vv) . Bạn có thể tránh điều này bằng cách tự quản lý các ổ cắm và xử lý các ngắt kết nối trong ứng dụng của bạn thông qua giao thức truyền thông của nó và sau đó gọi số shutdownInputshutdownOutput để xóa phiên.

1

Hãy xem bạn có một dịch vụ hoặc chương trình khác đang chạy trên cổng http hay không. Nó xảy ra với tôi khi tôi cố gắng sử dụng cổng và nó đã được thực hiện bởi một chương trình khác.

0

Nếu bạn đang sử dụng Netbeans để quản lý Tomcat, cố gắng vô hiệu hóa màn hình HTTP trong Tools - Servers

+0

Hãy thử xem tại sao chính xác? – EJP

17

này cũng sẽ xảy ra nếu khách hàng TLS của bạn không thể được xác thực bởi máy chủ cấu hình để yêu cầu xác thực khách hàng.

+0

Không, không. Điều đó làm cho máy chủ đóng kết nối đúng cách với TLS 'close_notify'. Không có reset ở tất cả, hoặc lúc tốt nhất 'kết nối thiết lập lại bởi peer'. – EJP

+0

Nó đã xảy ra với tôi với một số API khi xác thực không thành công. Vì vậy, cảm ơn @desbocages. – Eddy

+0

Đây là nguyên nhân gây ra lỗi với thiết lập apache của tôi – Atuos

0

Tôi cũng gặp sự cố này. Giải pháp của tôi là:

sc.setSoLinger(true, 10); 

COPY TỪ WEBSITE -> Bằng việc sử dụng phương pháp setSoLinger(), bạn rõ ràng có thể thiết lập một sự chậm trễ trước khi thiết lập lại được gửi đi, cho thêm thời gian để dữ liệu được đọc hoặc gửi.

Có lẽ đó không phải là câu trả lời cho mọi người nhưng đối với một số người.

+1

Điều này là vô nghĩa. SO_LINGER không làm bất cứ điều gì như vậy. Nó kiểm soát bao lâu 'close()' chặn, nếu có. Nó không có gì để làm với thời gian đặt lại. Và 'sao chép từ một trang web' không phải là một hình thức trích dẫn phù hợp. Bạn nên cung cấp liên kết để chúng tôi có thể nhìn thấy những gì nó thực sự nói, và nếu bình luận cần thiết bất lợi ở đó quá. Tôi biết [nơi bạn đã nhận được từ] (http://www.davidreilly.com/java/java_network_programming/), và nó là lớp A drivel từ đầu đến cuối. Tôi đã gửi cho anh ta một loạt sửa chữa khoảng 15 năm trước: anh ta đã ném một cơn giận dữ và không cập nhật nó kể từ đó. – EJP

5

Lỗi này xảy ra khi kết nối bị đóng đột ngột (khi kết nối TCP được đặt lại trong khi vẫn còn dữ liệu trong bộ đệm gửi). Tình trạng này rất giống với điều kiện 'Kết nối lại được thiết lập bởi peer' phổ biến hơn nhiều. Nó có thể xảy ra không thường xuyên khi kết nối qua Internet, nhưng cũng có hệ thống nếu thời gian là đúng (ví dụ: với các kết nối liên tục trên máy chủ cục bộ).

Ứng dụng khách HTTP sẽ chỉ cần mở lại kết nối và thử lại yêu cầu. Điều quan trọng là phải hiểu rằng khi một kết nối ở trạng thái này, không có cách nào thoát khỏi nó ngoài việc đóng nó lại. Mọi nỗ lực gửi hoặc nhận sẽ tạo ra lỗi tương tự.

Không sử dụng URL.open(), sử dụng Apache-Commons HttpClient có cơ chế thử lại, kết nối tổng hợp, giữ chân và nhiều tính năng khác.

sử dụng mẫu:

HttpClient httpClient = HttpClients.custom() 
      .setConnectionTimeToLive(20, TimeUnit.SECONDS) 
      .setMaxConnTotal(400).setMaxConnPerRoute(400) 
      .setDefaultRequestConfig(RequestConfig.custom() 
        .setSocketTimeout(30000).setConnectTimeout(5000).build()) 
      .setRetryHandler(new DefaultHttpRequestRetryHandler(5, true)) 
      .build(); 
// the httpClient should be re-used because it is pooled and thread-safe. 

HttpGet request = new HttpGet(uri); 
HttpResponse response = httpClient.execute(request); 
reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
// handle response ... 
+0

Không, không. Điều đó gây ra 'kết nối thiết lập lại bởi peer'. Lỗi của OP không phải do lập trình. – EJP

+0

Có. Tôi đề nghị bạn thực hiện một số nghiên cứu trước khi đưa ra -1. Chúng tôi thực sự đã làm. 'Connection reset' là do gói TCP RST gây ra, nhưng khi nhận được RST TCP trong khi vẫn còn dữ liệu trong bộ đệm gửi, một 'recv()' tiếp theo từ ứng dụng sẽ gây ra lỗi 'WSAECONNABORTED' chuyển thành ngoại lệ trong câu hỏi. Tôi tự hỏi giải thích * của bạn là gì cho ngoại lệ này. "Sửa chữa mạng" bạn nói - Tôi có thể tái tạo điều này trên localhost với một vài dòng mã. – rustyx

+0

Bạn vẫn đang bẻ khóa phần mềm 'connection reset'with' khiến kết nối bị hủy bỏ '. Họ là hai điều kiện khác nhau. – EJP

Các vấn đề liên quan