Es raro lo que te sucede.
Por cierto, arreglado. me falta gestionar el tema de la desconexión de clientes.
include "include/Cliente.nvgt"
funcdef void FuncEscuchar();
void main() {
show_window("test");
wait(10);
// Crear una instancia de Cliente
Cliente cliente("localhost", 233);
// Intentar conectar al servidor
if (!cliente.conectar()) {
screen_reader_speak("Error conectando al servidor", true);
return;
}
wait(10);
screen_reader_speak("Conectado al servidor", true);
// Crear una delegación para la función escuchar
async<void>(cliente.get_escuchar_func());
while (true) {
// Verificar si la tecla F4 está presionada para enviar un ping
if (key_pressed(KEY_F4)) {
cliente.enviar_ping();
wait(500); // Espera para evitar múltiples pulsaciones rápidas
}
wait(10); // Añadir una pequeña espera para evitar un bucle excesivamente rápido
}
}
class Cliente {
network n;
string direccion;
int puerto;
bool conectado;
datetime tiempo_ping;
Cliente(string dir, int p) {
direccion = dir;
puerto = p;
conectado = false;
}
bool conectar() {
if (!n.setup_client(1, 10)) {
// error no se ha podido iniciar el cliente
return false;
}
if (n.connect(direccion, puerto) == 0) {
// error no se ha podido conectar al servidor
alert("error", "No hay servidor");
return false;
}
conectado = true;
return true;
}
void enviar_mensaje(string mensaje) {
if (conectado) {
n.send_reliable(1, mensaje, 0);
}
}
void enviar_ping() {
if (conectado) {
tiempo_ping.set_date(DATE_YEAR, DATE_MONTH, DATE_DAY);
tiempo_ping.set_time(TIME_HOUR, TIME_MINUTE, TIME_SECOND);
n.send_reliable(1, "ping", 0);
screen_reader_speak("Ping enviado", true);
}
}
void escuchar() {
while (true) { // Aquí añadimos un bucle para mantener la escucha activa
wait(5);
network_event e = n.request(5); // Removemos @
if (e.type != event_none) { // Verificamos si no es null
procesar_evento(e);
}
}
}
void procesar_evento(network_event e) {
if (e.type == event_receive) {
if (e.message == "pong") {
datetime tiempo_pong;
tiempo_pong.set_date(DATE_YEAR, DATE_MONTH, DATE_DAY);
tiempo_pong.set_time(TIME_HOUR, TIME_MINUTE, TIME_SECOND);
int ms = calcular_diferencia_ms(tiempo_ping, tiempo_pong);
screen_reader_speak("Pong recibido en " + ms + " ms", true);
}
}
}
int calcular_diferencia_ms(datetime inicio, datetime fin) { // Removemos @
int diff = (fin.hour - inicio.hour) * 3600000 + (fin.minute - inicio.minute) * 60000 + (fin.second - inicio.second) * 1000;
return diff;
}
FuncEscuchar@ get_escuchar_func() {
return FuncEscuchar(this.escuchar);
}
}