Ayuda con Cliente-servidor!!

Iniciado por Allan_M, 5 Diciembre 2007, 20:27 PM

0 Miembros y 2 Visitantes están viendo este tema.

Allan_M

Hola. la tarea es la siguiente:

Objetivo de la tarea: La tarea se trata de hacer un servicio de directorio de teléfono en la Internet. El servicio es implementado por un servidor que tiene como tarea por un lado, registrar los datos de las personas y por otro, entregar los datos de alguna persona si los tiene. Por su lado los clientes pueden hacer dos cosas: 1) registrar su nombre y  teléfono con el servidor, o 2) preguntar al servidor por el teléfono de una persona  dado su nombre.

El servidor: El servidor, que puede estar corriendo en cualquier computador estará escuchando en el port 8888 requerimientos de personas que quieran usar el servicio, ya sea para registrarse o para pedir datos. Esto lo hace creando un socket servidor amarrado al por 8888 con la instrucción ServerSocket ssocket = new ServerSocket(8888); y poniéndolo a escuchar dentro de un ciclo infinito (while(true)) con la instrucción Socket so = ssocket.accept();  Cuando se conecta un cliente, se abre un BufferedReader y se lee el mensaje (una sola línea). Si la línea comienza con las letras REG (mayúsculas) se trata de una petición de registro de nombre y número. En ese caso el resto de la línea viene como sigue: luego de REG vendrá un espacio y a continuación el teléfono de la persona, luego otro espacio y el nombre completo hasta el final de la línea. Ejemplos:

REG 2285108 Juan Perez Jimenez
REG 8796788 Ana Maria Castillo Ramirez
REG 7435263 Marianela Recabarren Martinez

El servidor debe reaccionar a esto registrando los datos en las estructuras que usted estime adecuadas.
Si las primeras 3 letras PET (mayúsculas) se trata de una petición por número de teléfono. En ese caso, luego de las 3 letras vendrá un espacio y el resto es el nombre completo o parte del nombre de la persona de la cual se quiere el teléfono. Ejemplos:

PET Juan Perez
PET Maria

En este caso, el servidor responderá al cliente (escribiendo líneas en un PrintWriter abierto desde el socket) con todos los nombres y números telefónicos de las personas que tengan dentro de su nombre el string enviado. Para el primer ejemplo, si se han registrado sólo las trés personas del ejemplo anterior,  se debe mandar sólo una línea con el nombre completo y el teléfono de Juan Perez Jiménez. Para el segundo ejemplo, se deben mandar dos líneas, una con el nombre completo y teléfono de Ana María y otra con los datos de Marianela. Para avisarle al cliente que ya no vienen más líneas se envía una última línea que solo contiene un punto "." al comienzo de ella.

El cliente: Debe escribir un cliente que permita registrar personas en el servidor o preguntar por ellas. Para ello debe recibir los comandos del usuario desde un objeto Console, conectarse con el servidor y recibir la respuesta en caso que sea necesario. Un posible ejemplo del diálogo entre el usuario y el programa cliente es el siguiente:

Que accion desea realizar (1- registrar, 2- consultar, 0-salir) : 1
Nombre : Juan Perez Jiménez
Numbero: 2285108
Que accion desea realizar (1- registrar, 2- consultar, 0-salir) : 1
Nombre : Ana Maria Castillo Ramirez
Numbero: 8796788
Que accion desea realizar (1- registrar, 2- consultar, 0-salir) : 1
Nombre : Marianela Recabarren Martinez
Numbero: 7435263
Que accion desea realizar (1- registrar, 2- consultar, 0-salir) : 2
Nombre : Ricardo
No hay resultados
Que accion desea realizar (1- registrar, 2- consultar, 0-salir) : 2
Nombre : Maria
8796788 Ana Maria Castillo Ramirez
7435263 Marianela Recabarren Martinez
Que accion desea realizar (1- registrar, 2- consultar, 0-salir) : 0



TENGO TODA LA conexión, HECHA, CLIENTE-SERVIDOR, SOLO ME FALTA "El servidor debe reaccionar a esto registrando los datos en las estructuras que usted estime adecuadas. "

ALGUIEN PODRIA AYUDARME CON UN CODIGO?.. YA SEA CON LISTAS ENLAZADAS O CON ARRAYS, Y DONDE DEBO PONERLO?


agradeceria sus respuestas

Casidiablo

Si de verdad quieres ayuda lo más lógico sería que pusieras lo que llevas, de lo contrario pareciera que quieres que te hagan la tarea.

Un saludo!

Allan_M

ok como puedo poner el codigo que llevo?...
soy nuevo y no cacho naa... jaja, obviamente debo poner el codigo, pero si me dicen como subirlo seria mejor

Allan_M

#3
Este es el servidor:


Código (java) [Seleccionar]

import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ServidorMaffet extends Thread {
ServerSocket ss;

public ServidorMaffet() throws IOException {
ss = new ServerSocket(8888);
}


public static void main(String[] args)throws IOException {
new ServidorMaffet().start();

}

public void run(){
while(true){
try{

System.out.println("Servidor Esperando para Conexión...");
       Socket s = ss.accept();
       BufferedReader is = new BufferedReader(new InputStreamReader(s.getInputStream()));
       PrintWriter pout = new PrintWriter(s.getOutputStream(), true);
       
}catch(Exception e){
System.err.println("ServidorMaffet.run Exception: "+ e.toString());
}

}
}

}





ESTE ES EL CLIENTE:
Código (java) [Seleccionar]

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Cliente {

/**
* @param args
*/
public static void main(String[] args) {

Socket cliSocket = null;
   PrintWriter out = null;
BufferedReader  in= new BufferedReader(new InputStreamReader(System.in));
String tecla = "";
String linea = "";

try{

cliSocket = new Socket("rsaldiva1", 8888);
System.out.println("Conexión al servidor por puerto:" + cliSocket.getLocalPort());




while (true) {
System.out.println("Que acción desea realizar (1- registrar, 2- consultar, 0-salir)");
tecla = in.readLine().toString();
if (tecla.equals("1")){
System.out.println("Invocación a Registrar:\n");
linea = in.readLine().toString();
System.out.println("Linea: " + linea.toString());


}
if (tecla.equals("2")){
System.out.println("Invocación a Consultar:");
}

if (tecla.equals("0")){
System.out.println("Invocación a Salir:");
break;
}
}

}catch(Exception e){
System.out.println("Cliente Exception" + e.toString());

}



}

}




me falta registrar los datos en el server,  no cacho como ponerlo ni donde...

ayuda por favor

Ragnarok

A Casidiablo se le ha olvidado decirte que te leas las normas, léelas sin falta.
No olvidéis leer las normas generales, además de las específicas de cada tablón.sgae, ladrones

Allan_M

Hola a todos, soy nuevo aqui, me gustaría que me ayudaran con una duda que tengo...

El problema es el siguiente...

Objetivo de la tarea: La tarea se trata de hacer un servicio de directorio de teléfono en la Internet. El servicio es implementado por un servidor que tiene como tarea por un lado, registrar los datos de las personas y por otro, entregar los datos de alguna persona si los tiene. Por su lado los clientes pueden hacer dos cosas: 1) registrar su nombre y  teléfono con el servidor, o 2) preguntar al servidor por el teléfono de una persona  dado su nombre.

El servidor: El servidor, que puede estar corriendo en cualquier computador estará escuchando en el port 8888 requerimientos de personas que quieran usar el servicio, ya sea para registrarse o para pedir datos. Esto lo hace creando un socket servidor amarrado al por 8888 con la instrucción ServerSocket ssocket = new ServerSocket(8888); y poniéndolo a escuchar dentro de un ciclo infinito (while(true)) con la instrucción Socket so = ssocket.accept();  Cuando se conecta un cliente, se abre un BufferedReader y se lee el mensaje (una sola línea). Si la línea comienza con las letras REG (mayúsculas) se trata de una petición de registro de nombre y número. En ese caso el resto de la línea viene como sigue: luego de REG vendrá un espacio y a continuación el teléfono de la persona, luego otro espacio y el nombre completo hasta el final de la línea. Ejemplos:

REG 2285108 Juan Perez Jimenez
REG 8796788 Ana Maria Castillo Ramirez
REG 7435263 Marianela Recabarren Martinez

El servidor debe reaccionar a esto registrando los datos en las estructuras que usted estime adecuadas.
Si las primeras 3 letras PET (mayúsculas) se trata de una petición por número de teléfono. En ese caso, luego de las 3 letras vendrá un espacio y el resto es el nombre completo o parte del nombre de la persona de la cual se quiere el teléfono. Ejemplos:

PET Juan Perez
PET Maria

En este caso, el servidor responderá al cliente (escribiendo líneas en un PrintWriter abierto desde el socket) con todos los nombres y números telefónicos de las personas que tengan dentro de su nombre el string enviado. Para el primer ejemplo, si se han registrado sólo las trés personas del ejemplo anterior,  se debe mandar sólo una línea con el nombre completo y el teléfono de Juan Perez Jiménez. Para el segundo ejemplo, se deben mandar dos líneas, una con el nombre completo y teléfono de Ana María y otra con los datos de Marianela. Para avisarle al cliente que ya no vienen más líneas se envía una última línea que solo contiene un punto "." al comienzo de ella.

El cliente: Debe escribir un cliente que permita registrar personas en el servidor o preguntar por ellas. Para ello debe recibir los comandos del usuario desde un objeto Console, conectarse con el servidor y recibir la respuesta en caso que sea necesario. Un posible ejemplo del diálogo entre el usuario y el programa cliente es el siguiente:

Que accion desea realizar (1- registrar, 2- consultar, 0-salir) : 1
Nombre : Juan Perez Jiménez
Numbero: 2285108
Que accion desea realizar (1- registrar, 2- consultar, 0-salir) : 1
Nombre : Ana Maria Castillo Ramirez
Numbero: 8796788
Que accion desea realizar (1- registrar, 2- consultar, 0-salir) : 1
Nombre : Marianela Recabarren Martinez
Numbero: 7435263
Que accion desea realizar (1- registrar, 2- consultar, 0-salir) : 2
Nombre : Ricardo
No hay resultados
Que accion desea realizar (1- registrar, 2- consultar, 0-salir) : 2
Nombre : Maria
8796788 Ana Maria Castillo Ramirez
7435263 Marianela Recabarren Martinez
Que accion desea realizar (1- registrar, 2- consultar, 0-salir) : 0



lo que llevo hasta ahora es el Servidor:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ServidorMaffet extends Thread {
ServerSocket ss;

public ServidorMaffet() throws IOException {
ss = new ServerSocket(8888);
}


public static void main(String[] args)throws IOException {
new ServidorMaffet().start();

}

public void run(){
while(true){
try{

System.out.println("Servidor Esperando para Conexión...");
        Socket s = ss.accept();
        BufferedReader is = new BufferedReader(new InputStreamReader(s.getInputStream()));
        PrintWriter pout = new PrintWriter(s.getOutputStream(), true);
       
}catch(Exception e){
System.err.println("ServidorMaffet.run Exception: "+ e.toString());
}

}
}

}



y el Cliente :
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Cliente {

/**
* @param args
*/
public static void main(String[] args) {

Socket cliSocket = null;
    PrintWriter out = null;
BufferedReader  in= new BufferedReader(new InputStreamReader(System.in));
String tecla = "";
String linea = "";

try{

cliSocket = new Socket("rsaldiva1", 8888);
System.out.println("Conexión al servidor por puerto:" + cliSocket.getLocalPort());




while (true) {
System.out.println("Que acción desea realizar (1- registrar, 2- consultar, 0-salir)");
tecla = in.readLine().toString();
if (tecla.equals("1")){
System.out.println("Invocación a Registrar:\n");
linea = in.readLine().toString();
System.out.println("Linea: " + linea.toString());


}
if (tecla.equals("2")){
System.out.println("Invocación a Consultar:");
}

if (tecla.equals("0")){
System.out.println("Invocación a Salir:");
break;
}
}

}catch(Exception e){
System.out.println("Cliente Exception" + e.toString());

}



}

}



Mi problema es que me falta usar alguna estructura que me permita guardar los datos, por favor, si alguien cacha como hacerlo que me ayude, porque no cacho donde ponerlo... se me ocurrio hacer una lista enlazada, pero no se como ocuparla dentro del socket del servidor, para que atienda las peticiones del Cliente.

Aqui va lo que hice...

Class Nodo
{
String nombre;
Int numero;
Nodo sig;

Nodo(String x, int y, Nodo 2){
Nombre=x
Edad=y
Sig=2;
}
}






Class Lista{
Nodo primero;

Lista(){
Primero=null;
}

Public void agregar(String x, int y){
Primero=new Nodo(x,y,primero);
If(primero==null){
Primero=new Nodo(x,y,null);
}
Else{
Nodo aux=primero;
While(aux.sig!=null){
Aux=aux.sig;
Aux.sig=new Nodo(x,y,null);
}
}
}

Public int buscar(String x){
Nodo aux=primero;
While(x.equals(aux.Nombre))
Return aux.numero ;
Aux=aux.sig ;
}
Return -1 // si no se encuentra.
}

}




AYUDA POR FAVOR, creo que es lo unico que me falta pa terminar la tarea..
agradezco su atencion y sus respuestas...

Allan..

Ragnarok

#6
Esta no es forma de preguntar, tu pregunta es cómo trasferir información del cliente al servidor y/o viceversa, no hace falta que nos cuentes todo eso y que nos hagas perder el tiempo leyendo cosas que no nos interesan.

Usa xml, puedes transferirlo cómodamente por el socket al ser texto y puedes generarlo y parsearlo usando xmlbeans.

Si quieres algo más sencillo usa simples strings.

Otra opción es usar objetos serializables: http://java.sun.com/javase/6/docs/api/index.html?java/io/Serializable.html Ya se ha hablado de ellos anteriormente en el foro.

PD: y ya si te quieres complicar más puedes mirarte SOAP. Ordenando por dificultad del más fácil al más difícil (o que te va a llevar más tiempo leer) yo diría que es: Strings, objetos serializables, XML, SOAP.
No olvidéis leer las normas generales, además de las específicas de cada tablón.sgae, ladrones

Allan_M

Cita de: Ragnarok en  6 Diciembre 2007, 17:07 PM
Esta no es forma de preguntar, tu pregunta es cómo trasferir información del cliente al servidor y/o viceversa, no hace falta que nos cuentes todo eso y que nos hagas perder el tiempo leyendo cosas que no nos interesan.

Usa xml, puedes transferirlo cómodamente por el socket al ser texto y puedes generarlo y parsearlo usando xmlbeans.

Si quieres algo más sencillo usa simples strings.

Otra opción es usar objetos serializables: http://java.sun.com/javase/6/docs/api/index.html?java/io/Serializable.html Ya se ha hablado de ellos anteriormente en el foro.

PD: y ya si te quieres complicar más puedes mirarte SOAP. Ordenando por dificultad del más fácil al más difícil (o que te va a llevar más tiempo leer) yo diría que es: Strings, objetos serializables, XML, SOAP.



y como ocupo los xml?. me puedes ayudar con codigo por favor?

gracias

Ragnarok

Lo primero es aprender xml, lo siguiente xml-schema o xsd y luego xml-beans, de apache. Cuando hayas aprendido esas cosas verás que no necesitas preguntar eso y que no tiene sentido preguntarlo en un foro puesto que la respuesta o es demasiado larga o no sirve de nada.
No olvidéis leer las normas generales, además de las específicas de cada tablón.sgae, ladrones

NightZpy

No es muy dificil un archivo xml que se genere y se pase serializado en un stream y listo!

salu2s...

blackhacking.no-ip.org "Con Server para prácticas" - "La incompetencia en masas es inversamente proporcional al sistema social"