Aplicacion Cliente-Cliente

Dididito
05 de Mayo del 2006
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);
}
}

}

Dididito
05 de Mayo del 2006
Al final se me ha olvidado escribir donde estaba el problema, esta en el main de la clase Cliente, justo antes de despues de hacer objeto.enviarPeticion()