Как посылать ArrayList клиента в сервер используя UDP?

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

Проблема состоит, в том, что послав числа по-видимому в сервер, к нему не прибывают вышеупомянутые числа, и он ничего не делает. Когда я выполняю программу, он просит у меня 4 числа, я ввожу их и там он, где он остается слабым, сервер не возвращает никакого результата. Чтобы сохранять числа я использовал ArrayList число... проблема - процесс, чтобы упаковывать этот список чисел в байт, это посылать в сервер, и что этот это декодировал и читал эти числа, там по-видимому к нему не прибывает информация в сервер. Я - новичок в этом связей TCP/UDP, конечно, что я ошибусь, но не знаю, как решать это, надеюсь, что вы можете ориентировать меня немного, потому что я более потерян, чем осьминог в гараже.

Код сервера есть:

import java.awt.List;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.ArrayList;

public class Servidor {

    public static void main(String args[]) throws Exception {

        DatagramSocket serverSocket = new DatagramSocket(9886);
        byte[] infoRecibida = new byte[1024];
        byte[] infoEnviada = new byte[1024];
        byte[] paquete = new byte[1024];
        String cadena;
        List list;
        int n1,n2,n3,n4;
        int res;
        String num;
        String num1,num2,num3,num4;
        String x;


        while (true) {

            System.out.println("Esperando datagrama...");            
            infoRecibida = new byte[1024];
            DatagramPacket paqRecibido = new DatagramPacket(infoRecibida, infoRecibida.length);
            serverSocket.receive(paqRecibido);            


         // IP y puerto desde donde se manda mensaje

            InetAddress IPOrigen = paqRecibido.getAddress();
            int puerto = paqRecibido.getPort();


            //Estas dos lineas supuestamente serían para poder leer el arraylist enviado desde el cliente, aunque igual estoy equivocado

            ObjectInputStream inputStream = new ObjectInputStream(new ByteArrayInputStream(infoRecibida));
            ArrayList<Integer> numeros = (ArrayList<Integer>)inputStream.readObject();

            n1 = numeros.get(0);
            n2 = numeros.get(1);
            n3 = numeros.get(2);
            n4 = numeros.get(3);

            num1= Integer.toString(n1);
            num2= Integer.toString(n2);
            num3= Integer.toString(n3);
            num4= Integer.toString(n4);


            // Si alguno de los números introducidos es * 
            // envío "x" al cliente para que este se cierre, posteriormente sale del bucle y se cierra también el servidor

            if (num1=="*"||num2=="*"||num3=="*"||num4=="*") {
                x = "x";
                paquete = x.getBytes();
                DatagramPacket paqueteFinal = new DatagramPacket(paquete, paquete.length, IPOrigen, puerto);
                break;
            }


            //Hago las operaciones, el resultado lo paso a cadena y luego a bytes, para ser enviado al cliente

            res=(n1+n2)*n3-n4;
            num = Integer.toString(res);                      
            infoEnviada=num.getBytes();



            // ENVIO DATAGRAMA AL CLIENTE

            DatagramPacket paqEnviado = new DatagramPacket(infoEnviada, infoEnviada.length, IPOrigen, puerto);
            serverSocket.send(paqEnviado);

        } //Fin While


        serverSocket.close();
        System.out.println("Socket cerrado...");

    }

}

И тот этого Клиента

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.ArrayList;

public class Cliente {

    public static void main(String[] args) throws Exception {

        String cadena;      
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));                       
        DatagramSocket clientSocket = new DatagramSocket();


        //para recibir y enviar datos 

        byte[] datosEnviados = new byte[1024];
        byte[] datosRecibidos = new byte[1024];


        InetAddress IPServidor = InetAddress.getByName(...); //En el paréntesis iría el número de ip del servidor adonde quiero mandarlo
        int puerto = 6000;

        ArrayList<Integer> numeros = new ArrayList<>();

        while(true) {

            //Rellenamos ArrayList numeros

            for(int i=0; i<4;i++) {
                System.out.println("Introduce un mensaje: ");
                cadena = in.readLine();
                numeros.add(Integer.parseInt(cadena));          
            }


            //Empaquetamos ArrayList en bytes para poder enviarlo al servidor

            ByteArrayOutputStream out = new ByteArrayOutputStream();
            ObjectOutputStream outputStream = new ObjectOutputStream(out);
            outputStream.writeObject(numeros);
            byte[] listData = out.toByteArray();


            DatagramPacket envio = new DatagramPacket(listData, listData.length, IPServidor, puerto);
            clientSocket.send(envio);
            outputStream.close();


            //recibimos respuesta del servidor

            DatagramPacket recibo = new DatagramPacket(datosRecibidos, datosRecibidos.length);
            System.out.println("Esperando datagrama...");
            clientSocket.receive(recibo);
            String numero = new String(recibo.getData()); 

            //Si el dato que devuelve el servidor es "x", salimos del bucle y se cierra el cliente       
            if (numero.equals("x")) { 
                break;           
            }        
            System.out.println("\t Datos: " + numero);      

        } //Fin While

        clientSocket.close(); //Cerramos cliente
    }

}
5
задан 27.05.2019, 13:25
0 ответов