Получение IOException при получении datagrampakcet через datagramsocket (Java) - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь использовать 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);
        }

    }

}

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

решаемая.Я закрывал datagramsocket в классе ProcesadorYodafy и открывал сокет только один раз на сервере, поэтому в следующей итерации цикла datagramsocket был закрыт, несмотря на то, что я отправлял туда пакет.Спасибо всем

0 голосов
/ 17 ноября 2018

Прежде всего, это соединение UDP, как упомянуто здесь . Ища правильное соединение, вы быстрее найдете нужную документацию.

Во-вторых, возможно, ваша проблема, когда бы то ни было, вызвана:

  1. Одна из ваших служб не запущена или
  2. Вы не устанавливаете порт своего клиентского приложения и, думая, что используете это локально, могут вызвать конфликты ресурсов.

Попробуйте установить порт вашего клиента и убедитесь, что ваш сервер запущен перед запуском вашего клиента.

...