La comunicación entre equipos mediante un puerto es sencilla, pero requiere alguna cosita más de lo que estás haciendo.
En primer lugar por cada conexión que se abre en el servidor, tienes que lanzar un nuevo hilo de ejecución. El control Winsock está diseñado para aceptar conexiones a través de el índice '0' (El servidor necesita un array de winsock) y establecer el tráfico mediante los diferentes canales sockets (Cada uno de los clientes) cargado.
Por otra parte tienes que establecer un protocolo de entendimiento de forma que el servidor sepa que dato recibe, y que debe responder o como debe actuar.
SERVIDOR EN EL FORMULARIO QUE TIENE EL CONTROL WINSOCK Código:
Private Sub ServerSocket_ConnectionRequest(index As Integer, ByVal requestID As Long)
Dim actIndex As Integer
Dim strData As String
On Local Error Resume Next
Err.Clear
If index = 0 Then
If serverFree.Count <> 0 Then
actIndex = serverFree(1)
serverFree.Remove 1
'Aceptar conexión recuperando hilo
ServerSocket(actIndex).LocalPort = 0
ServerSocket(actIndex).Accept requestID
Else
idServer = idServer + 1
actIndex = idServer
'Aceptar conexión en nuevo hilo
Load ServerSocket(actIndex)
ServerSocket(actIndex).LocalPort = 0
ServerSocket(actIndex).Accept requestID
End If
End If
'preparar cadena de identificación
strData = "[REQUEST]|" + SysDbPath + ";" + DbPath + ";" + DictField
sendSERVER actIndex, strData
End Sub
Private Sub ServerSocket_DataArrival(index As Integer, ByVal bytesTotal As Long)
Dim socketData As String
On Local Error Resume Next
DoEvents
ServerSocket(index).GetData socketData
releaseSERVER index, socketData
End Sub EN UN MÓDULO PÚBLICO DEL PROYECTO SERVIDOR Código:
Option explicit
'Colección para controlar canales liberados de Winsock
public Serverfree as collection
Public Sub releaseSERVER(index As Integer, Data As String)
Dim items() As String
Dim parms() As String
On Local Error Resume Next
items = Split(Data, "|")
parms = Split(items(1), ";")
Select Case UCase(Trim(items(0)))
Case "[REQUEST]" : Sendserver index,"Me has pedido REQUEST"
Case "[USERDATA]" : Sendserver index,"Me has pedido USERDATA"
Case "[QUIT]" : : Sendserver index,"Me has pedido QUIT"
Case "[SYSDBPATH]" : Sendserver index,"Me has pedido SYSDBPATH"
Case ".....más cosas que se te ocurran...."
End Select
End Sub
Public Sub sendSERVER(index As Integer, Data As String)
On Local Error Resume Next
frmPrincipal.ServerSocket(index).SendData Data
DoEvents
End Sub
Ahora en la parte cliente (tal y como lo tienes) sólo tienes que implementar el mismo protocolo para controlar el tráfico de datos. Fíjate que en este ejemplo utilizo un encabezado seguido de los datos para que servidor y cliente sean capaces de interpretar que cosa le pide la otra parte.
[COMANDO]|datoa;datob;datoc;datoe;...;daton
Además establecer un protocolo te sirve para sincronizar el tráfico de información, de lo contrario puede suceder que aún no habiendo recibido toda la trama, ya estés enviando respuesta, y algo así se traduce en un 'cuelge' de las comunicaciones y pérdida de información.
Espero que te resulte útil.
PD: El código adjunto es un esquema de funcionamiento; debes leeerlo, comprender la técnica y aplicarla en tu aplicación, nunca copiar y pegar porque no será funcional hasta que construyas todo