Java TCP:如何在超时后中止/停止接收方等待发送方数据

时间:2012-09-15 13:44:17

标签: java timeout readline break

我必须编写实现TCP服务器的Java代码。 TCP客户端具有10%的传输故障由随机数确定。现在在接收器方面,它需要等待2000毫秒(2秒)&如果在2秒内没有收到发件人的数据。那么它将停止等待来自发送者和数据的数据。向发送方发送否定ACK。

BufferedReader inFromSender =new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
        long startTime = System.currentTimeMillis();
        while(( System.currentTimeMillis() - startTime) < 2000 )
        {
            clientSentence = inFromSender.readLine();
            System.out.println("Received: " + clientSentence);
        }
        System.out.println("Data Transmission failed");

但是,一旦while循环开始&amp;接收器进入读取发送器,它永远不会断开..即使2秒。超时结束了。如何在2秒(超时)后中止/停止接收方等待发送方数据。

1 个答案:

答案 0 :(得分:0)

一种方法是让Thread在达到超时时关闭套接字。这会使read(...)调用失败(可能是IOException),因此您将从循环中退出。

示例:

final Socket connectionSocket = new Socket("...", 8888); // To be changed
BufferedReader inFromSender = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
Thread t = new Thread() {
   public void run() {
      try {
          Thread.sleep(2000); // Wait 2 s
          connectionSocket.close();
          System.out.println("Data Transmission failed");
      } catch(InterruptedException e) {
         // Handle exception
      }
   }
};
t.start();
while((clientSentence = inFromSender.readLine()) != null) {
   System.out.println("Received: " + clientSentence);
}