Bueno... esta semana me ha ido muy mal, la chica me mando al carajo, me enferme, y la proxima semana tengo un examen global (4 unidades de un jalon, todo un semestre en un solo examen), eso sin contar de que hay mucho trabajo en el area donde estoy...
Asi que no se porque, pero estoy feliz... y como estoy feliz y como veo que nadie te a contestado, pues yo te contesto... comenzemos...
Bien... Mira, no es necesario incluir un control Winsock por cada cliente que se vaya a conectar al servidor... en lugar de ello podemos utilizar una
matriz de controles, y que se vaya agregando o cargando los winsock necesarios para la cantidad requerida de conexiones simultaneas...
Para ello declaramos una variable contador que nos indique cual es el ultimo elemento de matriz que se ha creado...
Esto lo logramos, poniendo en el evento ConnectionRequest del winsock un codigo como el siguiente:
Private Sub WinsockServidor_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
IntMax = IntMax + 1 'Contador del ultimo cliente que solicito conectarse
Load WinsockServidor(IntMax) 'Crea un nuevo elemento de la matriz de WinsockServidor
WinsockServidor(IntMax).LocalPort = 0
WinsockServidor(IntMax).Accept requestID
End If
End Sub
Con esto le asignamos un control Winsock al nuevo cliente que está solicitando conectarse y le aceptamos la conexion...
Para saber y obtener los datos que se reciben de alguno de los clientes conectados solo ustilizaremos el valor de Index, que hace referencia al indice del control creado...
Private Sub WinsockServidor_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim CadenaEntrante As String
WinsockServidor(Index).GetData CadenaEntrante 'Obtiene el mensaje entrante segun que control lo envió
'Aqui procesamos los datos de entrada, que en este ejemplo quedaron
'almacenados en la variable local CadenaEntrante
End Sub
Algo muy importante que debe tomarse en cuenta, sobre todo para aplicaciones que pueden requerir de una gran cantidad de conexiones (simultaneas o no), es la eliminación (cuando ya no este en uso) del elemento de la matriz de Winsocks creado. Con esto, aparte de que liberamos memoria, tambien nos es util para que la aplicación no explote al llegar a un numero elevado de conexiones, que dependiendo del flujo de usuarios esta puede llegar en un par de semanas o inclusive dias (si la aplicacion tiene demasiada concurrencia, como los chats o servidores web, por ejemplo)... Esto lo solucionamos en el evento Close del Winsock y, como ya he mensionado, hacemos referencia al elemento de la matriz uilizando la variable Index... Veamos el codigo de ejemplo...
Private Sub WinsockServidor_Close(Index As Integer)
WinsockServidor(Index).Close 'Cierras la conexion con el Winsock cliente apuntado por Index
Unload WinsockServidor(Index) 'Descargas el control de memoria para poder cargarlo de nuevo
'y usarlo más adelante
End Sub
Con esto, podremos volver a cargar un elemento ya usado y eliminado... Supongamos que tu aplicacion estara ejecutandose siempre, y que la cantidad máxima de usuarios al dia es de 900. Esto quiere decir que al terminar el cuarto dia de estar funcionando ya habrá ira por el elemento 3600 (mas o menos) de la matriz de controles... y los elementos 1 a 900 ya no existen, entonces podemos volver a crearlos y con esto no llegar al limite establecido (32767), lo cual generaría un error de Desbordamiento. Segun las reglas de Visual Basic, se establece que el máximo número de elementos de una matriz de controles es el 32767, aunque tambien existen otras limitantes que dependen de las caracteristicas de Hardware de la maquina que funge como servidor... tal como la memoria física... pero eso es otra historia...
Asi, por ejemplo, si tu sabes que tu aplicacion no se va a usar por mas de 2000 usuarios simultaneamente (recuerda, puede ser cualquier numero entre 1 y 32767), pues puedes poner ese numero (tal ves configurable) como bandera para reiniciar tu contador. Con esto al codigo del evento ConnectionRequest se le agregaria una linea de mas, quedando algo asi como...
Private Sub WinsockServidor_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
IntMax = IntMax + 1 'El identificador del ultimo cliente que solicito conectarse
'Si ya se sobrepasaron 2000 conexiones resetear el contador...
'Esto es para que se acepten 2000 clientes simultaneameante
'y al mismo tiempo una cantidad ilimitada de conexeciones
If IntMax = 2001 Then IntMax = 1 'Linea agregada
Load WinsockServidor(IntMax) 'Crea un nuevo elemento de la matriz de WinsockServidor
WinsockServidor(IntMax).LocalPort = 0
WinsockServidor(IntMax).Accept requestID
End If
End Sub
Bueno, en teoria eso es lo necesario para
permitir a un servidor ser multiusuario, usando el control Winsock...
Con respecto a la codificacion del programa cliente ésta no cambia en forma brusca con respecto al control Winsock, asi que de eso no te comento nada, ya que como te digo, basicamente no cambia, pues alli no necesitas crear matriz de control ni nada por el estilo... Inclusive, la aplicacion cliente que tienes no sera necerario que la recodifiques al implemantar matriz de Winsock en el Servidor... (a menos que quieras incluir otras caracteristicas claro...)
Mira... Hace algun tiempo hice un chat multiusuario, y aqui te adjunto una copia
simplificada de los programas Cliente y Servidor, que este último es el que realmente te interesa...
Aqui te muestro las pantallas de los programas que te adjunto...
ServidorClienteProbandoComo puedes ver en las imagenes, antes de contestarte verifique que el Servidor aceptara varios clientes, para lo cual hice
21 copias del programa cliente y los ejecute para conectarlos todos al servidor y si, como se esperaba,
fueron aceptadas todas las solicitudes de conexion y todo transcurrio normalmente...
Bueno, cualquier duda sobre el codigo pues mi correo es
santosbussines@hotmail.comBueno... me voy, tengo que seguir estudiando para mi examen...