Autor
|
Tema: Ayuda con problema UDP (Leído 5,156 veces)
|
Superplay
Desconectado
Mensajes: 670
|
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: 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: 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.
|
|
|
En línea
|
![](http://img54.imageshack.us/img54/3212/linux2modol0.gif) "Nací siendo un virus" By Windows. Este mensaje no es por ofender, yo uso Windows también, simplemente... es broma ![;)](https://foro.elhacker.net/Smileys/navidad/wink.gif)
|
|
|
Leyer
Desconectado
Mensajes: 786
leyer@elhacker.net
|
primero lo primero parrafo = inv.readLine(); //inv.close(); /// no puedes leer si lo estas cerrado xD System. out. println("Introduzca la IP destinataria del mensaje: \n"); ip = inv.readLine();
|
|
|
En línea
|
|
|
|
Superplay
Desconectado
Mensajes: 670
|
primero lo primero parrafo = inv.readLine(); //inv.close(); /// no puedes leer si lo estas cerrado xD System. out. println("Introduzca la IP destinataria del mensaje: \n"); 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
|
|
|
En línea
|
![](http://img54.imageshack.us/img54/3212/linux2modol0.gif) "Nací siendo un virus" By Windows. Este mensaje no es por ofender, yo uso Windows también, simplemente... es broma ![;)](https://foro.elhacker.net/Smileys/navidad/wink.gif)
|
|
|
Leyer
Desconectado
Mensajes: 786
leyer@elhacker.net
|
Archivos? en enunciado no te dice eso. deberias mejorar la forma en que lo estas haciendo ![:-\](https://foro.elhacker.net/Smileys/navidad/undecided.gif) case '1': 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"); ip = inv.readLine(); ejercicio53cliente cl = new ejercicio53cliente(2000); byte data[]=parrafo.getBytes(); cl.socket.send(p); cl.socket.close(); }while(!parrafo.equalsIgnoreCase("fin"));break;
|
|
|
En línea
|
|
|
|
Superplay
Desconectado
Mensajes: 670
|
Archivos? en enunciado no te dice eso. deberias mejorar la forma en que lo estas haciendo ![:-\](https://foro.elhacker.net/Smileys/navidad/undecided.gif) case '1': 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"); ip = inv.readLine(); ejercicio53cliente cl = new ejercicio53cliente(2000); byte data[]=parrafo.getBytes(); 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í: 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
|
![](http://img54.imageshack.us/img54/3212/linux2modol0.gif) "Nací siendo un virus" By Windows. Este mensaje no es por ofender, yo uso Windows también, simplemente... es broma ![;)](https://foro.elhacker.net/Smileys/navidad/wink.gif)
|
|
|
Superplay
Desconectado
Mensajes: 670
|
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.
|
|
|
En línea
|
![](http://img54.imageshack.us/img54/3212/linux2modol0.gif) "Nací siendo un virus" By Windows. Este mensaje no es por ofender, yo uso Windows también, simplemente... es broma ![;)](https://foro.elhacker.net/Smileys/navidad/wink.gif)
|
|
|
Isótopo
Desconectado
Mensajes: 292
Comprende a los demás para comprenderte a tí mismo
|
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 /.
|
|
|
En línea
|
![](http://www.surcouf.com/images/picto/carac/368/CPU_AMD_Phenom2.png) -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
Mensajes: 670
|
Te entiendo, el problema es que no se me ocurre como ¿?
Por cierto la linea de quien recibe esta bien?
|
|
|
En línea
|
![](http://img54.imageshack.us/img54/3212/linux2modol0.gif) "Nací siendo un virus" By Windows. Este mensaje no es por ofender, yo uso Windows también, simplemente... es broma ![;)](https://foro.elhacker.net/Smileys/navidad/wink.gif)
|
|
|
Isótopo
Desconectado
Mensajes: 292
Comprende a los demás para comprenderte a tí mismo
|
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.
|
|
|
En línea
|
![](http://www.surcouf.com/images/picto/carac/368/CPU_AMD_Phenom2.png) -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
Mensajes: 670
|
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?
|
|
« Última modificación: 21 Diciembre 2011, 16:23 pm por Superplay »
|
En línea
|
![](http://img54.imageshack.us/img54/3212/linux2modol0.gif) "Nací siendo un virus" By Windows. Este mensaje no es por ofender, yo uso Windows también, simplemente... es broma ![;)](https://foro.elhacker.net/Smileys/navidad/wink.gif)
|
|
|
|
|