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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Mensajes
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++ / Re: Problema con numeros decimales: en: 13 Diciembre 2013, 19:30 pm
Antes que nada cuando postees código elige las etiquetas GeSHi y toma la C++ y en medio de las etiquetas Code que aparecen "pegas" tu código. Al no hacerlo de esta manera parte del código no sale correcta, especialmente las matrices.

Fíjate además que main es int, lo que requiere un return al final de la función.

Por otro lado, mezclas para imprimir cout, propio de C++, con printf, más propio - aunque no exclusivo- de C. Con lo que podrías usar cout en lugar de printf en este caso. Lo dejo así porque son sólo dos endl.

No incluyas librerías que no usas -cstring en lugar de string.h- y evita la de conio, y su función asociada getch(),  que no es estándar.

Y en lo posible, declara las variables al comienzo, no hace falta una línea para cada variable.



Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4. int main (){
  5.    double x,y,z,media;
  6.    cout<<"Introduce el primer numero: ";
  7.    cin>>x;
  8.    cout<<endl<<endl;
  9.    cout<<"Introduce el segundo numero: ";
  10.    cin>>y;
  11.    cout<<endl<<endl;
  12.    cout<<"Introduce el tercer numero:";
  13.    cin>>z;
  14.    cout<<endl<<endl;
  15.    media=(x+y+z)/3;
  16.    cout<<"La media aritmetica de estos numeros es: "<<media<<endl;
  17.    return 0;
  18. }
  19.  

Saluditos! ..... !!!!        


Gracias por tus consejos!
Ten en cuenta que acabo de empezar hace unas dos semanas, y en plan autodidacta, los escasos conocimientos que tengo en esta materia se deben a un blog que estoy siguiendo en el que un docente experto en la materia nos explica los fundamentos básicos y nos deja ejercicios para resolver, lo que sé lo he sacado de ahí, aunque está claro que cada uno tendrá su punto de vista o sus métodos preferidos a la hora de ponerse manos a la obra, pero yo como buen novato que soy todavía no tengo ni idea de varios truquillos que me cuentas. Pero está bien que me lo hayas dejado, lo tomaré en cuenta para ir aprendiendo cosillas, que de eso se trata.

Por lo menos ya me funcionan mis "programas", que me había quedado estancado por la chorrada de las comas.
3  Programación / Programación C/C++ / Re: Problema con numeros decimales: en: 13 Diciembre 2013, 19:15 pm
Si apenas empiezas lo primero que debes hacer es leer el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

El problema que mencionas se debe a que en C y C++ el separador no es la coma, es el punto.

Un saludo

Joder! qué fácil era! y yo dos p.tos dias de mala leche y rompiendome la cabeza porque no salia nada bien. Y todo por un puntito.

Te quiero tío! Ahora lo entiendo todo y ya todo funciona a la perfección. Sé que esto sólo es el comienzo, vendrán más dudas después, pero al menos podré seguir avanzando. Gracias por tomarte la molestia de responderme, cuando no esté tan verde y tenga algo más de nivel trataré yo también de resolver dudas de otros usuarios, al fin y al cabo programador es sólo una profesión más, y si queremos crecer en esto también es importante ayudarnos entre nosotros.
Saludos y gracias por la respuesta
4  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