elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


  Mostrar Temas
Páginas: [1]
1  Programación / Ejercicios / Cómo enviar un ArrayList del cliente al servidor usando UDP? en: 27 Mayo 2019, 15:58 pm
Quiero enviar una lista de números al servidor para que este al leerlos efectúe las operaciones correspondientes y devuelva el resultado de las mismas al cliente. Luego volverá a pedir números al cliente y de nuevo le devolverá el resultado correspondiente, repitiéndose el proceso hasta que el cliente introduzca un *, entonces ahí se cerraría conexión con el servidor. Tengo que hacerlo obligatoriamente utilizando protocolo UDP.

El problema es que al mandar los números por lo visto al servidor no le llegan dichos números y no hace nada. Cuando ejecuto el programa me pide los 4 números, los introduzco y ahí es donde se queda parado, el servidor no devuelve ningún resultado. Para guardar los números he utilizado el ArrayList numeros... el problema es el proceso para empaquetar esa lista de números en bytes, mandarlo al servidor y que este lo decodifique y lea esos números, ahí por lo visto no le llega la información al servidor. Soy un novato en esto de conexiones TCP/UDP, seguro que me habré equivocado pero no sé como solucionarlo, espero podáis orientarme un poco, porque estoy más perdido que un pulpo en un garaje.

Dejo los códigos de Servidor y Cliente, a ver si podéis decirme dónde he fallado...

Código
  1.    import java.awt.List;
  2.    import java.io.ByteArrayInputStream;
  3.    import java.io.ObjectInputStream;
  4.    import java.net.DatagramPacket;
  5.    import java.net.DatagramSocket;
  6.    import java.net.InetAddress;
  7.    import java.util.ArrayList;
  8.  
  9.    public class Servidor {
  10.  
  11.        public static void main(String args[]) throws Exception {
  12.  
  13.            DatagramSocket serverSocket = new DatagramSocket(9886);
  14.            byte[] infoRecibida = new byte[1024];
  15.            byte[] infoEnviada = new byte[1024];
  16.            byte[] paquete = new byte[1024];
  17.            String cadena;
  18.            List list;
  19.            int n1,n2,n3,n4;
  20.            int res;
  21.            String num;
  22.            String num1,num2,num3,num4;
  23.            String x;
  24.  
  25.  
  26.            while (true) {
  27.  
  28.                System.out.println("Esperando datagrama...");            
  29.                infoRecibida = new byte[1024];
  30.                DatagramPacket paqRecibido = new DatagramPacket(infoRecibida, infoRecibida.length);
  31.                serverSocket.receive(paqRecibido);            
  32.  
  33.  
  34.             // IP y puerto desde donde se manda mensaje
  35.  
  36.                InetAddress IPOrigen = paqRecibido.getAddress();
  37.                int puerto = paqRecibido.getPort();
  38.  
  39.  
  40.                //Estas dos lineas supuestamente serían para poder leer el arraylist enviado desde el cliente, aunque igual estoy equivocado
  41.  
  42.                ObjectInputStream inputStream = new ObjectInputStream(new ByteArrayInputStream(infoRecibida));
  43.                ArrayList<Integer> numeros = (ArrayList<Integer>)inputStream.readObject();
  44.  
  45.                n1 = numeros.get(0);
  46.                n2 = numeros.get(1);
  47.                n3 = numeros.get(2);
  48.                n4 = numeros.get(3);
  49.  
  50.                num1= Integer.toString(n1);
  51.                num2= Integer.toString(n2);
  52.                num3= Integer.toString(n3);
  53.                num4= Integer.toString(n4);
  54.  
  55.  
  56.                // Si alguno de los números introducidos es *
  57.                // envío "x" al cliente para que este se cierre, posteriormente sale del bucle y se cierra también el servidor
  58.  
  59.                if (num1=="*"||num2=="*"||num3=="*"||num4=="*") {
  60.                 x = "x";
  61.                 paquete = x.getBytes();
  62.                 DatagramPacket paqueteFinal = new DatagramPacket(paquete, paquete.length, IPOrigen, puerto);
  63.                    break;
  64.                }
  65.  
  66.  
  67.                //Hago las operaciones, el resultado lo paso a cadena y luego a bytes, para ser enviado al cliente
  68.  
  69.                res=(n1+n2)*n3-n4;
  70.                num = Integer.toString(res);                      
  71.                infoEnviada=num.getBytes();
  72.  
  73.  
  74.  
  75.                // ENVIO DATAGRAMA AL CLIENTE
  76.  
  77.                DatagramPacket paqEnviado = new DatagramPacket(infoEnviada, infoEnviada.length, IPOrigen, puerto);
  78.                serverSocket.send(paqEnviado);
  79.  
  80.            } //Fin While
  81.  
  82.  
  83.            serverSocket.close();
  84.            System.out.println("Socket cerrado...");
  85.  
  86.        }
  87.  
  88.    }
  89.  
  90.  
  91.  

Código
  1.  
  2.    import java.io.BufferedReader;
  3.    import java.io.ByteArrayOutputStream;
  4.    import java.io.InputStreamReader;
  5.    import java.io.ObjectOutputStream;
  6.    import java.net.DatagramPacket;
  7.    import java.net.DatagramSocket;
  8.    import java.net.InetAddress;
  9.    import java.util.ArrayList;
  10.  
  11.    public class Cliente {
  12.  
  13.        public static void main(String[] args) throws Exception {
  14.  
  15.         String cadena;    
  16.         BufferedReader in = new BufferedReader(new InputStreamReader(System.in));                
  17.         DatagramSocket clientSocket = new DatagramSocket();
  18.  
  19.  
  20.         //para recibir y enviar datos
  21.  
  22.            byte[] datosEnviados = new byte[1024];
  23.            byte[] datosRecibidos = new byte[1024];
  24.  
  25.  
  26.            InetAddress IPServidor = InetAddress.getByName(...); //En el paréntesis iría el número de ip del servidor adonde quiero mandarlo
  27.            int puerto = 6000;
  28.  
  29.            ArrayList<Integer> numeros = new ArrayList<>();
  30.  
  31.            while(true) {
  32.  
  33.             //Rellenamos ArrayList numeros
  34.  
  35.             for(int i=0; i<4;i++) {
  36.            System.out.println("Introduce un mensaje: ");
  37.            cadena = in.readLine();
  38.            numeros.add(Integer.parseInt(cadena));    
  39.             }
  40.  
  41.  
  42.             //Empaquetamos ArrayList en bytes para poder enviarlo al servidor
  43.  
  44.             ByteArrayOutputStream out = new ByteArrayOutputStream();
  45.             ObjectOutputStream outputStream = new ObjectOutputStream(out);
  46.             outputStream.writeObject(numeros);
  47.             byte[] listData = out.toByteArray();
  48.  
  49.  
  50.            DatagramPacket envio = new DatagramPacket(listData, listData.length, IPServidor, puerto);
  51.            clientSocket.send(envio);
  52.            outputStream.close();
  53.  
  54.  
  55.            //recibimos respuesta del servidor
  56.  
  57.            DatagramPacket recibo = new DatagramPacket(datosRecibidos, datosRecibidos.length);
  58.            System.out.println("Esperando datagrama...");
  59.            clientSocket.receive(recibo);
  60.            String numero = new String(recibo.getData());
  61.  
  62.                //Si el dato que devuelve el servidor es "x", salimos del bucle y se cierra el cliente      
  63.            if (numero.equals("x")) {
  64.                break;          
  65.            }        
  66.            System.out.println("\t Datos: " + numero);      
  67.  
  68.            } //Fin While
  69.  
  70.            clientSocket.close(); //Cerramos cliente
  71.        }
  72.  
  73.    }
  74.  



Mod: Obligatorio el uso de etiquetas GeSHi para sources.
2  Programación / Programación C/C++ / Problema con numeros decimales: en: 13 Diciembre 2013, 17:22 pm
Hola, me acabo de iniciar hará un par de semanas en el mundillo de la programacion, lo estoy haciendo por mi cuenta, y si veo que me va gustando igual me meto en un curso. El caso es que, como era de esperar, empiezo a tener los primeros problemas a la hora de hacer que funcionen los programas. Tengo muchas dudas, demasiadas. Pero por ahora solo expondré una de ellas, aquí os dejo el codigo de uno de mis programas (que sirve para hallar la media de tres números introducidos por el usuario):

#include <iostream>
#include <conio.h>
#include <string.h>
using namespace std;
int main (){
double x;
double y;
double z;
cout<<"Introduce el primer numero"<<endl;
cin>>x;
printf ("\n");
printf ("\n"); 
cout<<"Introduce el segundo numero"<<endl;
cin>>y;
printf ("\n");
printf ("\n");
cout<<"Introduce el tercer numero"<<endl;
cin>>z;
printf ("\n");
printf ("\n");
double media=(x+y+z)/3;
cout<<"La media aritmetica de estos numeros es"<<endl<<media;
getch();
}


Al meter cualquier número entero en el programa, este funciona a la perfección. El problema es si le doy a las variables un valor decimal (por ejemplo 8,3), el programa a partir de ese momento falla y no me deja escribir nada más. Y lo mismo que me pasa en ese programa me ocurre en cualquier otro en el que se trabajen con números. El programa se vuelve "loco" cada vez que meto un decimal. No sé donde está el fallo, y estoy seguro que para muchos aquí esto será pan comido, así que me gustaría que me dijerais que hice mal, o que elemento falta ahí, ya que no podré seguir avanzando en este mundillo sin resolver este tipo de fallos.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines