Cerrar un SocketChannel recuperado por ServerSocketChannel.accept ()

Tengo un temporizador en el hilo del demonio que escribe datos continuamente en un SocketChannel. En la clase principal no tengo la referencia de objeto de este canal de socket, pero tengo la referencia del ServerSocket al que está conectado este canal de enchufe. Entonces hago esto para cerrar el canal.

socketChannel = serverSocket.accept();
socketChannel.close();

Pero hay una latencia involucrada en el cierre del canal de socket del hilo demoníaco. Aunque ambos se refieren al mismo canal de socket, la tarea del temporizador escribe en este canal de socket incluso después de lo anterior close() se invoca hasta unos pocos milisegundos.

Por favor sugiera cómo asegurarse de que el cierre se complete. Este es un canal sin bloqueo.

preguntado el 27 de agosto de 11 a las 14:08

2 Respuestas

Tu código no tiene sentido. Ese código no 'se refiere al mismo canal de socket' en absoluto y, por lo tanto, no lo cierra: acepta uno nuevo y lo cierra, lo que tampoco tiene sentido, al menos no para el cliente que hizo esa nueva conexión y probablemente esté esperando algún servicio, no un cierre inmediato.

Solo necesita hacer arreglos para tener la referencia al canal existente disponible para el código que necesita cerrarlo. Esta es la Programación 101, difícilmente una cuestión de redes.

Respondido 28 ago 11, 12:08

Hola, Aprecio la forma en que lo llamó 101, pero ¿puede validar su declaración? ¿Dice que el objeto devuelto por serversocketchannel.accept () es un nuevo canal? Entonces, ¿podría justificar dónde tiene lugar la conexión de ese cliente? - user915534

@ user915534 Sí. El SocketChannel devuelto por accept () es una nueva conexión entrante de un cliente. Ahí es donde se forma la conexión entrante. Su código crea dos SocketChannels: uno de accept (), que es la conexión entrante del cliente, y otro de SocketChannel.open (), que es una conexión del servidor a sí mismo. Ellos son diferentes. - user207421

Necesitas sincronización. Comparta algún objeto entre estos hilos. Entonces puedes hacer algo como esto: hilo principal:

synchronized(object){
    socketChannel = serverSocketChannel.accept()
    socketChannel.close(). 
}

hilo de demonio:

synchronized(object){
    timerTask.write(socketChannel, data)
}

Respondido 27 ago 11, 20:08

No entiendo el punto aquí, ¿por qué deberían estar sincronizados? Estoy cerrando el canal de socket derecho, pero el punto es que el socket se cierra después de unos milisegundos en el hilo del demonio, lo cual es incorrecto. - user915534

Si algo en un hilo sucede en un momento ligeramente diferente al que necesita otro hilo, intentaría sincronizar las cosas. ¿Por qué no lo intentas? ¿Estás seguro de que midiste los momentos correctamente? - alehro

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.