通过datagramsocket(Java)获取IOException接收datagrampakcet

时间:2018-11-17 19:41:12

标签: java udp ioexception

我正在尝试使用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 :(得分:0)

首先,这是UDP连接,例如提及here。寻找正确的连接,您会更快地找到需求文档。

第二,可能是您的问题,无论是什么原因,都是由以下原因引起的:

  1. 您的一项服务无法启动或
  2. 您未设置客户端应用程序的端口,并且认为您在本地使用此端口,可能会导致资源冲突。

尝试设置客户端的端口,并在启动客户端之前确保服务器已启动。

答案 1 :(得分:0)

已解决。我正在关闭ProcesadorYodafy类中的datagramsocket,并且只在服务器中打开了一次套接字,因此在循环的以下迭代中,尽管我将包发送到了那里,但datagramsocket还是关闭了。谢谢大家