Buenas tengo una duda y es que en un ejercicio a realizar con Sockets se me pide que el Servidor le envíe al Cliente la fecha y la hora actuales, lo he hecho pero me da fallos a la hora de ejecutar el servidor y no se porque, a continuacion paso el codigo del servidor y del cliente(es el que recibe la fecha y hora del servidor y debe de mostrar la siguiente informacion: Se han recibido <número de caracteres, incluidos espacios y saltos de línea> bytes
<Fecha y hora recibidas tal cual se recibieron del servidor de hora>. Yo para ello he hecho un bucle for que analice el mensaje recibido del servidor para poder contar el numero de caracteres, los espacios y mostrarlos por pantalla), es la primera vez que trato con sockets y muchas veces no se si lo estoy haciendo bien o no :(.
SERVIDOR:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
public class ServidorDiaHora {
@SuppressWarnings({ "resource", "unused" })
public static void main(String[] args) throws IOException {
ServerSocket servidor = null;
Socket sc = null;
final int PUERTO = 5000;
final String HOST="127.0.0.1"; //INDICO A QUIEN ME VOY A CONECTAR
DataInputStream in;
DataOutputStream out;
servidor = new ServerSocket(PUERTO);
//- Cuando se inicia el Socket Servidor:
//El servidor de DayTime ha arrancado: ServerSocket[ addr=<dirección>,localport=<número puerto local>]
System.out.println("El servidor de DayTime ha arrancado" ); //El servidor siempre estará atento a escuchas peticiones de los clientes
while(true) {
sc = servidor.accept();
//Cliente conectado desde <host> al puerto <número puerto local> desde el puerto <número puerto
//cliente>
System.out.println("Cliente conectado");//Aviso cliente conectado
//Creamos puentes de comunicacion
in = new DataInputStream(sc.getInputStream()); //inputStream(LEE): cliente -> servidor
out= new DataOutputStream(sc.getOutputStream()); //outputStream(ESCRIBE): servidor -> cliente
//Esto me servirá para enviar la fecha y la hora
Date fechaHoraActuales = new Date();
out.writeUTF("Fecha y Hora enviadas: "+ fechaHoraActuales); //Yo le escribo un mensaje
sc.close();//Cerramos el cliente.
System.out.println("Cliente desconectado");//Aviso de que esta desconectado
}
}
}
CLIENTE:
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
public class CienteDiaHora {
public static void main(String[] args) throws IOException {
final String HOST="127.0.0.1"; //INDICO A QUIEN ME VOY A CONECTAR
final int PUERTO=5000;//Pongo el puerto que puse en el servidor
//Clases necesarias
DataInputStream in;
//Cuando el cliente conecta exitosamente al servidor:
//Cliente TCP conectado a <nombre host> en el puerto <número puerto>
Socket sc = new Socket(HOST, PUERTO); //A esta clase socket le pasamos el HOST y el PUERTO
System.out.println("Cliente TCP conectado a: "+HOST+" en el puerto: "+PUERTO);
//Creamos puentes de comunicacion
in = new DataInputStream(sc.getInputStream()); //inputStream(LEE): cliente -> servidor
String mensaje = in.readUTF(); //leemos el mensaje
System.out.println(mensaje);
//Esto me servirá para contar los caracteres, los espacios
String mayus="";
String minus="";
String numeros="";
String letras="";
int n_mayus=0;
int n_minus=0;
int n_numeros=0;
int n_letras=0;
int n_espacios=0;
for(int i=0; i<mensaje.length();i++) {
if(Character.isLetter(mensaje.charAt(i))) {
n_letras++;
letras+=mensaje.charAt(i)+" * ";
}
if(Character.isUpperCase(mensaje.charAt(i))) {
n_mayus++;
mayus+=mensaje.charAt(i)+" * ";
}
if(Character.isLowerCase(mensaje.charAt(i))) {
n_minus++;
minus+=mensaje.charAt(i)+" * ";
}
if(Character.isDigit(mensaje.charAt(i))) {
n_numeros++;
numeros+=mensaje.charAt(i)+" * ";
}
if(Character.isSpaceChar(mensaje.charAt(i))) {
n_espacios++;
}
}
System.out.println("Mensaje recibido: "+mensaje);
System.out.println("Mayusculas("+n_mayus+"): "+mayus);
System.out.println("Minusculas("+n_minus+"): "+minus);
System.out.println("Numeros("+n_numeros+"): "+numeros);
System.out.println("Letras("+n_letras+"): "+letras);
System.out.println("Espacios: "+n_espacios);
//- Una vez ha recibido la información del servidor:
//Se han recibido <número de caracteres, incluidos espacios y saltos de línea> bytes
//<Fecha y hora recibidas tal cual se recibieron del servidor de hora>
sc.close();
}
}
El código que has puesto funciona.
He ejecutado el Servidor 1 vez y el Cliente 2 veces (la segunda tras haber terminado la primera) y estos son los resultados de la ejecución:
Del lado del Servidor:
El servidor de DayTime ha arrancado
Cliente conectado
Cliente desconectado
Cliente conectado
Cliente desconectado
Del lado del Cliente:
Cliente TCP conectado a: 127.0.0.1 en el puerto: 5000
Fecha y Hora enviadas: Sat May 07 19:09:11 CEST 2022
Mensaje recibido: Fecha y Hora enviadas: Sat May 07 19:09:11 CEST 2022
Mayusculas(8): F * H * S * M * C * E * S * T *
Minusculas(20): e * c * h * a * y * o * r * a * e * n * v * i * a * d * a * s * a * t * a * y *
Numeros(12): 0 * 7 * 1 * 9 * 0 * 9 * 1 * 1 * 2 * 0 * 2 * 2 *
Letras(28): F * e * c * h * a * y * H * o * r * a * e * n * v * i * a * d * a * s * S * a * t * M * a * y * C * E * S * T *
Espacios: 9
Cliente TCP conectado a: 127.0.0.1 en el puerto: 5000
Fecha y Hora enviadas: Sat May 07 19:09:12 CEST 2022
Mensaje recibido: Fecha y Hora enviadas: Sat May 07 19:09:12 CEST 2022
Mayusculas(8): F * H * S * M * C * E * S * T *
Minusculas(20): e * c * h * a * y * o * r * a * e * n * v * i * a * d * a * s * a * t * a * y *
Numeros(12): 0 * 7 * 1 * 9 * 0 * 9 * 1 * 2 * 2 * 0 * 2 * 2 *
Letras(28): F * e * c * h * a * y * H * o * r * a * e * n * v * i * a * d * a * s * S * a * t * M * a * y * C * E * S * T *
Espacios: 9
Si te sigue dando problemas, adjunta el error concreto que te produce y qué situación lo produce (pasos que sigues para que aparezca).
PD: Te puede estar dando un error (ConnectException) si ejecutas el Cliente antes que el Servidor. Eso es normal y es porque el Cliente no puede conectarse si el Servidor no está levantado.