Título: Encontrar salas de chat con C# Publicado por: TickTack en 4 Julio 2017, 16:04 pm Hola,
tengo una pregunta: como hacen los programas de cliente de chat para tener una lista de salas de chat? Escuchan un puerto y juntan las salas que estan abiertas a partir de ese puerto? O las salas notifican a una pagina web que esta abierta y esta pagina web pasa la informacion al cliente? Hice un servidor de chat pero quiero que el cliente reciba esa sala en una lista Listview. Cómo puedo hacerlo? Gracias y saludos Título: Re: Encontrar salas de cat con C# Publicado por: ivancea96 en 4 Julio 2017, 19:22 pm En algún lugar se guarda la información de la sala. Si es en el servidor, pues el servidor tiene una lsita de salas. Si las salas las hostea un usuario, usualmente le comunicará al servidor la existencia de esa sala (salvo que al sala sea solo accesible por IP, por ejemplo). Si se lo comunica al servidor, nuevamente, el servidor tiene una lista. Puede no tener lista, hay muchas formas de hacerlo. Hazlo como mejor te venga :o
Título: Re: Encontrar salas de cat con C# Publicado por: TickTack en 4 Julio 2017, 19:43 pm Hola ivancea96,
Citar Si es en el servidor, pues el servidor tiene una lsita de salas. Como podria saber el cliente entonces, en tal caso, que sala esta abierta? Citar Si las salas las hostea un usuario, usualmente le comunicará al servidor la existencia de esa sala Como podria saber el cliente entonces, en tal caso, que sala esta abierta? Gracias y saludos Título: Re: Encontrar salas de cat con C# Publicado por: ivancea96 en 4 Julio 2017, 19:59 pm El cliente obtiene la información del servidor. Si el servidor conoce las salas, el cleinte puede hacer una petición de esas salas, y el servidor, responderle con los datos que sean.
Título: Re: Encontrar salas de cat con C# Publicado por: TickTack en 4 Julio 2017, 21:57 pm El cliente obtiene la información del servidor. Si el servidor conoce las salas, el cleinte puede hacer una petición de esas salas, y el servidor, responderle con los datos que sean. Vale. Pero para empezar el cliente tiene que hacerle una peticion a una sala para que la sala le informe de las salas disponibles(como dijiste tu). Pero a que sala se conectara el cliente para que se informe, si todavia no sabe que salas estan disponibles y de este modo no se puede conectar? Gracias y saludos Título: Re: Encontrar salas de cat con C# Publicado por: ivancea96 en 4 Julio 2017, 22:37 pm Cómo que una sala le informa de salas disponibles.
Es el servidor quien le informa. El cliente debe saber en todo momento la dirección del servidor (o pedirsela al usuario, por ejemplo, como ocurre en IRC) Título: Re: Encontrar salas de cat con C# Publicado por: TickTack en 5 Julio 2017, 09:26 am Hola ivancea96,
tu te refieres a una sala que no se dedica al servicio chat sino exclusivamente al servicio de informe de salas, osea que salas estan abiertas? Gracias y saludos Título: Re: Encontrar salas de chat con C# Publicado por: ivancea96 en 5 Julio 2017, 10:49 am Pero qué sala. Yo hablo de un servidor. Un servidor qe se dedica a guardar salas, conectar usuarios, y todo lo que quieras.
Título: Re: Encontrar salas de chat con C# Publicado por: TickTack en 5 Julio 2017, 11:24 am Hola ivancea96,
Si. Pero quien le comunicara a la sala la lista de las salas? Supongamos en el comienzo solo hay un servidor y un cliente. Ahora de donde sabe el cliente que hay una sala activa? Si nunca se conecto a la sala y se no se puede conectar a la sala debido a que no sabe de la existencia de esa sala, el servidor tampoco puede informarle al cliente de su existencia. Estaba con el tema de escuchar puertos UDP. Pero no se como se lo del UDP Broadcast. Tienes una idea? Gracias y saludos Título: Re: Encontrar salas de chat con C# Publicado por: ivancea96 en 5 Julio 2017, 11:34 am Si el servidor tiene una lista de salas que va acumulando cada vez que un cliente le dice de crear una sala, entonces es el servidor el que le comunica al cliente las salas que hay cuando el cliente se lo pide. El cliente no tiene que estar unido a ninguna sala para saber la lista de salas que hay. El cliente está conectado al servidor, no más.
Título: Re: Encontrar salas de chat con C# Publicado por: TickTack en 5 Julio 2017, 11:43 am Hola ivancea96,
Citar Si el servidor tiene una lista de salas que va acumulando cada vez que un cliente le dice de crear una sala Pero el cliente no le va decir al servidor eso. Es mas: cómo se lo va decir si todavia no sabe que existe esa sala? Gracias y saludos Título: Re: Encontrar salas de chat con C# Publicado por: Serapis en 5 Julio 2017, 14:36 pm Como os gusta complicaros la vida...
Vamos a ver, quién crea la sala?. en teoría debería crearla el servidor, de entrada debería crear varias salas por defecto, y luego permitir a los usuarios crear otras salas. Por tanto el cliente que quiera crear una sala, debería hacer una petición al servidor, pasándole los parámetros de la sala... nombre delcreador, nombre d ela sala, máximos clientes en la sala, tipo de permisos o privilegios, si es visible a todos o solo admite clientes por invitación, etc, etc, etc... (lo que se te ocurra que queiras que haga tu chat). Con esa petición, el servidor comprueba dichos parámetros (que sean válidos y dentro delrango permitido) y que no exista ya una sala con ese nombre o que no se haya alcanzado el límite máximo de salas... y en respuesta devuelve al cliente si la sala fue creada o no, y si fue creada, el canal... además actualiza la lista de salas, que entrega a todos los clientes en cuanto pueda... Pero básicamente si tu estás creando un chat, son cosas que decides tú, quién cuándo y cómo se hace qué... pués eres tú quien lo diseña. Título: Re: Encontrar salas de chat con C# Publicado por: ivancea96 en 5 Julio 2017, 15:02 pm Hola ivancea96, Pero el cliente no le va decir al servidor eso. Es mas: cómo se lo va decir si todavia no sabe que existe esa sala? Gracias y saludos Para crear una sala, no tiene que existir. No puede existir. Crearla implica que aparezca una sala donde antes no la había. En caso de que se quiera unir, sí, el cliente sí que sabe qué salas existen, porque se lo puede preguntar al servidor. El servidor sí sabe qué salas existen (por ejemplo, en IRC). El servidor tiene la información, el cleinte también, pues el servidor se la provee. Entonces, ¿qué problema hay? Título: Re: Encontrar salas de chat con C# Publicado por: TickTack en 5 Julio 2017, 17:22 pm Hola NEBIRE,
Citar en teoría debería crearla el servidor, de entrada debería crear varias salas por defecto Un servidor que crea salas? Y si uno quiere una sala nada mas? Tomemos como ejemplo Sb0t y Ares para no confundirnos mas: Sb0t deberia crear varias salas por defecto? Que yo sepa, Sb0t no hace eso. Citar Por tanto el cliente que quiera crear una sala Ares, el lado del cliente no crea salas. Sino no seria cliente, sino servidor. Gracias y saludos Hola ivancea96, tomemos como ejemplo Sb0t y Ares para no confundirnos mas: Citar En caso de que se quiera unir, sí, el cliente sí que sabe qué salas existen, porque se lo puede preguntar al servidor. A que servidor? A cualquiera? Como va a hacerle Ares eso a Sb0t en un principio si todavia no tiene ni ip ni puerto de ninguna sala? Gracias y saludos Título: Re: Encontrar salas de chat con C# Publicado por: ivancea96 en 5 Julio 2017, 17:40 pm Ares se conecta a un servidor. Uno por defecto suyo o uno que le das tú, no lo sé, no lo utilizo, pero se conecta.
Las "salas" son algo interno de las aplicaciones. Lo único que tiene que quedar claro, es que hasta un cliente P2P que te muestra "cosas para descargar" o "salas" o lo que quieras, se ha conectado a un servidor o el cliente le ha añadido esa información manualmente o traía esa información ya en el propio cliente. Dado por concluído el tema de que hay un servidor que te da la información, como en Ares, como en IRC, como en eMule... El tema de obtener las salas (aka "cualquier información") es algo que se consigue pidiéndoselas al servidor. Título: Re: Encontrar salas de chat con C# Publicado por: TickTack en 5 Julio 2017, 19:06 pm Hola ivancea96,
Citar Lo único que tiene que quedar claro, es que hasta un cliente P2P que te muestra "cosas para descargar" o "salas" o lo que quieras, se ha conectado a un servidor Osea que alguien tiene la computadora las 24hs abierta para recibir salas y enviar informacion de salas abiertas del Ares? Citar o el cliente le ha añadido esa información manualmente De que manera? Citar o traía esa información ya en el propio cliente Imposible ya que al abrir una sala se actualiza la lista de salas sin tener que liberar una nueva version del cliente. Gracias y saludos Título: Re: Encontrar salas de chat con C# Publicado por: ivancea96 en 5 Julio 2017, 19:36 pm Osea que alguien tiene la computadora las 24hs abierta para recibir salas y enviar informacion de salas abiertas del Ares? Eso es el servidor. Sí, está 24 horas abierto. Y no, no es una computadora si nmás. Es el servidor de Ares al que te conectas. Cuando la gente dice que se ha caído, es porque no está abierto. Que sea P2P no implica que no haya servidor. Sin un primer nodo al que conectarse, ninguna red se puede formar. Título: Re: Encontrar salas de chat con C# Publicado por: Serapis en 6 Julio 2017, 06:16 am Un servidor que crea salas? Y si uno quiere una sala nada mas? Qué funciones crees tú que tiene el servidor????.Colectar clientes y salas. Los clientes existen, no se crean pero al caso los loguea/conecta (que es conceptualmente lo mismo), ...pero ...y las salas?... no son entes propios o sí?... qué crees tú que son las salas?. No existen en ninguna parte. Las crea (virtualmente) el servidor a petición de un cliente (si el diseño del servidor permite que cualquier cliente pueda crearlas (o solo clientes con determinados privilegios (los llamados administradores)). Una sala al fin y al cabo, no es más que un selección de clientes... una colección de clientes, con unas simples propiedades... desde el punto de vista programático, es así de sencillo, instancias de una colección específica, que reúne clientes y comparten eventos a los que todos los clientes que tienen una referencia de esa instancia, están suscritos, y entre sus propiedades puede estar por ejemplo el nombre de la sala... NumeroMaximoUsuarios, cantidadUsuarios, o métodos como AliasDelPropietario, CambiarPrivilegiosDeCliente, ExisteCliente, Addcliente, RemoveCliente, etc... Tomemos como ejemplo Sb0t y Ares para no confundirnos mas: Desconozco, lo que haga tal o cual programa. La pregunta no debe ser qué hace tal programa, la pregunta debe ser qué quieres hacer tú... Si lo que quieres es copiar a otros programas, entonces hazte con una copia del código y estudialo a fondo. Si lo que quieres es diseñar tu propio chat bajo tus propios criterios, pués adelante...Sb0t deberia crear varias salas por defecto? Que yo sepa, Sb0t no hace eso. Ares, el lado del cliente no crea salas. Sino no seria cliente, sino servidor. Insisto... ¿qué quieres hacer?. copiar lo que hace otro programa?... si es que sí busca su código... de todas maneras, las cosas tiene diferentes maneras de resolverse y pensar en copiar lo que hace un programa por que sí, es algo patético. Yo jamás hago algo basado en el hecho de que 'es lo que hacen los demás', como programador, cuando hago algo, lo hago convencido de que es lo mejor que s epuede hacer (dados los recursos de que se dispongan (como el tiempo))... conformarse con copiar, es aspirar... a nada, una copia jamás mejora un original, entonces por qué nadie va a usar una copia teniendo disponible el original, si la copia es mucho peor...Si quieres crear un chat, no tienes por qué copiar todos y cada uno d elos detalles que tengan otros, lo razonable es que tú tengas ideas propias que puedna aportar soluciones o novedades que incluyan mejoras o diferencias significativas que se ditingan del resto... hacer un clónico solo por hacerlo, suele ser una pérdida de tiempo... y casi siempre es mucho más ineficiente. ---- en fin yo te digo como lo plantearía: Si tienes la lista de usuarios-clientes conectados global, esa lista es privada. Puede haber una petición para que un cliente obtenga la lista de salas, mejor si cuando se conecta, se la entrega, también un actualización cuando se crea una nueva sala. Crearía una función para que un cliente (o solo aquellos con determinados privilegios), puedan crear salas, con un evento para actualizar la lista de salas a todos losclientes (quizás determinadas salas solo estén disponibles para los administradores, o bien que requiera supervisión de un administrador, la 'publicación' de una nueva sala. Y una función para que un usuario se mueva de una sala a otra. La sala como te he dicho, no es más que una instancia de una colección, que almacena básicamente clientes. Y que entre ellos se interconectan porque comparten la misma referencia a dicha instancia. Todo controlado por eventos... Pero tú mismo, si quieres imitar a otros programas, lo mejor es que te hagas con el código de alguno... Título: Re: Encontrar salas de chat con C# Publicado por: Serapis en 6 Julio 2017, 10:07 am ---------------------------- NUEVO MENSAJE ------------------
Como pareces duro de mollera :silbar: :silbar: :silbar: un poco de pseudocódigo que te ayude a clarificar ideas... que no es todo tan abstracto... Te pongo un simple ejemplo de lo que sería un servidor, un cliente y una sala... El pseudocódigo de un servidor.... Código: Clase Servidor En alguna web (por ejemplo), cuando quien sea prende la máquina, ejecuta un programa que crea una instancia única del servidor. Servidor WebServer = nuevo Servidor(x,y,z) Y lo pone a la escucha, ahora cuando algún cliente ejecute su programa, ya en su programa reconoce la clase de tipo Servidor, y por tanto espera conectarse y obtener un referencia a la instancia... dejando aparte los detalles de la conexión (que se supone que es algo que dominas), y centrándonos en lo que importa, el cliente hac ela llamada. Servidor ServerCliente = Lllamada(www... puerto... cliente...) Si obtienes la referencia dle servidor, el programa cliente típicamente muestra un iconito verde de 'conectado'. conectado significa que además el servidor conserva una referencia de tí como cliente, y que lo añade a una colección (típicamente una tabla hash). Por tanto ya estás en la sala 'Raíz', la colección global de clientes conectados al servidor... Pero el servidor, puede querer gestionar la clección en trozos más pequeños, pongamos que si hay 10.000 clientes conectados al servidor, no sería muy útil todos respondiendo al mismo tiempo en una sola sala. entonces el servidor puede optar por crear auytomáticamente 'salas' cuando una se satura. Así dentro d ela clase servidor, podría existir la siguiente funcion: Código: Sala = funcion CrearSalaAuto( String Nombre, cliente Propietario, Entero NumMaxUsers) Y la razón para crear una sala automática es repartir clientes, orque había chorrocientos... antes de ir a cambiar el código, dejamos como era el código previo, para esa función: Código: Sala = Funcion Conectar(Cliente Cli) Publico Ahora vamos al código, modificando la función Conectar(), al servidor Código: Sala = Funcion Conectar(Cliente Cli) Publico Date cuenta que omito algunas comprobaciones, para no hacer el pseudocódigo demasiado enfangoso en detalles menores obvios ... es decir el nuevo lciente que se conecta debe verificarse si ya hay uno conectado con ese alias en la sala, y denegarle el acceso en tal caso con un código de error, que significa que 'ese alias ya existe en la sala (incluso mejor si se compara con la lista global. Un método más propicio, sería no mover los clientes de la colección global (salaRaiz), sino que cuando, tras crear el Servidor se crea la salaRaiz, donde estén todos los clientes y una primera sala, donde se añaden los primeros 1000 clientes, cuando se llegue a 1000, se crea otra sala, y los siguientes se conectan a esa nueva sala... y todos siguen constando en la SALARaiz, para verificar que no hay repetido un alias en todo el servidor, esa sala entonces debería ser privada, nadie debe verla, salvo los admin. Es decir cuando un cliente se conecta, primero se mira si se puede añadir a la salaRaiz, si no está allí su alias se añade, y luego se le añade a la sala 'actual' , o una al azar si se crean varias nada más generar el servidor, como ya sabemos que fue añadido a la salaraíz, su alias no está repetido, luego se podrá añadir a otra sala sin problemas. Veamos ahora una función más del servidor... cambiar de sala. Dado que el cliente tiene una referencia del Servidor, tiene acceso a la colección Salas (en modo lectura)... luego se puede listar cuando un cliente se conecta, pero cuando se crea una sala nueva, se notifica con un evento...(como se vió en la modificación de la función anterior). Código: Entero = Funcion ListarSalas(Out Listastring() NombreSalas) Ahora otra función (del servidor) para cambiar de sala, a petición del Cliente: Código: Buleano = Funcion CambiarDeSala(String Nombre, Cliente Cli) Ahora veamos como sería una clase Cliente (no confundir con el programa Cliente, el programa tiene admeás una instancia de esta clase Cliente, que identifica al usuario y le permite hacer ciertas cosas): Un cliente simplificado: Tiene un alias, una conexión con el servidor, una función publicar y una referencia Código: Clase Cliente Finalmente un ejemplo de lo que podria ser la clase Sala... Código: Clase Sala Es un código al vuelo, así rápido así que estará lleno de imprecisiones erroes, y diferencias (en un sitio llamo a un evento de una manera y luego en su clase la nombro de otra), es razonable escribiendolo sobre la marcha... ...espero sin embargo que sirva para que te quede claro varias cosas: --- Que una sala, es tan solo una colección de clientes suscritos a una misma instancia, y que por tanto comparten los eventos de esa única instancia entre ellos. --- Que el servidor mantiene la lista de salas, que es simplemente otra colección de instancias de sala. --- que el servidor puede crear una sala, o varias, incluso de modo automártico si una sala se satura pongamos al 75% de su capacidad, desplazando (también automáticamente) usuarios a la otra sala recién creada. --- Que el servidor puede permitir a un cliente crear una sala, bajo demanda (petición). aunque lo normal es que lo creen los admins o usuarios con privilegios. --- Que los privilegios, aunque no se ha hablado apenas de ellos, son una simple lista de textos, algo como: "CreateSala, MoveToAnySala, ConnecToAnySala, DisconnectToSala, ListUsersInSala, ListSalasInServer, ChangePrivileges, etc..." Incluso un textomás abreviado con mnemónicos si lo prefieres: "cre, mov, con, dis, liu, lis, cha, etc..." ...y bueno si no te enteras, pués ya más no se puede hacer.... |