Aplicacion Cliente-Cliente
Hola a todo el mundo, tengo un problema, estoy haciendo una aplicacion cliente cliente, es decir un chat, mendiante una conexion previa a un servidor, y mi problema es que se me queda el programa colgado, weno, que se queda esperando SIEMPRE a recibir una peticion entrante. Lo mjor esque os ponga mi codigo y me decis, con letras mayusculas tengo donde se me qda parao. Muchas Gracias a todos los que podais y querais ayudarme:
/*
* Cliente.java
*
* Created on 4 de abril de 2006, 17:06
*
* To change this template, choose Tools | Options and locate the template under
* the Source Creation and Management node. Right-click the template and choose
* Open. You can then make changes to the template in the Source Editor.
*/
import java.net.*;
import java.io.*;
import java.util.*;
/**
*
* @author Dididito
*/
public class Cliente{
/*
*Definimos las variables miembro que corresponderan a esta clase, pero SOLO
*considerando la comunicacion cliente cliente, es decir, por ahora pasamos
*de la comunicacion cliente servidor, ya lo uniremos.
*Hay que aclarar, que una vez que se haya establecido la conexion entre
*los dos clientes,la comunicacion se llevara a cabo mediante otras clases
*/
//ServerSocket necesario para la peticion de comunicacion entre clientes
static ServerSocket serverSocket;
//Puerto por el que nos comunicaremos con el cliente
int puerto;
//Socket para llevar a cabo la comunicación
static Socket socketCliente;
//Flujo de comunicación saliente con el servidor
PrintWriter out;
//Flujo de comunicacion entrante con el servidor
BufferedReader in;
//Referencia a la clase ClienteProtocoloDirectorio
ClienteProtocoloDirectorio clientito;
// Estados del protocolo
static final int estadoInicial=0;
static final int estadoSaludado=1;
static final int estadoRegistrado=2;
/** Constructor de la clase Cliente */
public Cliente(String direccionIPServidor,int puerto) throws IOException{
//Creamos el Socket, para establecer la comunicacion con el servidor
System.out.println("INCIAMOS SERVICIO CLIENTE SERVIDOR");
iniciarServicioClientToServer(direccionIPServidor,puerto);
//Iniciamos el servicio (creacion del serverSocket), para poder atender
//peticiones entrantes
System.out.println("INCIAMOS SERVICIO CLIENTE CLIENTE");
iniciarServicioClientToClient(puerto);
out=new PrintWriter(socketCliente.getOutputStream(), true);
in= new BufferedReader(new InputStreamReader(socketCliente.getInputStream()));
clientito=new ClienteProtocoloDirectorio(out,in);
}
/*
*A continuacion definimos los metodos de la clase
*/
void enviarPeticion(){
String mensaje;
BufferedReader lectura=new BufferedReader(new InputStreamReader(System.in));
try{
switch (clientito.enviarTipoPeticion()){
//Primer caso: Cliente desconectado, que desea conectarse
case ClienteProtocoloDirectorio.conectado:
mensaje="Quiero conectarme";
out.println(mensaje);
mensaje=in.readLine();
if(mensaje.compareTo(clientito.mBienvenidaCliente())==0){
clientito.estado=estadoSaludado;
}else{
System.out.println("Lo siento pero no te has conectado correctamente, vuelve a intentarlo");
clientito.estado=estadoInicial;
}
break;
case ClienteProtocoloDirectorio.registrado:
String login=null,pass=null,nombre=null,direccion=null;
System.out.println("Introduce tus datos por favor");
System.out.print("Login: ");
login=lectura.readLine();
System.out.print("Password: ");
pass=lectura.readLine();
System.out.print("Nombre: ");
nombre=lectura.readLine();
System.out.print("Direccion: ");
direccion=lectura.readLine();
mensaje=clientito.mSolicitudRegistro(login,pass,nombre,direccion);
out.println(mensaje);
//Comprobamos si el registro ha sido correcto para cambiar
//o no, la variable estado.
mensaje=in.readLine();
if(mensaje.compareTo(clientito.mRespuestaRegistroCorrecto("Has sido registrado."))==0){
clientito.estado=estadoRegistrado;
}else{
if(mensaje.compareTo(clientito.mRespuestaRegistroIncorrecto("No has sido registrado."))==0){
clientito.estado=estadoSaludado;
}
}
break;
case ClienteProtocoloDirectorio.anadir:
System.out.println("Introduce a continuacion el nombre del usuario que quieres añadir: ");
System.out.print("Nombre de Usuario: ");
nombre=lectura.readLine();
mensaje=clientito.mSolicitudAnadirContacto(nombre);
out.println(mensaje);
mensaje=in.readLine();
System.out.println(mensaje);
break;
case ClienteProtocoloDirectorio.listar:
mensaje=clientito.mSolicitudListaContactos();
out.println(mensaje);
mensaje=in.readLine();
System.out.println(mensaje);
break;
case ClienteProtocoloDirectorio.cerrar:
mensaje=clientito.mSolicitudCerrarSesion();
out.println(mensaje);
mensaje=in.readLine();
if(mensaje.compareTo(clientito.mRespuestaCerrarSesion())==0){
System.out.println("\n Cerrando Sesion...");
System.exit(0);
}else{
System.out.println("Conexion cerrada incorrectamente");
}
break;
case ClienteProtocoloDirectorio.eliminar:
System.out.println("Introduce a continuacion el nombre del usuario que quieres eliminar: ");
System.out.println("Nombre de Usuario: ");
nombre=lectura.readLine();
mensaje=clientito.mSolicitudEliminarContacto(nombre);
out.println(mensaje);
mensaje=in.readLine();
System.out.println(mensaje);
break;
case ClienteProtocoloDirectorio.localizar:
System.out.println("Introduce a continuacion el nombre del usuario que quieres localizar: ");
System.out.println("Nombre de Usuario: ");
nombre=lectura.readLine();
mensaje=clientito.mSolicitudLocalizarContacto(nombre);
out.println(mensaje);
mensaje=in.readLine();
System.out.println(mensaje);
break;
case ClienteProtocoloDirectorio.chatear:
System.out.println("Introduce a continuacion el nombre del usuario con el que quieres chatear: ");
System.out.println("Nombre de Usuario: ");
nombre=lectura.readLine();
mensaje=clientito.mSolicitudLocalizarContacto(nombre);
out.println(mensaje);
//aKI TENEMOS QUE INTERPRETAR LA DIRECCIN IP DEL CONTACTO
mensaje=in.readLine();
System.out.println(mensaje);
String []palabras=mensaje.split(" ");
//UNA VEZ INTERPRETADA LLAMARIAMOS AL METODO DE "CHATEAR"
//es decir, creamos un socket en la direccion IP obtenida
//y con el mismo puerto con el que nos conectamos al servidor
Socket comunicacion=new Socket(palabras[1],puerto);
System.out.println("\n");
chatear(comunicacion);
break;
default:
break;
}
}catch(Exception e){
}
}
int chatear(Socket s)throws IOException{
String mensaje=null;
//Creamos los flujos de entrada y salida para chatear con el otro usuario
PrintWriter salida=new PrintWriter(s.getOutputStream(), true);
BufferedReader entrada= new BufferedReader(new InputStreamReader(s.getInputStream()));
//Flujo para leer del teclado
BufferedReader lectura=new BufferedReader(new InputStreamReader(System.in));
try{
do{
mensaje=lectura.readLine();
salida.println(mensaje);
}while(mensaje.compareTo("z")!=0);
return 0;
}catch(IOException ex){
return -1;
}
}
/*
*iniciarServicioClientToClient
*Este metodo lo utilizamos para crear el serverSocket. Recibe como
*argumento el puerto de escucha para la creacion del ServerSocket
*devuelve 0 si el servicio se inicia correctamente
*devuelve 1 si el servicio se inicia incorrectamente
*/
static int iniciarServicioClientToClient(int port){
int error=0;
try{
System.out.println("Abriendo serversocket de escucha en el puerto" +
port+"...");
//EL PUERTO NO TENIA QUE SER EL MISMO!!!!!!!!??????????????\'\'
serverSocket=new ServerSocket(port+1);
System.out.append("El server socket se ha creado correctamente");
}catch(IOException ex){
ex.printStackTrace();
error=1;
}
return error;
}
/*
*iniciarServicioClientToServer
*Este metodo lo utilizamos para crear el Socket. Recibe como
*argumento el puerto de comunicacion del Socket y la direccion IP del
*servidor
*devuelve 0 si el servicio se inicia correctamente
*devuelve 1 si el servicio se inicia incorrectamente
*/
static int iniciarServicioClientToServer(String direccionIPServidor,int puerto){
int error=0;
// Abrimos el puerto especificado para acceso al servicio.
try {
System.out.print("Abriendo socket de escucha en puerto "+puerto+"...");
socketCliente=new Socket(direccionIPServidor,puerto);
System.out.println(" El socket para la comunicacion con el servidor" +
"se ha creado correctamente.");
} catch (IOException ex) {
ex.printStackTrace();
error=1;
}
return error;
}
public static void main(String args[]){
BufferedReader lectura=new BufferedReader(new InputStreamReader(System.in));
String entrada=null;
int puerto=-100000;
Cliente objeto=null;
String direc=null;
System.out.println("Introduzca los siguientes datos necesarios para la conexion");
try{
System.out.println("Direccion del Servidor: ");
direc=lectura.readLine();
System.out.println("Numero de Puerto: ");
entrada=lectura.readLine();
puerto=Integer.parseInt(entrada);
objeto=new Cliente(direc,puerto);
}catch(Exception e){
}
do{
objeto.enviarPeticion();
try{
System.out.println("Creando hebra de comunicacion entre " +
"clientes ...");
//Creamos una hebra y la ejecutamos por cada conexion aceptada
//de cada socket cliente
//COMO ALTERNAMOS ENTRE LA HEBRA DE COMUNICACION CON
//EL SERVIDOR Y ESTA????
new Recepcionista(serverSocket.accept()).start();
System.out.println("HOLA");
}catch(IOException e){
System.err.print("Error");
}
}while(true);
}
/***********************CLASE RECEPCIONISTA*****************************/
/**
*Esta clase la utilizamos cuando recibimos peticiones de comunicacion de otros
*clientes
*/
static public class Recepcionista extends Thread{
//Socket para la comunicacion entre clientes
Socket socket;
//Flujo de comunicación saliente con el cliente
PrintWriter out;
//Flujo de comunicacion entrante con el cliente
BufferedReader in;
/** Constructor de la clase ComunicacionEntrante */
Recepcionista(Socket s) throws IOException{
System.out.println("Antes de aceptar");
try{
out= new PrintWriter(socket.getOutputStream(), true);
in= new BufferedReader(new InputStreamReader(socket.getInputStream()));
}catch (IOException e){
System.err.println("Error en la hebra "+this.currentThread().getName());
}
}
/*
*A continuacion definimos los metodos de la clase
*/
public void run(){
String mensaje;
do{
try{
mensaje=in.readLine();
System.out.println(mensaje);
}catch(IOException ex){
}
}while(true);
}
}
}
/*
* Cliente.java
*
* Created on 4 de abril de 2006, 17:06
*
* To change this template, choose Tools | Options and locate the template under
* the Source Creation and Management node. Right-click the template and choose
* Open. You can then make changes to the template in the Source Editor.
*/
import java.net.*;
import java.io.*;
import java.util.*;
/**
*
* @author Dididito
*/
public class Cliente{
/*
*Definimos las variables miembro que corresponderan a esta clase, pero SOLO
*considerando la comunicacion cliente cliente, es decir, por ahora pasamos
*de la comunicacion cliente servidor, ya lo uniremos.
*Hay que aclarar, que una vez que se haya establecido la conexion entre
*los dos clientes,la comunicacion se llevara a cabo mediante otras clases
*/
//ServerSocket necesario para la peticion de comunicacion entre clientes
static ServerSocket serverSocket;
//Puerto por el que nos comunicaremos con el cliente
int puerto;
//Socket para llevar a cabo la comunicación
static Socket socketCliente;
//Flujo de comunicación saliente con el servidor
PrintWriter out;
//Flujo de comunicacion entrante con el servidor
BufferedReader in;
//Referencia a la clase ClienteProtocoloDirectorio
ClienteProtocoloDirectorio clientito;
// Estados del protocolo
static final int estadoInicial=0;
static final int estadoSaludado=1;
static final int estadoRegistrado=2;
/** Constructor de la clase Cliente */
public Cliente(String direccionIPServidor,int puerto) throws IOException{
//Creamos el Socket, para establecer la comunicacion con el servidor
System.out.println("INCIAMOS SERVICIO CLIENTE SERVIDOR");
iniciarServicioClientToServer(direccionIPServidor,puerto);
//Iniciamos el servicio (creacion del serverSocket), para poder atender
//peticiones entrantes
System.out.println("INCIAMOS SERVICIO CLIENTE CLIENTE");
iniciarServicioClientToClient(puerto);
out=new PrintWriter(socketCliente.getOutputStream(), true);
in= new BufferedReader(new InputStreamReader(socketCliente.getInputStream()));
clientito=new ClienteProtocoloDirectorio(out,in);
}
/*
*A continuacion definimos los metodos de la clase
*/
void enviarPeticion(){
String mensaje;
BufferedReader lectura=new BufferedReader(new InputStreamReader(System.in));
try{
switch (clientito.enviarTipoPeticion()){
//Primer caso: Cliente desconectado, que desea conectarse
case ClienteProtocoloDirectorio.conectado:
mensaje="Quiero conectarme";
out.println(mensaje);
mensaje=in.readLine();
if(mensaje.compareTo(clientito.mBienvenidaCliente())==0){
clientito.estado=estadoSaludado;
}else{
System.out.println("Lo siento pero no te has conectado correctamente, vuelve a intentarlo");
clientito.estado=estadoInicial;
}
break;
case ClienteProtocoloDirectorio.registrado:
String login=null,pass=null,nombre=null,direccion=null;
System.out.println("Introduce tus datos por favor");
System.out.print("Login: ");
login=lectura.readLine();
System.out.print("Password: ");
pass=lectura.readLine();
System.out.print("Nombre: ");
nombre=lectura.readLine();
System.out.print("Direccion: ");
direccion=lectura.readLine();
mensaje=clientito.mSolicitudRegistro(login,pass,nombre,direccion);
out.println(mensaje);
//Comprobamos si el registro ha sido correcto para cambiar
//o no, la variable estado.
mensaje=in.readLine();
if(mensaje.compareTo(clientito.mRespuestaRegistroCorrecto("Has sido registrado."))==0){
clientito.estado=estadoRegistrado;
}else{
if(mensaje.compareTo(clientito.mRespuestaRegistroIncorrecto("No has sido registrado."))==0){
clientito.estado=estadoSaludado;
}
}
break;
case ClienteProtocoloDirectorio.anadir:
System.out.println("Introduce a continuacion el nombre del usuario que quieres añadir: ");
System.out.print("Nombre de Usuario: ");
nombre=lectura.readLine();
mensaje=clientito.mSolicitudAnadirContacto(nombre);
out.println(mensaje);
mensaje=in.readLine();
System.out.println(mensaje);
break;
case ClienteProtocoloDirectorio.listar:
mensaje=clientito.mSolicitudListaContactos();
out.println(mensaje);
mensaje=in.readLine();
System.out.println(mensaje);
break;
case ClienteProtocoloDirectorio.cerrar:
mensaje=clientito.mSolicitudCerrarSesion();
out.println(mensaje);
mensaje=in.readLine();
if(mensaje.compareTo(clientito.mRespuestaCerrarSesion())==0){
System.out.println("\n Cerrando Sesion...");
System.exit(0);
}else{
System.out.println("Conexion cerrada incorrectamente");
}
break;
case ClienteProtocoloDirectorio.eliminar:
System.out.println("Introduce a continuacion el nombre del usuario que quieres eliminar: ");
System.out.println("Nombre de Usuario: ");
nombre=lectura.readLine();
mensaje=clientito.mSolicitudEliminarContacto(nombre);
out.println(mensaje);
mensaje=in.readLine();
System.out.println(mensaje);
break;
case ClienteProtocoloDirectorio.localizar:
System.out.println("Introduce a continuacion el nombre del usuario que quieres localizar: ");
System.out.println("Nombre de Usuario: ");
nombre=lectura.readLine();
mensaje=clientito.mSolicitudLocalizarContacto(nombre);
out.println(mensaje);
mensaje=in.readLine();
System.out.println(mensaje);
break;
case ClienteProtocoloDirectorio.chatear:
System.out.println("Introduce a continuacion el nombre del usuario con el que quieres chatear: ");
System.out.println("Nombre de Usuario: ");
nombre=lectura.readLine();
mensaje=clientito.mSolicitudLocalizarContacto(nombre);
out.println(mensaje);
//aKI TENEMOS QUE INTERPRETAR LA DIRECCIN IP DEL CONTACTO
mensaje=in.readLine();
System.out.println(mensaje);
String []palabras=mensaje.split(" ");
//UNA VEZ INTERPRETADA LLAMARIAMOS AL METODO DE "CHATEAR"
//es decir, creamos un socket en la direccion IP obtenida
//y con el mismo puerto con el que nos conectamos al servidor
Socket comunicacion=new Socket(palabras[1],puerto);
System.out.println("\n");
chatear(comunicacion);
break;
default:
break;
}
}catch(Exception e){
}
}
int chatear(Socket s)throws IOException{
String mensaje=null;
//Creamos los flujos de entrada y salida para chatear con el otro usuario
PrintWriter salida=new PrintWriter(s.getOutputStream(), true);
BufferedReader entrada= new BufferedReader(new InputStreamReader(s.getInputStream()));
//Flujo para leer del teclado
BufferedReader lectura=new BufferedReader(new InputStreamReader(System.in));
try{
do{
mensaje=lectura.readLine();
salida.println(mensaje);
}while(mensaje.compareTo("z")!=0);
return 0;
}catch(IOException ex){
return -1;
}
}
/*
*iniciarServicioClientToClient
*Este metodo lo utilizamos para crear el serverSocket. Recibe como
*argumento el puerto de escucha para la creacion del ServerSocket
*devuelve 0 si el servicio se inicia correctamente
*devuelve 1 si el servicio se inicia incorrectamente
*/
static int iniciarServicioClientToClient(int port){
int error=0;
try{
System.out.println("Abriendo serversocket de escucha en el puerto" +
port+"...");
//EL PUERTO NO TENIA QUE SER EL MISMO!!!!!!!!??????????????\'\'
serverSocket=new ServerSocket(port+1);
System.out.append("El server socket se ha creado correctamente");
}catch(IOException ex){
ex.printStackTrace();
error=1;
}
return error;
}
/*
*iniciarServicioClientToServer
*Este metodo lo utilizamos para crear el Socket. Recibe como
*argumento el puerto de comunicacion del Socket y la direccion IP del
*servidor
*devuelve 0 si el servicio se inicia correctamente
*devuelve 1 si el servicio se inicia incorrectamente
*/
static int iniciarServicioClientToServer(String direccionIPServidor,int puerto){
int error=0;
// Abrimos el puerto especificado para acceso al servicio.
try {
System.out.print("Abriendo socket de escucha en puerto "+puerto+"...");
socketCliente=new Socket(direccionIPServidor,puerto);
System.out.println(" El socket para la comunicacion con el servidor" +
"se ha creado correctamente.");
} catch (IOException ex) {
ex.printStackTrace();
error=1;
}
return error;
}
public static void main(String args[]){
BufferedReader lectura=new BufferedReader(new InputStreamReader(System.in));
String entrada=null;
int puerto=-100000;
Cliente objeto=null;
String direc=null;
System.out.println("Introduzca los siguientes datos necesarios para la conexion");
try{
System.out.println("Direccion del Servidor: ");
direc=lectura.readLine();
System.out.println("Numero de Puerto: ");
entrada=lectura.readLine();
puerto=Integer.parseInt(entrada);
objeto=new Cliente(direc,puerto);
}catch(Exception e){
}
do{
objeto.enviarPeticion();
try{
System.out.println("Creando hebra de comunicacion entre " +
"clientes ...");
//Creamos una hebra y la ejecutamos por cada conexion aceptada
//de cada socket cliente
//COMO ALTERNAMOS ENTRE LA HEBRA DE COMUNICACION CON
//EL SERVIDOR Y ESTA????
new Recepcionista(serverSocket.accept()).start();
System.out.println("HOLA");
}catch(IOException e){
System.err.print("Error");
}
}while(true);
}
/***********************CLASE RECEPCIONISTA*****************************/
/**
*Esta clase la utilizamos cuando recibimos peticiones de comunicacion de otros
*clientes
*/
static public class Recepcionista extends Thread{
//Socket para la comunicacion entre clientes
Socket socket;
//Flujo de comunicación saliente con el cliente
PrintWriter out;
//Flujo de comunicacion entrante con el cliente
BufferedReader in;
/** Constructor de la clase ComunicacionEntrante */
Recepcionista(Socket s) throws IOException{
System.out.println("Antes de aceptar");
try{
out= new PrintWriter(socket.getOutputStream(), true);
in= new BufferedReader(new InputStreamReader(socket.getInputStream()));
}catch (IOException e){
System.err.println("Error en la hebra "+this.currentThread().getName());
}
}
/*
*A continuacion definimos los metodos de la clase
*/
public void run(){
String mensaje;
do{
try{
mensaje=in.readLine();
System.out.println(mensaje);
}catch(IOException ex){
}
}while(true);
}
}
}