Ayuda con problema UDP

Iniciado por Superplay, 20 Diciembre 2011, 17:28 PM

0 Miembros y 1 Visitante están viendo este tema.

Superplay

Buenas, he realizado el siguiente 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:

CitarDiseñ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:

    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:

            //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.


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

Leyer

primero lo primero

Código (java) [Seleccionar]
String parrafo;
 
       parrafo = inv.readLine();
     
   //inv.close(); /// no puedes leer si lo estas cerrado xD
   System.out.println("Introduzca la IP destinataria del mensaje: \n");
   String ip;
   ip = inv.readLine();

Superplay

Cita de: Leyer en 20 Diciembre 2011, 17:34 PM
primero lo primero

Código (java) [Seleccionar]
String parrafo;
 
       parrafo = inv.readLine();
     
   //inv.close(); /// no puedes leer si lo estas cerrado xD
   System.out.println("Introduzca la IP destinataria del mensaje: \n");
   String ip;
   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:             //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


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

Leyer

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

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

Superplay

Cita de: 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 (java) [Seleccionar]
case '1':
    String parrafo=null;
    InputStreamReader isr = new InputStreamReader(System.in);
    BufferedReader inv = new BufferedReader(isr); 
do{
    System.out.println("\tIntroduzca el texto a enviar al servidor:\n");
    parrafo = inv.readLine();
    System.out.println("Introduzca la IP destinataria del mensaje: \n");
    String ip;
    ip = inv.readLine();
    ejercicio53cliente cl = new ejercicio53cliente(2000);
    byte data[]=parrafo.getBytes();
    InetAddress destino = InetAddress.getByName(ip);
    p=new DatagramPacket(data,data.length,destino,3000);
    cl.socket.send(p);
    cl.socket.close();
}while(!parrafo.equalsIgnoreCase("fin"));break;


Uy, se parece un poco a lo que he hecho yo... estos últimos minutos:
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í:

CitarDiseñ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


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

Superplay

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

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:

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.


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

Isótopo

Cita de: 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:

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 /.

-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

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

Por cierto la linea de quien recibe esta bien?


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

Isótopo

Cita de: 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?

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:

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:

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.

-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

#9
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:

    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?


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