Cómo terminar un hilo que ha sido bloqueado por mucho tiempo debido a Socket.accept ()?

Le Duc Huy:
public class Slave implements Runnable {
   public ServerSocket slaveSocket;

   public Slave(ServerSocket sk) {socket = sk;}

   @Override
   public void run() {
      Socket client = slaveSocket.accept(); // slave will wait to serve a client
      // more code...

      Socket clientPart2 = slaveSocket.accept();
      // more code...
   }
}

public class Server {
   public static void main(String[] args) {
       // for example only, incomplete code
       ServerSocket serverSocket = new ServerSocket(0); // a client connect to 8088
       Slave slave = new Slave(serverSocket);
       new Thread(slave).start(); // slave serve the current client, the server wait for new client

       // send new slave's port to client ... 
   }
}

Así que tengo un servidor que sirve para múltiples clientes a la vez. Cada vez que un cliente se conecta, el servidor creará un nuevo esclavo, enviar el IP / puerto de ese esclavo al cliente, el cliente va a trabajar con el esclavo.

Sin embargo, si el cliente recibe la dirección del esclavo y luego no hacer nada (o dejar de fumar) ( Edición: esto significa que el cliente y el servidor están conectados pero el cliente no hacen nada, porque por ejemplo el usuario va para el almuerzo) slaveSocket.accept()hace que esclavo que correr para siempre, que es un desperdicio.

Quiero que el flujo esclavo de salida después de 30 segundos de esperar slaveSocket.accept(). Dado que slaveSocket.accept()está bloqueando, no puedo hacerlo desde el interior de la void run().

¿Cuál es la forma correcta, limpia para solucionar este problema? Gracias.

Editar 1: un ServerSocket se pasa al esclavo ya que el cliente puede tener varios procesos que se conectarán a ese esclavo. Por lo tanto, no sólo se lleve a cabo una función.

Joni:

Si se establece un tiempo de espera con setSoTimeout y no se conecta el cliente, ServerSocket.accept lanzará una excepción. Puede detectar esta excepción.

Para establecer un tiempo de espera de 30 segundos, el uso:

serverSocket.setSoTimeout(30000)

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=401341&siteId=1
Recomendado
Clasificación