Red de conocimiento informático - Problemas con los teléfonos móviles - Problemas con la conexión TCP bajo WINSOCK en VB

Problemas con la conexión TCP bajo WINSOCK en VB

Aquí tengo un ejemplo. Este es el servidor que uso para crear el software de chat LAN. Se implementa mediante una matriz de control dinámico. El número máximo de conexiones está actualmente limitado a 15, que por supuesto puede ser. cambió.

Este es solo el código del servidor, solo hay un formulario, el código del formulario es el siguiente:

Private intMax, XxintMax As Long 'Registrar subíndice de control de red

Dim yhs As Integer ' Registre el número de personas conectadas

Private Sub Command2_Click()

sckServer(intMax).Close

End Sub

Private Sub Form_Load( )

Conectar

Label1.Caption = "Número de usuarios actualmente conectados: 0"

intMax = 0

XxintMax = 1

sckServer(0).LocalPort = "15000"

sckServer(0).Listen

XinXi(0).LocalPort = "20000"

XinXi( 0).Escuchar

lianjieshu = 0

yhs = 0

Fin Sub

Sub formulario privado_Descargar (Cancelar Como entero)

Si sckServer(0).State Entonces sckServer(0).Close

End Sub

Private Sub xinxi_ConnectionRequest(Index As Integer, ByVal requestID As Long) 'Control de información

Dim indexi, indexb As Integer 'Encontrar control libre

Si Index = 0 Entonces

indexb = 1

Para indexi = 1 a XxintMax

Si Xxljzt(indexi, 1) = 0 Entonces

p> Salir para

Finalizar si

Siguiente indexi

Si indexb = 1 Entonces

XxintMax = XxintMax 1

indexi = XxintMax

Xxljzt(indexi, 1) = 1

'Else

'Ir a jz

Finalizar si

En caso de error Reanudar siguiente

Cargar XinXi (indexi)

jz: XinXi(indexi).LocalPort = "20000"

XinXi(indexi ).Aceptar requestID

Finalizar si

'MsgBox "Un usuario está conectado"<

/p>

End Sub

Private Sub xinxi_DataArrival(Index As Integer, ByVal bytesTotal As Long) 'El control de información tiene nueva información

Dim strdata, id, neirong, IP As String

Dim i As Integer 'ID de información de reenvío

XinXi(Index).GetData strdata, vbString 'Cuando lleguen los datos, llame al método GetData para recibirlos

Si Left(strdata, 1) = "T" Entonces

id = Trim(Mid(strdata, 4, Val(Mid(strdata, 3, 1))))

IP = Derecha(strdata, Len(strdata) - (Len(id) 3))

i = xinxifs(Val(id))

XinXi(i).SendData ( " T" amp; Len(Trim(Str(Xxljzt(Index, 2)))) amp; 1 ) = "F" Entonces

id = Trim(Mid(strdata, 4, Val(Mid(strdata, 3, 1))))

i = xinxifs(Val( id ))

XinXi(i).SendData ("F")

ElseIf Left(strdata, 1) = "J" Entonces

id = Recortar ( Mid(strdata, 4, Val(Mid(strdata, 3, 1))))

i = xinxifs(Val(id))

XinXi(i).SendData ( strdata )

Else

id = Trim(Mid(Trim(strdata), 2, Val(Left(Trim(strdata), 1))))

neirong = Derecha(Trim(strdata), Len(Trim(strdata)) - Len(id) - 1)

i = xinxifs(Val(id))

XinXi( i ).SendData (Len(Str(Xxljzt(Index, 2))) amp; Str(Xxljzt(Index, 2)) amp; neirong)

End If

End Sub

Subprivado xinxi_Close(Indexar como

Entero) 'Usuario fuera de línea

If XinXi(Index).State lt;gt; sckClosed Then

XinXi(Index).Close

End If

/p>

End Sub

Private Sub sckserver_ConnectionRequest(Index As Integer, ByVal requestID As Long) 'Control de inicio de sesión

Dim indexi, indexb As Integer 'Buscar control libre

Si Index = 0 Entonces

indexb = 1

Para indexi = 1 Para intMax

Si ljzt(indexi) = 0 Entonces

indexb = 0

Salir para

Finalizar si

Siguiente indexi

Si indexb = 1 Entonces

intMax = intMax 1

indexi = intMax

Else

Ir a jz

Finalizar si

Cargar sckServer(indexi)

jz: sckServer(indexi).LocalPort = "15000"

sckServer(indexi).Aceptar requestID

'Cargar txtData( intMax)

End If

'MsgBox "Un usuario está conectado"

End Sub

Private Sub sckserver_DataArrival( Índice como entero, ByVal bytesTotal As Long)

Dim strdata, sql, id, contraseña como cadena

sckServer(Index).GetData strdata, vbString 'Cuando lleguen los datos, llame a GetData método para recibirlo

id = Mid(strdata, 1, InStr(strdata, "\") - 1)

contraseña = Right(strdata, Len(strdata) - InStr( strdata, " \"))

sql = "seleccione * de mima donde ID=" amp Val(Trim(id)) amp;

'" amp; contraseña amp; "'"

Establecer cx = New ADODB.Recordset

cx.CursorLocation = adUseClient

cx.Open sql, conn, 2, 2

Si no es cx.EOF entonces

sckServer(Index).SendData ("1")

ljzt(Index) = 1

lianjieshu = lianjieshu 1

Label1.Caption = "Número de usuarios conectados actualmente:" amp Str(lianjieshu)

Xxljzt(xinxifree, 2) = Val(Trim; ( id))

Else

sckServer(Index).SendData ("0")

Finalizar si

Establecer cx = Nada

Me.Cls

Imprimir índice

End Sub

Private Sub sckserver_Close(Index As Integer) 'Desconectar inicio de sesión

Si sckServer(Index).State lt;gt; sckClosed Entonces

sckServer(Index).Close

Fin

ljzt(Index) = 0

Form1.Print Index amp; "close"

End Sub

Función privada xinxifree() As Integer 'El control de información encuentra una conexión libre

Atenuar i como entero

Para i = 1 a 15

Si Xxljzt(i, 1) = 0 Entonces

xinxifree = i

Salir de la función

Finalizar si

Siguiente i

Finalizar la función

Función privada xinxifs(id como número entero) como número entero 'Encuentre a quién se envió el mensaje

Dim i As Integer

For i = 1 To 15

Si Xxljzt(i, 2) = id Entonces

xinxifs = i

Salir de la función

Finalizar si

Siguiente i

Finalizar la función

Este es el código en el módulo:

Conexión pública como ADODB.Connection 'Tabla de información básica del usuario

Cx pública como ADODB.Recordset

lianjieyh pública ( )Como

Integer 'Registra el ID del usuario conectado

Public lianjieshu As Integer 'Registra cuántos usuarios han iniciado sesión

Public ljzt(1 a 15) 'Registra el estado inactivo de la red control y el número correspondiente del usuario de control

Público Xxljzt(1 a 15, 1 a 2) como entero 'Registrar estado de chat

Sub Connect()

Establecer conn = Nueva ADODB.Connection

conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" amp App.Path amp; >

conn.Open

End Sub

Espero que te ayude