Я пытаюсь использовать dagramsocket для отправки пакетов с клиента на сервер, но, потратив несколько часов на поиск информации в StackOverflow и официальной документации, я все еще получаю IOException.
У меня есть сервер, который получает предложение от клиента, меняет предложение и печатает новое предложение. Есть идеи, почему это не работает? Вот код:
Клиент:
public class YodafyClienteTCP {
public static void main(String[] args) {
byte []buferEnvio;
byte []buferRecepcion=new byte[256];
int bytesLeidos=0;
// Nombre del host donde se ejecuta el servidor:
String host="localhost";
// Puerto en el que espera el servidor:
int port=8989;
DatagramPacket paquete;
InetAddress direccion;
// Socket para la conexión TCP
DatagramSocket socketServicio;
try {
// Creamos un socket que se conecte a "host" y "port":
socketServicio=new DatagramSocket();
direccion = InetAddress.getByName(host);
buferEnvio="Al monte del volcán debes ir sin demora".getBytes();
paquete = new DatagramPacket(buferEnvio, buferEnvio.length, direccion, port);
// Enviamos el array por el socket;
socketServicio.send(paquete);
System.out.println("Paquete enviado por el cliente.");
socketServicio.close();
// Excepciones:
} catch (UnknownHostException e) {
System.err.println("Error: Nombre de host no encontrado.");
e.printStackTrace();
} catch (IOException e) {
System.err.println("Error de entrada/salida al abrir el socket.");
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}
}
}
Класс, изменяющий предложение, вызываемый сервером
public class ProcesadorYodafy {
// Referencia a un socket para enviar/recibir las peticiones/respuestas
private DatagramSocket socketServicio;
// Para que la respuesta sea siempre diferente, usamos un generador de números aleatorios.
private Random random;
// Constructor que tiene como parámetro una referencia al socket abierto en por otra clase
public ProcesadorYodafy(DatagramSocket socketServicio) {
this.socketServicio=socketServicio;
random=new Random();
}
// Aquí es donde se realiza el procesamiento realmente:
void procesa(){
// Como máximo leeremos un bloque de 1024 bytes. Esto se puede modificar.
byte [] datosRecibidos=new byte[1024];
int bytesRecibidos=0;
DatagramPacket paquete;
// Array de bytes para enviar la respuesta. Podemos reservar memoria cuando vayamos a enviarla:
byte [] datosEnviar;
try {
// Lee la frase a Yodaficar:
paquete = new DatagramPacket(datosRecibidos, datosRecibidos.length);
socketServicio.receive(paquete);
datosRecibidos = paquete.getData();
bytesRecibidos = datosRecibidos.length;
//yodaDo is just a method that changes some characters in the sentence
String peticion=new String(datosRecibidos,0,bytesRecibidos);
String respuesta=yodaDo(peticion);
System.out.println("Here is your new sentence : " + respuesta);
socketServicio.close();
} catch (IOException e) {
System.err.println("Error al obtener los flujos de entrada/salida.");
}
}
Сервер:
public class YodafyServidorIterativo {
public static void main(String[] args) {
// Puerto de escucha
int port=8989;
// array de bytes auxiliar para recibir o enviar datos.
byte []buffer=new byte[256];
// Número de bytes leídos
int bytesLeidos=0;
//Socket
DatagramSocket socketServicio;
try {
// Abrimos el socket en modo pasivo, escuchando el en puerto indicado por "port"
socketServicio = new DatagramSocket(port);
// Mientras ... siempre!
do {
//////////////////////////////////////////////////
// Creamos un objeto de la clase ProcesadorYodafy, pasándole como
// argumento el nuevo socket, para que realice el procesamiento
// Este esquema permite que se puedan usar hebras más fácilmente.
ProcesadorYodafy procesador=new ProcesadorYodafy(socketServicio);
procesador.procesa();
} while (true);
} catch (IOException e) {
System.err.println("Error al escuchar en el puerto "+port);
}
}
}