Foros del Web » Programación para mayores de 30 ;) » .NET »

Duda sobre aplicación tipo Messenger

Estas en el tema de Duda sobre aplicación tipo Messenger en el foro de .NET en Foros del Web. Hola, tengo dos aplicaciones que interactuan entre si mediante sockets. Una es el servidor, y otra es el cliente. Mi duda consiste en lo siguiente: ...
  #1 (permalink)  
Antiguo 07/11/2005, 18:58
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años
Puntos: 9
Duda sobre aplicación tipo Messenger

Hola, tengo dos aplicaciones que interactuan entre si mediante sockets. Una es el servidor, y otra es el cliente. Mi duda consiste en lo siguiente: para hacer una aplicación al estilo Messenger, se necesita que la aplicación sea servidor-cliente, al mismo tiempo? o las aplicaciones tipo messenger consisten en un servidor único que es adonde se conectan todos los clientes?. Tienen algún ejemplo con .Net?.

Busqué por la red, pero lo único que consigo son aplicaciones Servidor - Cliente separadas. Es decir, puedo interactuar con el servidor, pero no entre clientes.
Gracias por su ayuda.
Saludos!
__________________
Add, never Remove
  #2 (permalink)  
Antiguo 07/11/2005, 21:37
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Hola mariano_donati

Mira, yo también estoy creando una aplicación tipo Messenger. Por el momento me va bien, aun que estoy teniendo un problemilla parecido al que tu tenías con "Sucesos de subprocesos".

Yo tengo un servidor, los clientes y una BD en SQL Server.

El cliente se autentifica en el SQL y una vez autentifica:
- Modifica su registro en la BD para decir que esta en linea
- Recupera los contactos conectados y desconectados del SQLServer
- Se conecta al Servidor y deja la conexión conectada al server.

- Al conectarse el cliente al servidor, el servidor almacena el socket de ese cliente en una tabla hash. Donde estarán todos los clientes conectados, la Key de la tabla hash es el Id del cliente.

Cuando va a mandar un mensaje, se lo mando al servidor en formato XML, especificando el Id del Receptor, el mensaje, el nick, etc...

El servidor recibe los datos del cliente, los parsea y según a que cliente vaya destinado se los reenvia empleando la conexión que ha usado el recepetor para la conexión inicial al servidor.

Espero haberme explicado más o menos. Si tienes más dudas, ya sabes.

Saludos.
__________________
Charlie.
  #3 (permalink)  
Antiguo 08/11/2005, 11:45
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años
Puntos: 9
Si chcma, te explicaste muy bien. El tema es el siguiente, si o si se necesita de un servidor no? osea que yo iba mal encaminado, me estaba matando la cabeza tratando de hacer un aplicación que sea cliente y a la vez servidor. Ahora, el servidor que mencionas en este caso, estaría alojado en la red o sería una aplicación de escritorio?.
Muy amable en tu explicación chcma, muchas gracias.
Saludos.
__________________
Add, never Remove
  #4 (permalink)  
Antiguo 08/11/2005, 19:00
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Sería una aplicación de escritorio (Como tengo yo), en la que al recibir algo lo enviaría al destinatario.

También lo puedes hacer con un Web Service, como hice yo desde un principio, pero tarda sobre 2 o 3 segundos en enviarlo al cliente.

Saludos.
__________________
Charlie.
  #5 (permalink)  
Antiguo 08/11/2005, 19:01
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Sería una aplicación de escritorio (Como tengo yo), en la que al recibir algo lo enviaría al destinatario.

También lo puedes hacer con un Web Service, como hice yo desde un principio, pero tarda sobre 2 o 3 segundos en enviarlo al cliente.

Saludos.
__________________
Charlie.
  #6 (permalink)  
Antiguo 08/11/2005, 20:50
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años
Puntos: 9
Si, lo del Web Service lo había pensado, pero rápidamente descarté la idea por el tema de los costos. Esta es una aplicación de prueba y aprendizaje más que nada.
La única duda que me queda de la muy buena explicación que me diste chcma es como los clientes saben quien está conectado en el servidor. Supongo que puede ser algo así:

Cuando un nuevo cliente se conecta al servidor, actualiza la base de datos de este poniendo (como suposicion) el valor 1 en el campo respectivo. Y 0 cuando este se desconecta. Entonces, en los clientes se haría una selección de todos los usuarios que tengan marcado el campo "Conectados" con el valor 1.
Mi duda ahora viene en lo siguiente, si es que se hace de esa forma. ¿Como hago para que la aplicación cliente se conecte a la base de datos que tengo en el servidor?.
Te dejo un saludo chcma. Y nuevamente muchas gracias.
__________________
Add, never Remove
  #7 (permalink)  
Antiguo 09/11/2005, 21:07
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
En un principio la aplicación cliente se conectaría directamente a la BD, recogería los usuarios y mostraría en la lista los usuarios conectados y desconectados.

Despues, cuando un usuario se conecta a la BD, también se conectaría al servidor, en ese momento el servidor debería hacer una selección en la BD para mirar que usuarios le tienen agregado y mandarles un mensaje de que ese usuario se acaba de conectar.

<idUsuario>2356</idUsuario><estado>conectado</estado>
__________________
Charlie.
  #8 (permalink)  
Antiguo 10/11/2005, 12:37
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años
Puntos: 9
Perfecto, muchas gracias chcma. Una última duda, estoy intentando conectarme a mi servidor Sql con esta cadena:

"User ID=MyUser;Password=MyPass;Initial Catalog=ChattingHomeBase;Data Source=127.0.0.1,1433;Network Library =dbmssocn;Integrated Security=false;"

Pero me dice que el servidor Sql Server no existe o no se ha permitido el acceso. Vos como logras conectarte de manera remota con Sql Server?
Un saludo y nuevamente muchas gracias.
__________________
Add, never Remove
  #9 (permalink)  
Antiguo 10/11/2005, 17:46
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Mmm, creo que está bien la cadena de conexión. DataSource=127.0.0.1 y con eso debería funcionarte.

Yo para conectarme remotamente al serivdor SQL Server he tenido que abrir el puerto 1433 en mi router, y una vez hecho eso, me conectaba perfectamente.

No obstante, poniendo DataSource=local debería funcionarte sin problemas.
__________________
Charlie.
  #10 (permalink)  
Antiguo 11/11/2005, 02:14
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Cita:
Perfecto, muchas gracias chcma. Una última duda, estoy intentando conectarme a mi servidor Sql con esta cadena:

"User ID=MyUser;Password=MyPass;Initial Catalog=ChattingHomeBase;Data Source=127.0.0.1,1433;Network Library =dbmssocn;Integrated Security=false;"

Pero me dice que el servidor Sql Server no existe o no se ha permitido el acceso. Vos como logras conectarte de manera remota con Sql Server?
Un saludo y nuevamente muchas gracias.
Si es remotamente jamás podrá ser 127.0.0.1, eso es localhost. Deberías poner la IP de tu server.
  #11 (permalink)  
Antiguo 11/11/2005, 02:31
 
Fecha de Ingreso: enero-2005
Ubicación: Benifaió (Valencia)
Mensajes: 319
Antigüedad: 19 años, 3 meses
Puntos: 0
Yo termino de crear uno parecedio, pero este mira las respuestas cada 5 minutos, y no mira el estado de los usurios, simplemente manda el mensaje y lo guarda en la BD, ya se encargara el usuario destinatario de leer el mensaje cuando se conecte.

(Solamente es una idea :p)
  #12 (permalink)  
Antiguo 11/11/2005, 06:34
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Pero eso ye un poco chapuza, ¿No crees fredy666?, va lento y demás . . . . lo interesante es que sea automático y real.
__________________
Charlie.
  #13 (permalink)  
Antiguo 11/11/2005, 06:37
 
Fecha de Ingreso: enero-2005
Ubicación: Benifaió (Valencia)
Mensajes: 319
Antigüedad: 19 años, 3 meses
Puntos: 0
Yo no lo veo chapuza, todo lo contrario, asi guardo un registro, y siempre me cercioro de que el usuario a recibido el mensaje, aun cuando no esta, lo recibira despues. De la otra forma, no se le puede mandar nada, y en mi caso eso no puede pasar xD
  #14 (permalink)  
Antiguo 11/11/2005, 06:40
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Lo que pasa freddy, es que el tuyo es más bien un especie de servidor de correo no de mesenger instantaneo, en mi opinion no es chapuza, si no que es otra idea.

Un saludo
  #15 (permalink)  
Antiguo 11/11/2005, 09:25
 
Fecha de Ingreso: enero-2005
Ubicación: Benifaió (Valencia)
Mensajes: 319
Antigüedad: 19 años, 3 meses
Puntos: 0
Sip, otra idea xD, gracias.
  #16 (permalink)  
Antiguo 11/11/2005, 10:22
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años
Puntos: 9
Cita:
Iniciado por Jose_minglein2
Si es remotamente jamás podrá ser 127.0.0.1, eso es localhost. Deberías poner la IP de tu server.
Claro, lo que pasa es que estoy haciendo las pruebas en local, por eso pongo esa IP. ¿Crees que tal vez ese sea el problema?

chcma, vos envias el archivo xml mediante el Stream? es decir, lo mandas como si fuera un mensaje común, luego cuando te llega al servidor lo guardas en un archivo xml y después le extraes la información relevante?.

Disculpa por tantas preguntas.

Saludos!
__________________
Add, never Remove
  #17 (permalink)  
Antiguo 11/11/2005, 10:44
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
127.0.0.1 debe ser (si estamos hablando de los clientes) la dirección del servidor y si estamos hablando del servidor estaría bien así.
  #18 (permalink)  
Antiguo 11/11/2005, 14:18
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
El XML no lo guardo en ningún XML, lo mando directamente al servidor y depsues lo parseo con LoadXML(mesajeRecibido)

Donde mensajeRecibido podría ser algo como:
<mensaje idemisor="1" idreceptor="23" nick="unNick">aqui enviamos el mensaje </mensaje>

Yo ya lo tengo más o menos implementado, el único problema que tengo es al intentar abrir un formulario, que no se por que se me queda colgado. Pero bueno, en cuanto lo mire un poco ya pondré un posteo, haber si alguien me puede hechar un cable.

Saludos, y espero haberte aclarado la duda del XML mario.
__________________
Charlie.
  #19 (permalink)  
Antiguo 11/11/2005, 15:44
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años
Puntos: 9
Gracias por la explicación chcma. En el servidor tenés un archivo en donde se te van agregando cada una de las lineas del tipo <mensaje idemisor....>...</mensaje> que te van llegando no? o lo haces directamente sin guardarlo en un archivo?. Agradezco mucho la paciencia que me estás teniendo chcma.

El formulario lo estás intentando abrir cuando se produce un evento en un subproceso que no sea el principal?, porque a mi me paso algo similar. Cuando llega un mensaje al servidor, le hacia abrir un formulario para mantener directamente la conversacion con el cliente a través de ese formulario. Pero como ese evento se produce en otro subproceso, entonces el proceso principal no puede abrir el formulario y se te cuelga la aplicación. Yo lo solucioné utilizando un delegado. Si ese es tu caso, entonces avisame así te muestro como lo solucioné y te puedo devolver al menos algo de lo que me has ayudado vos.
Un saludo!
__________________
Add, never Remove
  #20 (permalink)  
Antiguo 11/11/2005, 23:38
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
No sé bien por que se me cuelga la aplicación, estudiaré un poco más mi caso y si no, pediré ayuda.

Sobre tu pregunta, no guardo nada en ningún archivo, creo una variable con el XML y la envio directamente al servidor. Este, parsea la variable y la distribuye según su contenido.

Espero haberte ayudado, saludos cordiales.
__________________
Charlie.
  #21 (permalink)  
Antiguo 14/11/2005, 03:06
 
Fecha de Ingreso: enero-2005
Ubicación: Benifaió (Valencia)
Mensajes: 319
Antigüedad: 19 años, 3 meses
Puntos: 0
Puede que se te cuelgue por tema del winsock, cuado hice la aplicación de fin de curso, creaba sockets para verificar si habia email nuevos, y cosas por el estilo, y llegaba un punto en que se colgaba. Al final lo solucione utilizando el mismo socket, y cerrandolo siempre. Supongo que no sera tu caso, pero bueno, igual puede ayudar xD.
  #22 (permalink)  
Antiguo 14/11/2005, 17:45
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Bueno, ahora mismo no tengo mi equipo aqui, asi que no tengo la oportunidad de revisar el código para ser más directo.

Pero más o menos te explico, en la aplicación cliente, tengo un formulario principal, que es donde se están mostrando los contactos conectados.

En este formulario existe una referencia a una clase "Conexion" donde hay un método llamado Escuchar, el cual lo ejecuto en el formulario con una Hebra.

Cuando ese método recibe un mensaje, este método ejecuta un evento que está controlado en el formulario principal, el cual ejecuta un Método denominado "DatosRecibidos", el cual parsea el ID del cliente que mandó el mensaje, comprobamos que el formulario de chat "frmChat" no tenga ninguna instancia con ese Id de Cliente y le digo que me cree una nueva instancia de ese formulario y me lo muestre.

Al hacer el frmChat.show() se queda colgado.

Si asi a primera vista alguien sabe por que puede ser . .. le estaré muy agradecido que me comente algo.

Gracias.
__________________
Charlie.
  #23 (permalink)  
Antiguo 14/11/2005, 21:16
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años
Puntos: 9
Si, te está pasando lo mismo que me paso a mi, aunque tu lógica sea distinta a la que utilizo yo. El problema es que el evento se origina en un subproceso que no es el principal, y el proceso principal es el único que puede abrir un nuevo formulario, por eso se queda colgado. Yo lo solucioné con un delegado. Te paso el código:

El primer procedimiento ClientApp_MessageReceived es el que maneja el evento que se produce en el subproceso cuando se recibe un nuevo mensaje. Como desde este evento no podés abrir el formulario, entonces lo único que haces es crear una instancia del delegado que defino posteriormente y hacer que el formulario invoque a este delegado para que ejecute el método que le pasas como parametro de AddressOf.
El método ShowForm es en realidad el que se encarga de hacer toda la tarea. Este es el método hacia el que apunta el delegado y el cual te muestra el formulario.


PrivateSub ClientApp_MessageReceived(ByVal Data AsString, ByVal IpFrom AsString, ByVal ClientNickname AsString) Handles ClientApp.MessageReceived

Dim MyDelegate AsNew ShowFormDelegate(AddressOf ShowForm)

Me.Invoke(MyDelegate, NewObject() {Data, IpFrom, ClientNickname, ClientApp})

EndSub

DelegateSub ShowFormDelegate(ByVal Data AsString, ByVal IpFrom AsString, ByVal ClientNickname AsString, ByVal C As Client)

PrivateSub ShowForm(ByVal Data AsString, ByVal IpFrom AsString, ByVal ClientNickname AsString, ByVal C As Client)

IfNot CurrentChattingForms.ContainsKey(IpFrom) Then

Dim frmChat AsNew frmChat()

AddHandler frmChat.ClosingForm, AddressOf frmChat_ClosingForm

frmChat.Text = ClientNickname

frmChat.Show()

frmChat.ClientApp = C

frmChat.IpFrom = IpFrom

frmChat.Message = Data

CurrentChattingForms.Add(IpFrom, frmChat)

Else

Dim CurrentForm As frmChat = CurrentChattingForms(IpFrom)

CurrentForm.Message = Data

EndIf

EndSub


Espero que te sirva de algo para ir pagandote parte de la cuota que te debo por haberme ayudado con lo mio.

Saludos!.
__________________
Add, never Remove
  #24 (permalink)  
Antiguo 15/11/2005, 04:57
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
jejejeje, muchas gracias mariano, estoy deseando tener el Lunes mi ordenador para hacer las pruebas, me muero de ganas de probarlo.

Saludos.
__________________
Charlie.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:52.