sockets + java?

Iniciado por coolfrog, 11 Octubre 2005, 22:59 PM

0 Miembros y 1 Visitante están viendo este tema.

coolfrog

que tal, alguien sabe como hacer una clase(servidor) que devuelva mensajes a muchos clientes.
y otra cosa mas cual es la diferencia de los streams (DataInputStream,BufferedReader, InputStreamReader y otros.....).

Yo utilizo para redes el DataInputstream, pero he visto muchos ejemplos que lo hacen con el Buffer.... y otros que no conozco.


AnKeR

No se si entiendo muy bien la primera parte ... mensajes a muchos clientes supongo que será un servidor que pueda dar servicio a varios a la vez... Pos para eso pues creas un thread distinto para cada conexión nueva que te creen al puerto que tienes abierto.

Pues la diferencia entre los streams es mas o menos la manera que tiene de leer, o de trabajar por ejemplo el BufferedOutputStream -> no escribe hasta que se llena un buffer de un tamaño concreto... Pero cada stream es distinto eso lo mejor que puedes hacer es ir a la API de Java que es una gozada y leerte un poquillo todas esas movidillas.

Salu2o3

coolfrog

ya entiendo mas o menos eso, ahora  mis dudas especificas las voy a poner en codigo y voy a ir explicandolas.
primero que nada tengo mi clases servidor y cliente .
la clase servidor como crea un nuevo thread cada vez que se conecta un usuario:

public static void main(String abc[]) throws IOException{
ServerSocket serv=null;
boolean listening=true;
servidor s=new servidor();
try{
serv=new ServerSocket(4444);
        System.out.println(".::Servidor activo :");
      [color=Yellow] while(listening)[/color]{
          Socket sock=null;
        try {
           sock=serv.accept();//espera hasta que se conecte un cliente
            } catch (IOException e) {
                System.err.println("Accept failed: " + 4444 + ", " + e.getMessage());
                continue;
            }
            nuevocliente k=new nuevocliente(sock); //este es la instancia a la clase thread
        k.start();
        }
       
    }catch(IOException e){
System.out.println("error :"+e);
}
}


ahora mi duda en esta parte es , que cuando hace el "while(listening)" que pasa?
cuando sale de ese bucle?
cuando entra al catch?

Ahora la clase del Thread es esta:


class nuevocliente extends Thread{
Socket scli=null;
DataInputStream entrada=null;
DataOutputStream salida=null;
private static Vector clientesActivos=new Vector();
public nuevocliente(Socket scliente){
scli=scliente;
clientesActivos.addElement(this);
System.out.println("cliente agregado: "+this);
}
public void run() {
System.out.println(".::Esperando Mensajes :");
String mencli;
try{
entrada=new DataInputStream(scli.getInputStream());
    salida=new DataOutputStream(scli.getOutputStream());
     } catch (IOException e) {
            e.printStackTrace();
        }
        try{
  [color=red] while((mencli=entrada.readLine())!=null) [/color]{
    System.out.println("mensaje recibido "+mencli);
            envia(mencli);
       }
       } /*catch (IOException e) {
            e.printStackTrace();
        }*/
       
    catch (Exception e1){
if (e1.getMessage().equals("Connection reset by peer: JVM_recv" +
" in socket input stream read")){
System.out.println("se desconecto un cliente");
}
}
finally {clientesActivos.removeElement(this);
try{
scli.close();
}
catch(Exception e3){
System.out.println("no se puede cerrar el socket");
       
       
     }
     }
     }
     

public void envia(String mencli2){
//InetAddress carac=new InetAddress(get);
String IP=scli.getInetAddress().getHostAddress();//IP
//String host=scli.getInetAddress().getHostName();//nombre del la maquina

for(int i=0;i<clientesActivos.size();i++){
System.out.println("MENSAJE DEVUELTO "+i);
try{
[color=red] ((nuevocliente)(clientesActivos.elementAt(i))).salida.writeBytes(IP+/*":"+host+*/" dice:"+ mencli2+[color=blue]"\n"[/color]);[/color]
}catch (IOException e) {
            e.printStackTrace();
        }

}
}
}



Las dudas en esta parte son, "while((mencli=entrada.readLine())!=null) " , que hace aqui? , por que yo vi otra forma en otros ejemplos, colocan "while(true)" ,asi:

while (true){
try{ 
        mencli=entrada.readLine();
System.out.println("llego del Cliente :"+c+" "+mencli);
salida.writeBytes(dato+"\n");
}catch (IOException e){
    System.out.println("error...."+e);
break;
}


y otra cosa mas , por que es necesario el fin de linea esto ->"\n"" cuando quiero enviar datos de salida?
por que si no coloco eso , no pasa nada.
la parte del codigo es esta:

((nuevocliente)(clientesActivos.elementAt(i))).salida.writeBytes(IP+/*":"+host+*/" dice:"+ mencli2+"\n");

ah tambien en esta misma linea , exactamente como funciona
, eso de ((nuevocliente)(clientesActivos)) es algun tipo de casting o que?
por que , yo defini clientesActivos como variable global y cuando quiero hacer lo mismo pero sin el (nuevocliente) por delante, no me sale.
   

Todo lo anterior era lo del Servidor .
Ahora la parte del cliente :

class cliente{
static String mensaje;
static String mensajeCliente;
public static void main(String abc[]) throws IOException {
Socket sock=null;
DataInputStream entrada=null;
DataOutputStream salida=null;
DataInputStream entrada2=new DataInputStream(System.in);

cliente s=new cliente();
try{
sock=new Socket("127.0.0.1",4444);
entrada=new DataInputStream(sock.getInputStream());
salida=new DataOutputStream(sock.getOutputStream());
}catch(IOException e){
System.out.println("\tEl servidor no esta levantado");
System.out.println("\t=============================");

}
System.out.println("es :"+sock.toString());
new threadCliente(entrada).start();
System.out.print("Introducir Mensaje Para El Servidor :");
while (true){
try{

mensajeCliente=entrada2.readLine();
salida.writeBytes(mensajeCliente+"\n");

}catch (IOException e){
    System.out.println("error...."+e);
break;
}

}

}

}
class threadCliente extends Thread{
DataInputStream entrada2;
public threadCliente (DataInputStream entrada) throws IOException{
entrada2=entrada;
}
public void run(){
String menser;
try{
while((menser=entrada2.readLine())!=null){

System.out.println(/*"ECO del servidor:"+*/menser);
}
}
catch (IOException e){
System.out.println("Error en la comunicación "+"Información para el usuario");
}
finally {
System.exit(0);
}
}
}


Ahora , mas o menos se como funcionan los Threads(pero si quisieran explicarme un poco mas no hay problema).
La clase servidor crea un nuevo Thread cada vez que se conecta un cliente, y va almacenando los clientes en un Vector, para despues enviarles los mensajes a todos.
Ahora yo creia que solo se necesitaba eso pero lo que no entiendo es por que tengo que crear otro Thread en el cliente?
que no es suficiente con el que utiliza el Servidor?

les pido que respondan los mas rapido porfavor, es un proyecto , y el docente no quiere ayudar.

gracias de antemano.


coolfrog

#3
Bueno parace que nadie sabe.
Pero igual , a los que esten interesados ya hice un chat publico , al cual pueden conectarse varios clientes , no acepta privados , y esta en modo grafico.
si quieren que les indique solo postean o me escriben.
bueno ciao.

PD: Y a ver quien me saca esas dudas que tengo.

el link para los que quieren descargar es :


http://parti.shinranet.com/chat3.rar