Java - Socket que atienda a varios clientes

 
Vista:

Socket que atienda a varios clientes

Publicado por Ainhoa (2 intervenciones) el 05/03/2007 12:06:14
Buenas,

Quisiera saber como implementar un socket servidor que pueda escuchar peticiones de diferentes sockets cliente. Yo he intentando haciendo un bucle while(true), pero sólo me funciona la primera conexión el resto de conexiones no funcionan. Es decir, el primer socket cliente lo pilla bien y funciona, pero si realizamos más llamadas una vez acabado el socket anterior ya no funciona. Os mando el código y acepto sugerencias.

public static ServerSocket CrearSocketServidor()
{
ServerSocket socket = null;
String path = Conexiones.getPathXML ();
try
{
// Se crea un socket servidor atendiendo a un determinado puerto.
// Por ejemplo, el 35557.
socket = new ServerSocket (35557);
} catch (Exception e){
e.printStackTrace();
}

System.out.println ("Esperando cliente");

while (true) {
try {
System.out.println("Entro para aceptar clientes");
Socket cliente = socket.accept();
System.out.println ("Conectado con cliente de " + cliente.getInetAddress());

cliente.setSoLinger (true, 10);

ObjectInputStream entrada = new ObjectInputStream(cliente.getInputStream());

File fichero = (File) entrada.readObject ();
String nombre = fichero.getName ();
System.out.println ("nombre obtenido "+nombre);
System.out.println ("renombramos el fichero en "+path+nombre);
fichero.renameTo (new File(path+nombre));

System.out.println("Acabado todo con EXITO");

cliente.close();
cliente = null;

} catch (IOException ioe) {
System.out.println ("IOException: "+ioe);
} catch (ClassNotFoundException cnfe) {
System.out.println ("ClassNotFoundException: "+cnfe);
}
//socket.close();
return socket;
}
}

Y aquí el socket cliente:

public ClienteSocket(String nom){
try
{
this.s = new Socket ("localhost", 35557);
this.nombre = nom;
} catch (UnknownHostException ex){
ex.printStackTrace();
} catch (IOException ex){
ex.printStackTrace();
}
}
/**
* Crea el socket cliente y lee los datos
*/
public void run()
{
try
{
String path = Conexiones.getPathXML ();
OutputStream os = s.getOutputStream();
ObjectOutputStream salida = new ObjectOutputStream(os);

System.out.println("nombre "+this.nombre);
System.out.println("path "+path);
String fich = path+nombre;
System.out.println ("Escribimos el fichero "+fich);
File fichero = new File(fich);
salida.writeObject (fichero);

System.out.println ("CORRECTO");

salida.close ();
s.close ();

}
catch (Exception e)
{
System.out.println("Excepcion "+e);
e.printStackTrace();
}
}

Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Socket que atienda a varios clientes

Publicado por Jose (1 intervención) el 09/03/2007 21:01:12
hola, yo estube haciendo algo parecido, en realidad no es tan dificil, deberias de implementar otra clase que atienda los pedidos de tu cliente conectado, y dejar a esta otra esperando nuevas conexiones, ejemplo:

este es tu codigo
while (true) {
try {
System.out.println("Entro para aceptar clientes");
Socket cliente = socket.accept();
System.out.println ("Conectado con cliente de " + cliente.getInetAddress());
///en esta parte puedes enviar cliente a una clase que este implementando un hilo
MiClase a= new MiClase(cliente);
Thread hilo = new Thread(a);
a.start();
algo asi.

espero que te sirva, a mi me sirvio para realizar servidores de chat;
si tienes alguna duda puedes escribirme a mi mail [email protected]

suerte

chau
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Socket que atienda a varios clientes

Publicado por javaNoMoLa (2 intervenciones) el 13/03/2007 17:30:09
Tu servidor solo acepta un cliente, aunque puedas conectar con un segundo cliente, tu servidor no recive ni envia datos a este, puesto que tus buffers de entrada y salida ya atienden al primer cliente.

Solucion: tienes que usar hilos. lanzar un hilo por cliente.

Ejemplo:

while (true) {
try {
System.out.println("Entro para aceptar clientes");
Socket cliente = socket.accept();
//aqui lanzas el hilo
hilo(cliente).start;
System.out.println ("Conectado con cliente de " + cliente.getInetAddress());
...
...
...

class hilo extends threads {
private Socket cliente;
public hilo(Socket cliente) {
this.cliente=cliente;
}

void run() {
//Aqui creas los buffers de entrada salida y aqui los finalizas cuando dejes de usarlos.
//y cada hilo ejecutara su run() para cada cliente que se conecte.
}
}

Espero haberte sido de ayuda saludos ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar