Author Topic: Sobre Sockets  (Read 2155 times)

clay

  • Jr. Member
  • **
  • Posts: 94
  • Karma: 0
    • View Profile
    • IFX
Sobre Sockets
« on: Diciembre 30, 2008, 03:42:59 am »
Hola:

Me gustaría me aclaren alguna dudas que tengo sobre los sockets de java. Mis problemas estan con los metodos write...(), por ejemplo: Quiero hacer un programa que conste de un servidor y varios clientes, algo asi como un messenger.

Bueno, al hacer por ejemplo writeUTF("..."), ¿como sé quien recibe el texto?; es decir, ambos clientes estan esperando a recibir, mejor con este codigo:

Code: [Select]
import java.io.*;
import java.net.*;
import javax.swing.*;

public class Servidor
{
static final int PUERTO=9999;
Conexion c1;
Conexion c2;

public Servidor( )
{
try
{
ServerSocket servidor = new ServerSocket( PUERTO, 2);
System.out.println("Socket corriendo en el puerto: " + PUERTO );

c1 = new Conexion(servidor.accept());
System.out.println("Cliente 1: " + c1.conexion.getInetAddress().getHostAddress() );

c2 = new Conexion(servidor.accept());
System.out.println("Cliente 2: " + c2.conexion.getInetAddress().getHostAddress() );

                        //AQUI!!!
c1.procesarConversacion();
c2.procesarConversacion();

} catch( Exception e )
{
    System.out.println( e.getMessage() );
        }

}

private class Conexion
{
Socket conexion;
DataInputStream entrada;
DataOutputStream salida;

public Conexion(Socket socket)
{
conexion = socket;
try
{
entrada = new DataInputStream(conexion.getInputStream());
salida = new DataOutputStream(conexion.getOutputStream());
}
catch(IOException e)
{
System.err.println(e);
}
}

public String recibirMensaje()
{
String mensaje="";
try
{
mensaje = entrada.readUTF();
}catch(IOException e)
{
}

return mensaje;
}

public void enviarMensaje(String mensaje)
{
try
{
salida.writeUTF(mensaje);
}catch(IOException e)
{
}
}

public void procesarConversacion()
{
while(true)
{
String s = recibirMensaje();
enviarMensaje(s);
}
}
}

public static void main( String[] args )
{
Servidor s = new Servidor();
}
}

Esta es mi clase Servidor. Tambien tengo una Cliente que solo enviará un "HolaMundo" al presionar un boton y se mantendrá atento a mensajes que puedan llegar. Mi pregunta esta en la linea que dice:

c1.procesarConversacion();

Mi pregunta es porque los mensajes que son enviados desde c1 tambien son recibidos por c1. ¿Como funciona esto de el envio de datos usando write...()?. Para 1 servidor y 1 cliente se me hizo facil entender, pero que sucede con 1 servidor y varios clientes?.

Si tienen alguna pagina que me ubicar en este tema, les agradecería bastante. Estuve viendo algunos ejemplos, sin embargo; no me quedo aun muy claro.

Gracias de antemano.

Saludos.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5474
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Sobre Sockets
« Reply #1 on: Diciembre 30, 2008, 03:14:21 pm »
Hola:

Cuando con la clase ServerSocket haces un accept(), te devuelve un Socket. Este Socket es una conexión con un cliente. Por cada accept() que hagas, obtendrás un Socket nuevo y cada uno es un cliente distinto.

Así, por ejemplo, si haces esto

Socket s1 = socketServer.accept();
Socket s2 = socketServer.accept();
Socket s3 = socketServer.accept();

tendrás tres clientes, uno en s1, otro en s2 y otro en s3. El write que hagas sobre uno de ellos, se enviará sólo a ese cliente concreto. Si un cliente envía algo, sólo podrás leerlo en el s1, s2 o s3 que corresponda a ese cliente.

Se bueno.

 

ey