Problemas con sockets

Hoy te voy a molestar más de la cuenta.
Mira este código.
Te digo lo que quiero hacer. Es un servidor que escucha por el puerto 1016. El cliente se conecta y va todo bien, pero cuando cierra la conexión, quiero que mi servidor siga escuchando hasta la próxima vez que se conecte. He puesto un bucle infinito para que siga escuchando una vez cerrada la conexión, pero en vez de quedarse esperando como la primera vez, salta el error de conexión constantemente.
Cuando pierde la conexión la primera vez cierra los canales, pero sin colocar estas sentencias también falla.
¿Qué estoy haciendo mal?
--------------------------
public class EscuchaPHP{
ServerSocket ss=null; // Socket por el que espera peticiones del cliente
Socket s=null; // Socket para la comunicación con el cliente
PrintWriter os=null;
// Canal de salida para el envio de datos por el socket
BufferedReader is=null;
//Canal de entrada para la lectura de datos por el socket
Integer Error=0;
char Estado='B';
public EscuchaPHP(){ //Constructor
while (true) {
try{
System.out.println("A la espera de petición");
ss=new ServerSocket(1016,300);
// El servidor crea un socket para la escucha de peticiones de
s=ss.accept(); // espera a la petición de un cliente
// Obtenemos los canales del socket que establece la
// comunicación entre cliente y servidor.
is=new BufferedReader(
new InputStreamReader(
s.getInputStream()));
// Obtenemos un canal de entrada (lectura) del socket
// Aplicamos estratos para poder leer tipos primitivos
// y utilizamos un buffer para la lectura
os=new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
s.getOutputStream())),true);
//Obtenemos un canal de salida (escritura) del socket
//Utilizamos un buffer para la lectura y escribiremos texto
} //Capturamos las excepciones que puede lanzar el código
catch(IOException e){ System.out.println("Error de E/S en la conexión\n");}
if (s!=null && is!=null && os!=null){
try{
String mensaje;
while (true) {
mensaje=is.readLine();
char codigo='B';
System.out.println("mensaje:" + mensaje);
if (mensaje!=null) {
for (int i=0; i<mensaje.length(); i++) {
if (mensaje.charAt(i)!=',') {
codigo = mensaje.charAt(i); }
else break;
}
System.out.println("codigo= " + codigo);
if (codigo=='6') { System.out.println("Envio: " + "B,000,000,000,");
os.println(Estado + ",000,000,000,"); } //Enviamos el mensaje al cliente
else if (codigo=='3') { System.out.println("Envio:O,000,000,000,");
Estado='O';
os.println("O,000,000,000,"); } //Enviamos el mensaje al cliente
else if (codigo=='2') { System.out.println("Envio:B,000,000,000,");
Estado='B';
os.println("B,000,000,000,"); } //Enviamos el mensaje al cliente
}
else break;
// os.close(); // Cerramos canal de salida
// is.close(); // Cerramos canal de entrada
// s.close(); // Cerramos el socket
}
}
catch (IOException e){ System.out.println("Error de E/S en la conexión\n"); }
} //if
} // while(true)
} // Constructor
public static void main( String args[] ) throws IOException {
new EscuchaPHP();
}
}
Respuesta
1
Te recomiendo que, cuando obtengas un socket mediante ss. Accept(), inmediatamente delegues en otra clase que se ejecute en otro hilo diferente, y mantener la conexión con el cliente en el otro hilo. Así, no bloqueas que otro cliente se pueda conectar al servidor. Es un consejo de diseño que ya verás como te soluciona muchas cosas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas