Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Conexion Un servidor y 10 Clientes, Parte 1 (Winsock)

Estas en el tema de Conexion Un servidor y 10 Clientes, Parte 1 (Winsock) en el foro de Visual Basic clásico en Foros del Web. Hola que tal amigos, como les dije estoy haciendo un control ciber, y ya alcanzó su primera fase (1), ahora quiero ir a la realidad, ...
  #1 (permalink)  
Antiguo 04/06/2011, 06:57
Avatar de servantsoftware  
Fecha de Ingreso: abril-2011
Ubicación: 1 Pedro 4.11
Mensajes: 94
Antigüedad: 13 años
Puntos: 3
Pregunta Conexion Un servidor y 10 Clientes, Parte 1 (Winsock)

Hola que tal amigos, como les dije estoy haciendo un control ciber, y ya alcanzó su primera fase (1), ahora quiero ir a la realidad, que idea o como podríamos hacer para convertir un form en un servidor y 10 clientes individuales, que solo tengan la opción de mandar un texto, pero que el servidor los atienda a todos individualmente?

Miren ya tengo el método de como hacer para que se puedan conectar múltiples clientes a mi servidor: publicare el código fuente, ya que es ejemplo de una web:

Todos los que ayuden y aporten para este proyecto saldrán en Agradecimientos, pero sobre todo estaré agradecido yo.

Cliente:

Código:
Private Sub CommandXP1_Click()
Winsock1.SendData Text2.Text & vbCrLf


Text1.SelStart = Len(Text1.Text)

Text1.Text = Text1.Text & "Cliente >" & Text2.Text & vbCrLf

Text1.SelStart = Len(Text1.Text)

Text2.Text = ""
End Sub

Private Sub CommandXP2_Click()
Winsock1.RemoteHost = Text3.Text

Winsock1.RemotePort = Text4.Text

Winsock1.Close

Winsock1.Connect
End Sub

Private Sub CommandXP3_Click()
'cierra la conexion

Winsock1.Close


'desplegamos un mensaje en la ventana

Text1.Text = Text1.Text & "*** Conexion cerrada por el usuario." & vbCrLf



'desplazamos el scroll

Text1.SelStart = Len(Text1.Text)
End Sub

Private Sub Form_Load()
Text1.Text = W.LocalIP 'Añadimos la ip al menu
End Sub

Private Sub Winsock1_Close()
Winsock1.Close
Text1.SelStart = Len(Text1.Text)

Text1.Text = Text1.Text & "*** Conexion cerrada por el servidor***" & vbCrLf

Text1.SelStart = Len(Text1.Text)

End Sub

Private Sub Winsock1_Connect()
Text1.Text = Text1.Text & "*** Conexion establecida ***" & vbCrLf
Text1.SelStart = Len(Text1.Text)

End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim Buffer As String 'variable para guardar los datos


'obtenemos los datos y los guardamos en una variable

Winsock1.GetData Buffer


'apuntamos al final del contenido del TextBox e

'insertamos los nuevos datos obtenidos

Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido

Text1.Text = Text1.Text & "Servidor >" & Buffer 'mostramos los datos

Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido

End Sub

Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

'cerramos la conexion

Winsock1.Close


'mostramos informacion sobre el error

MsgBox "Error numero " & Number & ": " & Description, vbCritical
 


End Sub
Imagen Cliente:

OJO, la imagen solo es para ejemplo ya que es obio que no es el servidor del control ciber.



.................................................. ...........................................

servidor:

Código:
'Carga un nuevo socket al arreglo y devuelve su indice

Private Function NuevoSocket() As Integer

Dim numElementos As Integer 'numero de sockets

Dim i As Integer 'contador


'obtiene la cantidad de Winsocks que tenemos

numElementos = Winsock2.UBound


'recorre el arreglo de sockets

For i = 0 To numElementos

'si algun socket ya creado esta inactivo

'utiliza este mismo para la nueva conexion

If Winsock2(i).State = sckClosed Then

NuevoSocket = i 'retorna el indice

Exit Function 'abandona la funcion

End If

Next


'si no encuentra sockets inactivos

'crea uno nuevo y devuelve su identidad

Load Winsock2(numElementos + 1) 'carga un nuevo socket al arreglo


'devuelve el nuevo indice

NuevoSocket = Winsock2.UBound

End Function



Private Sub CommandXP1_Click()
Dim numElementos As Integer 'numero de sockets

Dim i As Integer 'contador


'obtiene la cantidad de Winsocks que tenemos

numElementos = Winsock2.UBound


'recorre el arreglo de sockets

For i = 0 To numElementos

'si el socket se encuentra conectado...

If Winsock2(i).State = sckConnected Then

'enviamos el contenido de Text2

Winsock2(i).SendData Text2.Text & vbCrLf


'apuntamos al final del contenido del TextBox e

'insertamos los nuevos datos obtenidos

Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido

Text1.Text = Text1.Text & "Sock" & i & ":Servidor >" & Text2.Text & vbCrLf 'mostramos los datos

Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido

End If

Next

'borramos Text2

Text2.Text = ""

End Sub

Private Sub CommandXP2_Click()
'cierra la conexion

WinsockP.Close

'desplegamos un mensaje en la ventana

Text1.SelStart = Len(Text1.Text)

Text1.Text = Text1.Text & "*** Conexion cerrada por el usuario ***" & vbCrLf

Text1.SelStart = Len(Text1.Text)

End Sub

Private Sub CommandXP3_Click()
'cerramos cualquier conexion previa

WinsockP.Close

'asignamos el puerto local que abriremos

WinsockP.LocalPort = Text3.Text


'deja el socket esuchando conexiones

WinsockP.Listen


'desplegamos un mensaje en la ventana

Text1.SelStart = Len(Text1.Text)

Text1.Text = Text1.Text & "*** Escuchando conexiones ***" & vbCrLf

Text1.SelStart = Len(Text1.Text)
End Sub
Private Sub CommandXP9_Click()
Text1.Text = ""
End Sub

Private Sub Form_Load()
Text1.Text = W.LocalIP 'Añadimos la ip al menu
End Sub

Private Sub WinsockP_Close()
'cierra la conexion

WinsockP.Close

'desplegamos un mensaje en la ventana

Text1.SelStart = Len(Text1.Text)

Text1.Text = Text1.Text & "*** Conexion cerrada por el Cliente." & vbCrLf

Text1.SelStart = Len(Text1.Text)

End Sub

Private Sub WinsockP_ConnectionRequest(ByVal requestID As Long)
Dim numSocket As Integer 'el numero del socket


'mostramos un mensaje en la ventana

Text1.SelStart = Len(Text1.Text)

Text1.Text = Text1.Text & "*** Peticion numero " & requestID & vbCrLf

Text1.SelStart = Len(Text1.Text)


'creamos un nuevo socket

numSocket = NuevoSocket


'aceptamos la conexion con el nuevo socket

Winsock2(numSocket).Accept requestID


'desplegamos un mensaje en la ventana

Text1.SelStart = Len(Text1.Text)

Text1.Text = Text1.Text & "Sock" & numSocket & ":*** Conexion aceptada, listo para interactuar ***" & vbCrLf

Text1.SelStart = Len(Text1.Text)

End Sub

Private Sub WinsockP_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

'cerramos la conexion

WinsockP.Close


'mostramos informacion sobre el error

MsgBox "Error numero " & Number & ": " & Description, vbCritical

End Sub

Private Sub Winsock2_Close(Index As Integer)
'cierra la conexion

Winsock2(Index).Close


'desplegamos un mensaje en la ventana

Text1.SelStart = Len(Text1.Text)

Text1.Text = Text1.Text & "Sock" & Index & ":*** Conexion cerrada por el Cliente." & vbCrLf

Text1.SelStart = Len(Text1.Text)

End Sub

Private Sub Winsock2_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim Buffer As String 'variable para guardar los datos


'obtenemos los datos y los guardamos en una variable

Winsock2(Index).GetData Buffer


'apuntamos al final del contenido del TextBox e

'insertamos los nuevos datos obtenidos

Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido

Text1.Text = Text1.Text & "Sock" & Index & ":Cliente >" & Buffer 'mostramos los datos

Text1.SelStart = Len(Text1.Text) 'coloca el cursor al final del contenido

End Sub


Private Sub Winsock2_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
'cerramos la conexion

Winsock2(Index).Close


'mostramos informacion sobre el error

MsgBox "Error numero " & Number & ": " & Description, vbCritical

End Sub
Imagen servidor:



.................................................. .................................................. ....

Como puedo hacer para que el servidor atienda a cada cliente individualmente, es decir como mandarle mensajes a los clientes individual mentey como hacer o saber para que los clientes vayan siendo: 1,2,3,4,5,6,7,8,9,10 osea para que el servidor pueda dectectar.


si saben lo que es un control ciber sabrán de lo que hablo sin problemas, Gracias, no lo puedo hacer solo ayudenme
  #2 (permalink)  
Antiguo 04/06/2011, 12:03
Avatar de servantsoftware  
Fecha de Ingreso: abril-2011
Ubicación: 1 Pedro 4.11
Mensajes: 94
Antigüedad: 13 años
Puntos: 3
Respuesta: Conexion Un servidor y 10 Clientes, Parte 1 (Winsock)

Oh bien no se si me entiendan, o que el cliente tenga una forma de identificarse, de cual numero es, o tal vez que aiga 10 text para enviar un texto a cada cliente, porque como esta ahora cuando el servidor envia un texto le llega a azar a los servidores...
  #3 (permalink)  
Antiguo 04/06/2011, 19:43
Avatar de culd  
Fecha de Ingreso: noviembre-2003
Mensajes: 959
Antigüedad: 20 años, 6 meses
Puntos: 19
Respuesta: Conexion Un servidor y 10 Clientes, Parte 1 (Winsock)

Por lo visto, habras descargado un ejemplo de internet...

En primer lugar tenes que entender como funciona winsock, asi como esta armado, esta en buen camino, no te digo que perfecto, pero en buen camino.

Para que winsock trabaje como servidor, y tengas miles de usuarios conectados, tenes que crear una matriz de controles, que por lo visto ya esta creada... Por cada conexion que tengas carga un nuevo control winsock a la matriz... Y para diferenciar entre conexion y conexion haces uso de INDEX...

En DattaArrival, recibis los paquetes, y los diferencias nuevamente desde INDEX...

Tendrias que armar tu propio protocolo en dattarrival con una especie de IF, o SELECT CASE... Te doy ejemplo...

XXXXYYYYYYYYY

Los primeros 4 caracteres identifican el comando, y los siguientes la opcion

CHAThola como andas

"CHAT" seria que quiere mandar un mensaje, y el resto del paquete seria el mensaje en si... Entonces tenes que usar un SELECT CASE donde separes los primeros 4 caracteres para identificar la accion, y el resto de caracteres para lo que necesitas...

USERjuan perez

Podrias llamar "USER" al nombre de usuario.. Y asi sucesivamente.
  #4 (permalink)  
Antiguo 04/06/2011, 21:32
Avatar de servantsoftware  
Fecha de Ingreso: abril-2011
Ubicación: 1 Pedro 4.11
Mensajes: 94
Antigüedad: 13 años
Puntos: 3
Respuesta: Conexion Un servidor y 10 Clientes, Parte 1 (Winsock)

Gracias por tu aporte

Etiquetas: clienteyservidor
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 07:16.