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 đề.
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
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
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