Buenas.
Abro este hilo para pedir ayuda con un asuntillo de programación. El tema es que nos han mandado hacer un chat en java, algo básico pues no hemos dado mucho (se ejecuta en la terminal y tal...). Teníamos que hacer la parte del cliente y la del servidor, y ya está hecha y funcionaba bien y tal, pero nos ha pedido modificar el cliente porque, que aunque ya está bien, nos sobraban prácticas.
Lo que nos ha mandado cambiar es que de la manera en que lo teníamos hecho, mientras tú estabas escribiendo en la terminal, si te llegaba un mensaje de otro usuario, se te intercala en la línea que estás escribiendo y sigue luego. Llevo mucho tiempo pensando y no se me ocurre cómo.
Él nos había dicho hacer que no imprimiera por pantalla hasta que pulsas el Enter para enviar tu mensaje, y ante la posibilidad de que el usuario no escribiera, para que no se quedara sin poder leer, meter además un temporizador. Pero no me convence ni sé muy bien cómo hacerlo, así que, me pongo en vuestras manos.
El código del cliente es éste:
ClienteChatimport java.util.Locale;
import java.io.;
import java.net.;
public class ClienteChat{
public static int puerto = 0;
public static String hostname = null;
public static String fraseaenviar;
public static void main(String[] args) throws Exception {
Locale.setDefault(Locale.ENGLISH);
if ( parse(args)==false ) {
return;
}
Socket socketcliente = new Socket(hostname, puerto);
BufferedReader tecladousuario = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(socketcliente.getOutputStream(),true);
new ClienteChatThread(socketcliente).start();
fraseaenviar = tecladousuario.readLine();
while (!fraseaenviar.equals("exit")) {
out.println(fraseaenviar);
fraseaenviar = tecladousuario.readLine();
}
if (!socketcliente.isClosed()) {
out.println("exit");
}
}
//Función parse para interpretar las opciones de la línea de comandos
public static boolean parse(String[] args) {
boolean resultado=true;
if ( args.length>2 ) {
System.out.printf("Demasiadas opciones\n");
resultado=false;
} else if ( args.length<2 ) {
System.out.printf("Escriba la ip del servidor y el puerto de conexión\n");
resultado=false;
} else {
hostname=args[0];
try {
puerto=Integer.parseInt(args[1]);
} catch (NumberFormatException e) {
System.out.printf("Puerto erróneo\n");
resultado=false;
}
}
return resultado;
}
}
ClienteChatThreadimport java.io.;
import java.net.;
public class ClienteChatThread extends Thread {
Socket socketcliente = null;
public ClienteChatThread(Socket socketcliente) {
super("ClienteChatThread");
this.socketcliente = socketcliente;
}
public void run() {
try{
BufferedReader fraseserver = new BufferedReader(new InputStreamReader(socketcliente.getInputStream()));
String respuesta;
respuesta = fraseserver.readLine();
while(respuesta!=null){
System.out.println(respuesta);
respuesta = fraseserver.readLine();
}
if (!(ClienteChat.fraseaenviar).equals("exit")) {
System.out.println("Escriba <exit> si desea finalizar.");
}
socketcliente.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
Por si hay que tenerlo en cuenta para algo, usamos Ubuntu.
Muchas gracias de antebra$ho y esas cosas.
PD: Creo que éste era el subforo, si no es así, pido disculpas y ruego a moderación lo muevan a donde corresponde.