Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Superplay en 20 Diciembre 2011, 17:28 pm



Título: Ayuda con problema UDP
Publicado por: Superplay 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.


Título: Re: Ayuda con problema UDP
Publicado por: Leyer 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();


Título: Re: Ayuda con problema UDP
Publicado por: Superplay 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


Título: Re: Ayuda con problema UDP
Publicado por: Leyer 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;


Título: Re: Ayuda con problema UDP
Publicado por: Superplay 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


Título: Re: Ayuda con problema UDP
Publicado por: Superplay 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.


Título: Re: Ayuda con problema UDP
Publicado por: Isótopo 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 /.


Título: Re: Ayuda con problema UDP
Publicado por: Superplay 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?


Título: Re: Ayuda con problema UDP
Publicado por: Isótopo 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.


Título: Re: Ayuda con problema UDP
Publicado por: Superplay 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?