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

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Ayuda con problema UDP
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con problema UDP  (Leído 4,896 veces)
Superplay


Desconectado Desconectado

Mensajes: 670



Ver Perfil
Ayuda con problema UDP
« en: 20 Diciembre 2011, 17:28 pm »

Buenas, he realizado el siguiente código:

Código:
import java.net.*;
import java.io.*;

public class ejercicio53cliente
{
    int puertoLocal;
    DatagramSocket socket;
    InetAddress ipLocal;
   
    public ejercicio53cliente(int puertoLocal) throws Exception{
        this.puertoLocal = puertoLocal;
        ipLocal = InetAddress.getLocalHost();
        socket = new DatagramSocket(puertoLocal, ipLocal);
    }
   
    public static void main(String args[]) throws Exception
        {
            char eleccion;
            int salir;
            DatagramPacket p;
        System.out.println("\t****Bienvenido a su cliente de mensajería UDP****");
        System.out.println("0- Salir");
        System.out.println("1- Enviar mensaje");
        System.out.println("2- Recibir mensaje");
        System.out.println("Seleccione la opción que desee realizar:");
        eleccion=(char) System.in.read();
       
        //lee un carácter desde el teclado que se queda en el buffer hasta que se pulsa ENTER
       
System.in.read();//Cuando presionamos Enter permite avanzar.
switch (eleccion)//Sentencia Switch
{
case '0':
System.out.println("¿Desea salir? Introduzca un 1 si lo desea: ");
salir=System.in.read();//Lee el número que introduzca el usuario

if(salir==1){
System.exit(0);
}
break;
case '1':
ejercicio53cliente cl = new ejercicio53cliente(2000);
System.out.println("\tIntroduzca el texto a enviar al servidor:\n");
    InputStreamReader isr = new InputStreamReader(System.in);
    BufferedReader inv = new BufferedReader(isr);
   
    String parrafo;
   
        parrafo = inv.readLine();
       
    inv.close();
    System.out.println("Introduzca la IP destinataria del mensaje: \n");
    String ip;
    ip = inv.readLine();
    inv.close();
    byte data[]=parrafo.getBytes();
    InetAddress destino = InetAddress.getByName(ip);
    p=new DatagramPacket(data,data.length,destino,3000);
    cl.socket.send(p);
    cl.socket.close();
break;

case '2':
    cl = new ejercicio53cliente(3000);
    String texto;
    p=new DatagramPacket(new byte[100],100);
    cl.socket.receive(p);
    cl.socket.close();
    texto = new String(p.getData());
    System.out.println(texto);
break;
}
            }
        }

Cuyo enunciado es:

Citar
Diseñe una aplicación cliente que sea capaz de leer líneas de texto desde el
teclado ininterrumpidamente, y que envíe esa información a otro computador a
través de UDP. 
 
La aplicación terminará cuando la línea leída sea la palabra "fin".

Pues bien, compilo sin problemas y cuando me dispongo a dar a la opción 1, enviar mensaje... me deja escribir el mensaje y al dar a enter... me da error la linea:

   
Código:
 ip = inv.readLine();

Después de salir la petición de ip.

¿Podéis decirme por qué? Gracias.

Por cierto, si quisiera hacer lo mismo, pero leyendo un fichero de .txt y enviandolo al destino y que este lo lea (con el case 2) y lo guarde, ¿cómo se podría hacer? Creo que sería implementar una línea similar a la siguiente, pero no estoy seguro:

Código:
            //Definimos un lugar de donde van a entrar todos los carácteres que llamaremos inv
           InputStreamReader isr = new InputStreamReader(System.in);
           BufferedReader inv = new BufferedReader(isr);
           
           String parrafo; //Variable de tipo cadena que usaremos para almacenar una línea de texto
           FileWriter fw=new FileWriter ("anonimo.txt");
           BufferedWriter inv2 = new BufferedWriter(fw);
           PrintWriter anonimo= new PrintWriter (inv2); //Escribe en el fichero
         
           do{
           parrafo = inv.readLine();    //Lee una línea de texto
           anonimo.println(parrafo);    //Escribe la línea que ha leído en la línea de código anterior
        //Le indicamos que mientras parrafo no sea igual a fin, continué
            }while(!parrafo.equalsIgnoreCase("fin"));
           
            anonimo.close();

Un cable por favor, lo antes posible.


En línea



"Nací siendo un virus" By Windows.
Este mensaje no es por ofender, yo uso Windows también, simplemente... es broma ;)
Leyer


Desconectado Desconectado

Mensajes: 786


leyer@elhacker.net


Ver Perfil WWW
Re: Ayuda con problema UDP
« Respuesta #1 en: 20 Diciembre 2011, 17:34 pm »

primero lo primero

Código
  1. String parrafo;
  2.  
  3.        parrafo = inv.readLine();
  4.  
  5.    //inv.close(); /// no puedes leer si lo estas cerrado xD
  6.    System.out.println("Introduzca la IP destinataria del mensaje: \n");
  7.    String ip;
  8.    ip = inv.readLine();


En línea

Superplay


Desconectado Desconectado

Mensajes: 670



Ver Perfil
Re: Ayuda con problema UDP
« Respuesta #2 en: 20 Diciembre 2011, 17:51 pm »

primero lo primero

Código
  1. String parrafo;
  2.  
  3.        parrafo = inv.readLine();
  4.  
  5.    //inv.close(); /// no puedes leer si lo estas cerrado xD
  6.    System.out.println("Introduzca la IP destinataria del mensaje: \n");
  7.    String ip;
  8.    ip = inv.readLine();

Gracias, de momento avanza la cosa... ahora cuando le pones la IP no hace nada, supongo porque debe haber un ordenador con esa IP y en modo recibir para recibir el mensaje


Si quisiera escribir y que envíe hasta que escriba fin, sería poner primero preguntando ip y después el texto mediante el bucle:
Código:
            //Definimos un lugar de donde van a entrar todos los carácteres que llamaremos inv
           InputStreamReader isr = new InputStreamReader(System.in);
           BufferedReader inv = new BufferedReader(isr);
           
           String parrafo; //Variable de tipo cadena que usaremos para almacenar una línea de texto
           
           do{
           parrafo = inv.readLine();    //Lee una línea de texto
           System.out.println(parrafo);    //Escribe la línea que ha leído en la línea de código anterior
        //Le indicamos que mientras parrafo no sea igual a fin, continué
       
            }while(!parrafo.equalsIgnoreCase("fin"));

O algo asi mas o menos, no?

Ya lo de meterlo en un archivo y tal... uf, difícil xD
En línea



"Nací siendo un virus" By Windows.
Este mensaje no es por ofender, yo uso Windows también, simplemente... es broma ;)
Leyer


Desconectado Desconectado

Mensajes: 786


leyer@elhacker.net


Ver Perfil WWW
Re: Ayuda con problema UDP
« Respuesta #3 en: 20 Diciembre 2011, 19:37 pm »

Archivos? en enunciado no te dice eso. deberias mejorar la forma en que lo estas haciendo :-\

Código
  1. case '1':
  2.    String parrafo=null;
  3.    BufferedReader inv = new BufferedReader(isr);  
  4. do{
  5.    System.out.println("\tIntroduzca el texto a enviar al servidor:\n");
  6.    parrafo = inv.readLine();
  7.    System.out.println("Introduzca la IP destinataria del mensaje: \n");
  8.    String ip;
  9.    ip = inv.readLine();
  10.    ejercicio53cliente cl = new ejercicio53cliente(2000);
  11.    byte data[]=parrafo.getBytes();
  12.    InetAddress destino = InetAddress.getByName(ip);
  13.    p=new DatagramPacket(data,data.length,destino,3000);
  14.    cl.socket.send(p);
  15.    cl.socket.close();
  16. }while(!parrafo.equalsIgnoreCase("fin"));break;
En línea

Superplay


Desconectado Desconectado

Mensajes: 670



Ver Perfil
Re: Ayuda con problema UDP
« Respuesta #4 en: 20 Diciembre 2011, 19:46 pm »

Archivos? en enunciado no te dice eso. deberias mejorar la forma en que lo estas haciendo :-\

Código
  1. case '1':
  2.    String parrafo=null;
  3.    BufferedReader inv = new BufferedReader(isr);  
  4. do{
  5.    System.out.println("\tIntroduzca el texto a enviar al servidor:\n");
  6.    parrafo = inv.readLine();
  7.    System.out.println("Introduzca la IP destinataria del mensaje: \n");
  8.    String ip;
  9.    ip = inv.readLine();
  10.    ejercicio53cliente cl = new ejercicio53cliente(2000);
  11.    byte data[]=parrafo.getBytes();
  12.    InetAddress destino = InetAddress.getByName(ip);
  13.    p=new DatagramPacket(data,data.length,destino,3000);
  14.    cl.socket.send(p);
  15.    cl.socket.close();
  16. }while(!parrafo.equalsIgnoreCase("fin"));break;

Uy, se parece un poco a lo que he hecho yo... estos últimos minutos:
Código:
ejercicio53cliente cl = new ejercicio53cliente(2000);
System.out.println("\tIntroduzca el texto a enviar al servidor:\n");
InputStreamReader isr = new InputStreamReader(System.in);
    BufferedReader inv = new BufferedReader(isr);
   
    String parrafo;
do{
        parrafo = inv.readLine();
    }while(!parrafo.equalsIgnoreCase("fin"));
   
    System.out.println("Introduzca la IP destinataria del mensaje: \n");
    String ip;
   
    ip = inv.readLine();
    byte data[]=parrafo.getBytes();
    InetAddress destino = InetAddress.getByName(ip);
    p=new DatagramPacket(data,data.length,destino,3000);
    cl.socket.send(p);
    cl.socket.close();

Ya sé que el enunciado no pone eso, pero el siguiente ejercicio dice así:

Citar
Diseñe una aplicación cliente que sea capaz de leer un fichero de texto y enviar
esa información a otro computador a través de UDP. 
 
Diseñe así mismo la aplicación capaz de recibir esta información y guardarla en
un fichero local. 
 
Para dar por finalizada la conexión el cliente enviará un mensaje con el texto "/.".

Por eso lo decía
En línea



"Nací siendo un virus" By Windows.
Este mensaje no es por ofender, yo uso Windows también, simplemente... es broma ;)
Superplay


Desconectado Desconectado

Mensajes: 670



Ver Perfil
Re: Ayuda con problema UDP
« Respuesta #5 en: 20 Diciembre 2011, 22:40 pm »

Nuevos problemas, he intentado el nuevo ejercicio y no me acaba de leer el archivo y no sé si se envía o no:

Código:
ejercicio54cliente cl = new ejercicio54cliente(2000);
    InputStreamReader isr = new InputStreamReader(System.in);
    BufferedReader inv = new BufferedReader(isr);
   
    System.out.println("Introduzca la IP destinataria del mensaje: \n");
    String ip;
    ip = inv.readLine();   
    String parrafo;
    System.out.println("\tSe procederá a leer el texto a enviar del archivo anonimo.txt:\n");
           String texto = new String();
           FileReader f = new FileReader("anonimo.txt");
           BufferedReader entrada = new BufferedReader(f);
 
do{
           String s;
           while((s = entrada.readLine()) != "/.") {
           texto += s;
           }
           entrada.close();
    byte data[]=texto.getBytes();
    InetAddress destino = InetAddress.getByName(ip);
    p=new DatagramPacket(data,data.length,destino,3000);
    cl.socket.send(p);
}while(!texto.equalsIgnoreCase("fin"));
cl.socket.close();

El código para recibirlo:

Código:
case '2':
    cl = new ejercicio54cliente(3000);
    isr = new InputStreamReader(System.in);
    inv = new BufferedReader(isr);
           
    FileWriter fw=new FileWriter ("anonimo.txt");
    BufferedWriter inv2 = new BufferedWriter(fw);
    PrintWriter anonimo= new PrintWriter (inv2);
    String texto2;
    do{
    p=new DatagramPacket(new byte[100],100);
    cl.socket.receive(p);
   
    texto2 = new String(p.getData());
    System.out.println(texto2);
}while(!texto2.startsWith("/."));
cl.socket.close();

break;

Alguna sugerencia?venga que con esto ya acabo :O uchas gracias por lo otro k mirando como lo hicistes ya logré acabarlo.
En línea



"Nací siendo un virus" By Windows.
Este mensaje no es por ofender, yo uso Windows también, simplemente... es broma ;)
Isótopo

Desconectado Desconectado

Mensajes: 292


Comprende a los demás para comprenderte a tí mismo


Ver Perfil
Re: Ayuda con problema UDP
« Respuesta #6 en: 20 Diciembre 2011, 23:31 pm »

Nuevos problemas, he intentado el nuevo ejercicio y no me acaba de leer el archivo y no sé si se envía o no:

Código:
ejercicio54cliente cl = new ejercicio54cliente(2000);
    InputStreamReader isr = new InputStreamReader(System.in);
    BufferedReader inv = new BufferedReader(isr);
   
    System.out.println("Introduzca la IP destinataria del mensaje: \n");
    String ip;
    ip = inv.readLine();   
    String parrafo;
    System.out.println("\tSe procederá a leer el texto a enviar del archivo anonimo.txt:\n");
           String texto = new String();
           FileReader f = new FileReader("anonimo.txt");
           BufferedReader entrada = new BufferedReader(f);
 
do{
           String s;
           while((s = entrada.readLine()) != "/.") {
           texto += s;
           }
           entrada.close();
    byte data[]=texto.getBytes();
    InetAddress destino = InetAddress.getByName(ip);
    p=new DatagramPacket(data,data.length,destino,3000);
    cl.socket.send(p);
}while(!texto.equalsIgnoreCase("fin"));
cl.socket.close();

Hasta donde he entendido, el cliente tiene que enviarle /. para indicar que es el fin del fichero y no se lo envías.

Cuando sales del  while((s = entrada.readLine()) != "/."), ya tienes todas las líneas del archivo concatenadas en la variable texto (eso suponiendo que haya una línea final /. porque sino será infinito). Esa cadena la envías y luego vuelves otra vez a repetirlo todo, ¿por qué? Deberías enviar el archivo línea a línea y cuando llegues al final enviar el /.
En línea


-Asus Crosshair IV Formula            
-AMD Phenom II X6 1090T 3.94Ghz @1.38V
-Corsair H70
-Sapphire Radeon HD 6970 2GB Dual-Fan
-G.Skill PIS PC3-17066 4GB 1900MHz 7-9-7-20 @1.65V
-WD Caviar Black 500GB
-Seagate Barracuda Green 2TB x2
-Antec TruePower New 750W Modular
-Cooler Master Dominator CM-690
Superplay


Desconectado Desconectado

Mensajes: 670



Ver Perfil
Re: Ayuda con problema UDP
« Respuesta #7 en: 21 Diciembre 2011, 10:41 am »

Te entiendo, el problema es que no se me ocurre como ¿?

Por cierto la linea de quien recibe esta bien?
En línea



"Nací siendo un virus" By Windows.
Este mensaje no es por ofender, yo uso Windows también, simplemente... es broma ;)
Isótopo

Desconectado Desconectado

Mensajes: 292


Comprende a los demás para comprenderte a tí mismo


Ver Perfil
Re: Ayuda con problema UDP
« Respuesta #8 en: 21 Diciembre 2011, 13:02 pm »

Te entiendo, el problema es que no se me ocurre como ¿?

Por cierto la linea de quien recibe esta bien?

Pues tienes que ir leyendo líneas del archivo con un bucle while y enviar cada una por separado. Cuando detectes que has llegado al fin del fichero tienes que enviar /. y listo.

El segundo el planteamiento lo veo bien, pero no te puedo ayudar mucho más porque usas clases que no he visto nunca como PrintWriter y tendría que repasar programación con sockets. De todas formas te paso un código de ejemplo de cliente/servidor en UDP para "inspirarte" un poco.


Cliente:
Código:
import java.io.*;
import java.net.*;
class UDPClient {

public static void main(String args[]) throws Exception
{
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
DatagramSocket clientSocket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName("hostname");

byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
String sentence = inFromUser.readLine();
sendData = sentence.getBytes();

DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
clientSocket.send(sendPacket);

DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);

String modifiedSentence = new String(receivePacket.getData());
System.out.println("FROM SERVER:" + modifiedSentence);
clientSocket.close();
 }
}

Servidor:
Código:
import java.io.*;
import java.net.*;
class UDPServer {

public static void main(String args[]) throws Exception
{
DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];
while(true)
{
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);

String sentence = new String(receivePacket.getData());
InetAddress IPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();

String capitalizedSentence = sentence.toUpperCase();
sendData = capitalizedSentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
serverSocket.send(sendPacket);
  }
 }
}

El cliente envia una línea que introduce el usuario y espera recibirla por parte del servidor en mayúsculas. No tiene mucho que ver con tu ejercicio porque no intervienen ficheros, pero quizás te sirva de ayuda. Un saludo.
En línea


-Asus Crosshair IV Formula            
-AMD Phenom II X6 1090T 3.94Ghz @1.38V
-Corsair H70
-Sapphire Radeon HD 6970 2GB Dual-Fan
-G.Skill PIS PC3-17066 4GB 1900MHz 7-9-7-20 @1.65V
-WD Caviar Black 500GB
-Seagate Barracuda Green 2TB x2
-Antec TruePower New 750W Modular
-Cooler Master Dominator CM-690
Superplay


Desconectado Desconectado

Mensajes: 670



Ver Perfil
Re: Ayuda con problema UDP
« Respuesta #9 en: 21 Diciembre 2011, 15:18 pm »

Por fin he logrado enviar lo del fichero.

Lo que me no hace bien es recibirlo el otro y guardarlo en un fichero, lo recibe, lo imprime por pantalla pero ni para de recibir cuando quiero (en este caso cuando reciba /. en el texto) y lo que más me interesa, no lo guarda en ningún fichero... sólo a cogido y lo ha dejado en blanco.

El código que tengo es:

Código:
    cl = new ejercicio54cliente(3000);
    isr = new InputStreamReader(System.in);
    inv = new BufferedReader(isr);
           
    FileWriter fw=new FileWriter ("anonimo.txt");
    BufferedWriter inv2 = new BufferedWriter(fw);
    PrintWriter anonimo= new PrintWriter (inv2);
    String texto2;
    do{
       
    p=new DatagramPacket(new byte[100],100);
    cl.socket.receive(p);
   
    texto2 = new String(p.getData());
    System.out.println(texto2);
    anonimo.println(texto2);
}while(!texto2.startsWith("/."));
anonimo.close();
cl.socket.close();

¿Alguna sugerencia?
« Última modificación: 21 Diciembre 2011, 16:23 pm por Superplay » En línea



"Nací siendo un virus" By Windows.
Este mensaje no es por ofender, yo uso Windows también, simplemente... es broma ;)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con un problema...
Java
Zero_1 5 4,216 Último mensaje 30 Noviembre 2007, 13:39 pm
por Zero_1
[Ayuda] Problema con un bat. « 1 2 »
Scripting
washanwer 11 6,056 Último mensaje 9 Julio 2008, 06:45 am
por washanwer
Ayuda con problema en C
Programación C/C++
Pantuflo 5 2,957 Último mensaje 11 Mayo 2010, 16:41 pm
por Ari Slash
Ayuda con problema de hashing en C
Programación C/C++
Albpenu 0 1,923 Último mensaje 27 Mayo 2021, 19:29 pm
por Albpenu
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines