2013-06-09 37 views
5

sau this post, tôi có cùng một vấn đề và tôi đã tái tạo nó với một phép thử đơn giản. Tôi hy vọng rằng bạn sẽ có thể giúp tôi.Thời gian chờ sau hai phút mặc dù được đặt thành nhiều hơn hai mintues

Để tôi giải thích, tôi đang gửi thư bằng cách sử dụng ổ cắm. Mọi thứ đều hoạt động tuyệt vời miễn là tôi đặt thời gian chờ dưới 2 phút. Nhưng nếu tôi đặt thời gian hơn hai phút, ổ cắm sẽ hết thời gian chờ sau hai phút. Vì vậy, nếu tôi đặt thời gian chờ là 10 giây, ổ cắm sẽ hết thời gian chờ sau 10 giây, nhưng nếu tôi đặt thời gian là 180 giây, ổ cắm sẽ hết thời gian sau 120 giây.

Đây là một trường hợp thử nghiệm:

import java.io.*; 
import java.net.InetSocketAddress; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.SocketTimeoutException; 

/** 
* 
*/ 
public class TestSocket1 { 

public static void main(String[] args) throws IOException { 

    ServerSocket serverSocket = new ServerSocket(); 

    serverSocket.setReuseAddress(true); 
    serverSocket.bind(new InetSocketAddress(1111), 0); 
    serverSocket.setSoTimeout(1000); 
    Socket socket = null; 

    boolean send = true; 

    while (send) { 
     try { 
      socket = serverSocket.accept(); 
      Thread.sleep(100); 
      String messageReceived = readFromSocket(socket); 

      System.out.println(messageReceived); 

      if (send) { 
       send = false; 

       Thread.sleep(150000); // Causing 2.5 minutes delay 
       // Sending message 

       BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8")); 
       PrintWriter printWriter = new PrintWriter(wr, true); 

       String output = "Hello Back"; 

       printWriter.println(output); 
       printWriter.flush(); 
       socket.shutdownOutput(); 

      } 

     } 
     catch (SocketTimeoutException ie) { 
     } 
     catch (Exception e) { 
     } 
     finally { 
      if (socket != null) { 
       socket.close(); 
      } 
     } 
    } 


} 

protected static String readFromSocket(Socket socket) throws IOException { 
    StringBuilder messageReceived = new StringBuilder(); 
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8")); 

    String line = br.readLine(); 

    messageReceived.append(line); 

    socket.shutdownInput(); 

    return messageReceived.toString(); 
} 


} 

import java.io.*; 
import java.net.InetSocketAddress; 
import java.net.Socket; 
import java.net.SocketAddress; 

/** 
* 
*/ 
public class TestSocket2 { 

public static void main(String[] args) throws IOException { 

    Socket socket = new Socket(); 
    socket.setKeepAlive(true); 
    socket.setReuseAddress(true); 
    socket.setTcpNoDelay(true); 
    socket.setSoTimeout(180000); // Should wait 3 minutes before throwing time out exception - Actually throwing after 2 minutes 

    SocketAddress socketAddress = new InetSocketAddress(1111); 

    socket.connect(socketAddress, 5000); 

    // Sending message 

    BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8")); 
    PrintWriter printWriter = new PrintWriter(wr, true); 

    String output = "Hello There"; 

    printWriter.println(output); 
    printWriter.flush(); 
    socket.shutdownOutput(); 

    String messageReceived = readFromSocket(socket); 

    System.out.println(messageReceived); 

} 

protected static String readFromSocket(Socket socket) throws IOException { 
    StringBuilder messageReceived = new StringBuilder(); 
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8")); 

    String line = br.readLine(); 

    messageReceived.append(line); 

    socket.shutdownInput(); 

    return messageReceived.toString(); 
} 


} 

Bạn nên chạy lớp TestSocket1 đầu tiên và sau đó TestSocket2.

Tôi đang đấu tranh với vấn đề này trong một thời gian dài và mọi trợ giúp sẽ được đánh giá cao. Cảm ơn bạn.

  • EDIT

Vì vậy, tôi loại bỏ sự phụ thuộc vào SO_TimeOut và mất @Nick gợi ý trong this post để kiểm tra các dòng đầu vào có sẵn trước khi đọc nó. Nhưng bây giờ vấn đề là sau hai phút các byte có sẵn luôn luôn trả về 0 mặc dù đầu vào đã được ghi vào luồng. Vì vậy, tôi vẫn có cùng một vấn đề.

+0

Tôi đã thử nghiệm mã của bạn trên máy tính xách tay của tôi (OS X 10.8.4, JDK 1.6.0_37) và 'TimeoutException' được ném sau 180 phút như mong đợi. Bạn có thể cung cấp cho bạn phiên bản hệ điều hành và phiên bản JDK? – ericson

+0

Hệ điều hành Windows7 Ultimate SP1 64Bit, JDK jdk1.6.0_26. BTW, nếu bạn không bị giới hạn trong hai phút, bạn sẽ không thấy TimeoutException. Lưu ý rằng giấc ngủ là 2,5 phút và SoTimeOut được đặt là 3 phút, do đó bạn sẽ thấy thông báo 'Hello Back'. – Rotem

+0

Xin lỗi, tôi quên đề cập đến việc tôi tăng thời gian ngủ lên 25 phút để tái tạo 'TimeoutException'. Tôi không quen thuộc với nền tảng Windows, hy vọng người khác sẽ giúp đỡ. – ericson

Trả lời

0

Vì vậy, tôi đã tìm ra được những vấn đề các

socket.shutdownInput(); 

nguyên nhân các ổ cắm để thay đổi FIN_WAIT trạng thái như vậy, chờ 2 phút trước khi đóng cửa (2MSL)

+0

FIN_WAIT_1 không gây ra thời gian chờ. – EJP

+1

Tôi không nghĩ rằng bạn hiểu câu trả lời của tôi. Đây là vấn đề và tôi có một trường hợp thử nghiệm để chứng minh nó vì vậy nó vượt ra ngoài sự hiểu biết của tôi tại sao bạn -1 tôi. – Rotem

1

Bạn không thể tăng thời gian chờ kết nối vượt quá mặc định nền tảng, khoảng một phút. Bạn chỉ có thể giảm nó. Cố gắng để tăng nó không thực sự có ý nghĩa. Bạn đang cố gắng để thực hiện?

+0

Ok, trước hết tôi không thể tìm thấy bất kỳ thông tin nào về mặc định thời gian chờ trong cửa sổ tôi sẽ đánh giá cao nếu bạn có thể thêm một liên kết.Thứ hai, trạng thái tài liệu setSoTimeout _A timeout của zero được hiểu là timeout_ vô hạn, vậy làm thế nào tôi có thể biết rằng nó bị giới hạn mặc định của nền tảng (một lần nữa, tôi không thể tìm thấy bất kỳ thông tin nào về điều này)? Thứ ba, tôi đang cố gắng khắc phục lỗi trong hệ thống cũ cho phép gửi thư giữa các ổ cắm có thể mất hơn hai phút. – Rotem

+0

Javadoc rõ ràng là sai về thời gian chờ kết nối, một dịp hiếm hoi. Nếu bạn không đặt nó ở tất cả, hoặc thiết lập nó bằng không, bạn chắc chắn sẽ có được một thời gian chờ kết nối trong các trường hợp thích hợp. Tuy nhiên nhận xét của bạn là về thời gian chờ * read *, đó là một điều khác. Bạn có thể đặt thời gian chờ đọc thành bất kỳ thứ gì bạn thích. Tôi chưa bao giờ thấy một vấn đề với nó, và tôi sử dụng Windows socket read timeouts thường xuyên. – EJP

+0

javadocs đề cập đến thời gian chờ ** đọc **. Nếu bạn không bao giờ gặp vấn đề với ổ cắm Windows, tôi sẽ đánh giá cao nếu bạn có thể chạy thử nghiệm và tự kiểm tra. Cảm ơn bạn. – Rotem

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