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.