¿Cómo utilizar Winsock para la transferencia remota de archivos en VB?
Programación de red - sala de chat (el código es el siguiente)
Este programa se basa en la aplicación del control Winsock en el entorno de desarrollo VB, sigue el protocolo TCP/IP y utiliza el socket de la función de control para realizar la comunicación de datos entre computadoras remotas. Consta de servidor y cliente. El servidor se utiliza para conectar varios clientes. Puede contar la cantidad de personas que se han conectado al servidor y la cantidad de personas actualmente en línea en el servidor. También es responsable de enviar y recibir mensajes enviados por cada cliente para lograr una conexión real. comunicación de datos oportuna, precisa y sin errores entre múltiples clientes. Este programa puede conectarse a 1000 clientes, y si desea aumentar o disminuir la cantidad de clientes disponibles para la conexión, solo necesita realizar ligeros cambios en el límite superior de clientes en el programa fuente.
Cómo funciona
Servidor: declara un conjunto de matrices de control Winsock en tiempo de ejecución, crea solo el primer elemento de la matriz y comienza a escuchar desde el puerto 9999 (escuchar), cuando haya es Cuando el cliente se conecta al primer control Winsock y la conexión es exitosa, se activa el evento Winsock_ConnectRequest () y el número de puerto (Localport) se reduce en 1 unidad. En este momento, se utiliza el método Load Winsock (i). para crear el siguiente elemento de matriz de control de Winsock y dejar que comience a escuchar, continuar esperando a que se conecte el nuevo cliente, y así sucesivamente. Cuando la cantidad de conexiones alcanza el límite de clientes establecido, el servidor deja de crear nuevos elementos de matriz de control Winsock, deja de escuchar y deja de conectar clientes. Una vez que el servidor y el cliente se conectan correctamente, los datos se envían y reciben a través del evento DataArrival() de Winsock, los métodos SendData y GetData. En el servidor se utiliza un cuadro de texto con un atributo Bloqueado establecido en Verdadero para registrar todos los mensajes (registros de chat) enviados por los clientes.
Cliente: cree solo un control Winsock durante el tiempo de ejecución, especifique el puerto remoto de Winsock en orden descendente a partir de 9999 y conéctese al servidor remoto en secuencia. Una vez que la conexión sea exitosa, deje de especificar el puerto y comience a comunicarse. con el servidor.
Utilice un cuadro de texto con el atributo Bloqueado establecido en Verdadero para registrar todos los mensajes enviados por los clientes y utilice un cuadro de texto editable para ingresar los mensajes que los clientes desean enviar. Esto básicamente implementa la función de un chat. habitación. .
Código de programa
Servidor:
Opción explícita
Atenuar invitado como entero 'Contador de números de clientes en línea
Dim j As Integer 'Contador del número de clientes recibidos
Dim k As Integer 'Contador del número de mensajes enviados a clientes en línea
Dim t As Integer 'Número de mensajes enviados a clientes en línea cuando el servidor está cerrado Contador
Atenuar puerto como entero 'Contador de puerto
Atenuar mensaje como cadena 'Texto del mensaje enviado y recibido
Atenuar nuevo invitado como Entero 'Nueva conexión de cliente
Sub privado Form_Load()
Si App.PrevInstance Entonces MsgBox "¡Lo siento! Ya has creado un servidor^_^": Fin
j = 0
invitado = 0
puerto = 9999
Texto2 = Winsock1(0).LocalIP
Etiqueta3.Caption = "Número de personas en línea:" amp; guest
Label4.Caption = "Número de personas recibidas:" j
Winsock1(0).LocalPort = puerto 'El primero; el control en la matriz de control Winsock comienza a escuchar
Winsock1(0).Listen
End Sub
Private Sub Form_Unload(Cancel As Integer) 'Buffer al cerrar el servidor y envía una señal de desconexión
Cancelar = 1
t = 0
Timer2.Enabled = 1
End Sub
Private Sub Timer1_Timer()
En caso de error, reanudar siguiente 'Manejo de errores
Winsock1(k).SendData msg 'Enviar mensajes recibidos inmediatamente a todos los clientes
k = k 1
Si k gt;= j Entonces Timer1.Enabled = 0
End Sub
Private Sub Timer2_Timer() 'Enviar señal de desconexión al cliente
En caso de error Reanudar siguiente
msg = "closewinsock"
Winsock1(t).SendData msg
t = t 1
Si t gt ; j Then End
End Sub
Private Sub Timer3_Timer() 'Enviar mensaje de bienvenida a nuevos clientes
Activado Error Reanudar siguiente
Si k = newguest Entonces Salir Sub
Winsock1(k).SendData msg
k = k 1
Si k gt;= j Entonces Timer3.Enabled = 0
End Sub
Sub privado Winsock1_ConnectionRequest(Índice como entero, ByVal requestID como largo)
En caso de error, reanudar a continuación
Atenuar persona en línea como String
msg = ""
If Winsock1(Index).State lt;gt; sckClosed Then Winsock1(Index).Close 'Conectado correctamente
Winsock1( Index).Aceptar requestID
j = j 1 'Cuenta el número de personas recibidas
Si invitado 1 lt 10 Entonces
onlineperson = "currentonlineperson00" CStr; (invitado 1) msg
ElseIf invitado 1 lt; 100 Then
onlineperson = "currentonlineperson0" CStr(invitado 1) msg
End If
Winsock1(Index).SendData onlineperson amp; "Usted es el cliente" amp; CStr(j) "que ingresó a esta sala de chat^_^" Chr(13) Chr(10) p>
msg = onlineperson amp; "th" amp; CStr(j) amp "Los clientes ingresaron a esta sala de chat" Chr(13) Chr(10)
Text1 = Text1 "th" amp; ; CStr( j) amp; "Los clientes ingresaron a esta sala de chat" Chr(13) Chr(10)
k = 0
newguest = Index
Timer3 Habilitado = 1
Text1.SelStart = Len(Text1)
invitado = invitado 1 'Cuenta el número de personas en línea
Label3.Caption = "El. número de personas en línea:" amp; guest
Label4.Caption = "Número de personas recibidas:" amp; j
Cargar puerto Winsock1(j)
= puerto - 1
Winsock1(j).LocalPort = puerto
Winsock1(j).Listen
End Sub
Sub privado Winsock1_DataArrival(Índice como entero, ByVal bytesTotal mientras)
En caso de error, reanudar a continuación
Atenuar i como entero
Atenuar persona en línea como cadena
msg = ""
Winsock1(Index).GetData msg 'Enviar señal de desconexión
Si
msg = "closewinsock" Entonces
msg = ""
Winsock1(Index).Close
Si invitado - 1 lt 10 Entonces
onlineperson = "currentonlineperson00" CStr(invitado - 1)
ElseIf guest lt; 100 Then
onlineperson = "currentonlineperson0" CStr(invitado - 1)
Finalizar si
msg = "th" amp; CStr(Index 1) amp "Los clientes se han ido" Chr(13) Chr(10)
Text1 = Text1 msg < / p>
msg = onlineperson amp; "th" amp; CStr(Index 1) amp; "Un cliente se fue" Chr(13) Chr(10)
Text1.SelStart = Len( Text1 )
k = 0
Timer1.Enabled = 1
invitado = invitado - 1
Label3.Caption = "Número de personas en línea :" amp; guest
Label4.Caption = "Número de personas recogidas: " amp; j
Salir Sub
End If
msg = "El cliente de "CStr(Index 1)" dijo:" msg Chr(13) Chr(10)
Text1 = Text1 msg
Text1.SelStart = Len(Texto1 )
k = 0
Timer1.Enabled = 1
End Sub
Cliente:
Dim linkstate As Boolean 'Determina el estado de la conexión
Dim port As Integer 'Pruebe los puertos para conectarse en secuencia
Private Sub Cmdconnect_Click()
En caso de error Reanudar siguiente
Atenuar como cadena
Atenuar x como cadena
Atenuar y como entero
y = 0
Si Len(Text1) = 0 Then Exit Sub 'Determina si la dirección IP ingresada es legal
For i = 1 To Len(Text1)
If Mid(Text1, i , 1) lt;gt ; "." Entonces
t = t Mid(Text1, i, 1)
x = ""
Else p>
y = y 1
x = x Mid(Text1, i, 1)
t = ""
Fin si
Si Len (t) gt; 3 O x = ".
." O Left(Text1, 1) = "." O Right(Text1, 1) = "." Luego
MsgBox "Ingrese la dirección IP correcta^_^", vbOKOnly vbInformation, "Conectar ": Salir Sub
End If
Siguiente i
If y lt; gt; 3 Then MsgBox "Ingrese la dirección IP correcta ^_^", vbOKOnly vbInformation, "Conexión": Salir de Sub
Si Text1 es como "*.*.*.*" Entonces
Si Cmdconnect.Caption = "& Link" Luego 'Selección de usuario Conectar
Cmdconnect.Caption = "&Break"
Timer1.Enabled = 1
Text1.Enabled = 0
Else ' El usuario elige para interrumpir la conexión
Label4.Caption = "Número de personas en línea: 0"
Text2 = Text2 "Conexión interrumpida" Chr(13) Chr(10)
Text2.SelStart = Len(Text2)
Timer1.Enabled = 0
Text1.Enabled = 1
Text1.SetFocus
Cmdconnect .Caption = "Enlace"
Winsock1.SendData "closewinsock"
linkstate = False
puerto = 9999
Text3. Habilitado = Falso
cmdsend.Enabled = Falso
Finalizar si
Finalizar si
Fin Sub
Privado Sub cmdsend_Click()
En caso de error Reanudar Siguiente 'Enviar mensaje
Winsock1.SendData Text3
Text3 = ""
Text3.SetFocus
End Sub
Sub privado Form_Load()
linkstate = False
puerto = 9999
End Sub
Sub Form_Unload privado (Cancelar como entero)
En caso de error, reanudar a continuación
Winsock1.SendData "closewinsock" 'Envía una señal de desconexión al servidor
Cancelar = 1
Timer2.Enabled = 1
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer) 'Prohibir a los usuarios ingresar IP ilegal direcciones
If KeyAscii lt 48 O
KeyAscii gt; 57 Entonces
Si KeyAscii lt;gt; 8 Y KeyAscii lt;gt; 46 Entonces KeyAscii = 0
Fin
End Sub
p>
Sub privado Text2_KeyPress(KeyAscii como entero)
Si Text3.Enabled = False entonces salga de Sub
Si KeyAscii = 13 luego llame a cmdsend_Click
Text3 = Text3 Chr(KeyAscii)
End Sub
Sub privado Text3_KeyPress(KeyAscii As Integer)
Si KeyAscii = 13, entonces llame a cmdsend_Click
End Sub
Private Sub Timer1_Timer() 'Intenta conectarte al servidor desde el puerto 9999 en secuencia
Si linkstate = True, entonces sal de Sub
Winsock1 .Close
Winsock1.Close
p>
Winsock1.RemoteHost = Text1.Text
Winsock1.RemotePort = puerto
Winsock1.Connect
port = port - 1
Si port lt; 9000 Entonces 'Establece el límite superior de puertos disponibles para la conexión
Timer1.Enabled = 0
Text1.Enabled = 1
Cmdconnect Caption = "Enlace"
puerto = 9999
MsgBox "No se puede conectar al servidor, verifique el estado de la conexión de red", vbOKOnly vbCritical, "Connection"
End If
End Sub
Private Sub Timer2_Timer() 'Buffer para enviar señal de desconexión
End
End Sub
p>Private Sub Winsock1_Connect()
puerto = puerto 1
Timer1.Enabled = 0
linkstate = True
Text3.Enabled = 0
cmdsend.Enabled = 0
MsgBox "Conectado exitosamente", vbOKOnly vbInformation, "Conectado"
Text3.Enabled = 1
cmdsend.Enabled = 1
Text3.SetFocus
End Sub
Sub privado Winsock1_DataArrival(ByVal bytesTotal As Long)
Atenuar mensaje como cadena
Winso
ck1.GetData msg 'Recibe los datos del servidor y los procesa en consecuencia
If Left(CStr(msg), 19) = "currentonlineperson" Then
Label4.Caption = " Number de personas en línea: " & Str(Val(Mid(CStr(msg), 20, 3)))
msg = Right(CStr(msg), Len(CStr(msg)) - 22)
Finalizar si
Si CStr(msg) = "closewinsock" Entonces
Llamar a Cmdconnect_Click
Text2.SelStart = Len(Text2)
Salir de Sub
End If
Text2 = Text2 msg
Text2.SelStart = Len(Text2)
Fin Sub
Respuesta: Hai Biyangbo - Tongsheng Nivel 12-28 13:12
La evaluación ha sido cerrada Actualmente hay 1 evaluación personal
OK <. /p>
100 (1) No es bueno
0 (0)
Otras respuestas*** 3
asp
Respuesta: dageda - Xiucai Nivel 2 12-22 02:54
acción nula pública realizada (ActionEvent e)
{
int count, temp
p>temp=ch.getSelectedIndex();
if(e.getSource()==btn1)
{
ch .select( --temp);
count=temp;
content.setText(String.valueOf(add1[temp] ope2[temp] add2[temp]) "=" ); /p>
radio1.setLabel(String.valueOf(respuesta[temp][0]));
radio2.setLabel(String.valueOf(respuesta[temp][1]) <); /p>
radio3.setLabel(String.valueOf(respuesta[temp][2]));
radio4.setLabel(String.valueOf(respuesta[temp][3]) <); /p>
if(count==0)
{
btn1.setEnabled(false);
}
btn2.setEnabled(verdadero);
txt1.setText("");
check1.setState(false);
correctLab.setVisible( falso);
}
if(e.getSource()==btn2)
{
ch.select( temp) ; p>
cuenta=t
emp;
content.setText(String.valueOf(add1[temp] ope2[temp] add2[temp]) "="
radio1.setLabel(String.valueOf(); respuesta[temp][0]));
radio2.setLabel(String.valueOf(respuesta[temp][1]));
radio3.setLabel(String.valueOf( respuesta[temp][2]));
radio4.setLabel(String.valueOf(respuesta[temp][3]));
if(count==9)
{
btn2.setEnabled(false);
}
btn1.setEnabled(true); txt1.setText("");
check1.setState(false);
correctLab.setVisible(false);
}
count=temp;
if(e.getSource()==txt1)
{
Nombre de cadena=txt1.getText(); >
if(name.equals(radio1.getLabel()))
{
radio1.setState(true)
}
if(name.equals(radio2.getLabel()))
{
radio2.setState(true)
}
if(name.equals(radio3.getLabel()))
{
radio3.setState(true)
}
if(name.equals(radio4.getLabel()))
{
radio4.setState(true)
}
}
}
itemStateChanged public void(ItemEvent e)
{
int count, temp
if(e.getItemSelectable()==ch)
{
temp=ch.getSelectedIndex()
count=temp; /p>
content.setText(String.valueOf(add1[temp] ope2[temp] add2[temp]) "="
radio1.setLabel(String.valueOf(answer[temp]); ][0]));
radio2.setLabel(String.valueOf(answer[temp][1]));
radio3.setLabel(String.valueOf(answe).
r[temp][2]));
radio4.setLabel(String.valueOf(answer[temp][3]));
if(count==0)
{
btn1.setEnabled(false);
}
btn2.setEnabled(true); if(count==9)
{
btn2.setEnabled(false)
}
btn1.setEnabled(true)
txt1.setText("");
check1.setState(false);
correctLab.setVisible(false); >}
if(e.getItemSelectable()==radio1)
{
txt1.setText(radio1.getLabel());
}
if(e.getItemSelectable()==radio2)
{
txt1.setText(radio2.getLabel()); p>
p>
}
if(e.getItemSelectable()==radio3)
{
txt1.setText(radio3. getLabel());
}
if(e.getItemSelectable()==radio4)
{
txt1.setText( radio4.getLabel() );
}
if(e.getItemSelectable()==check1)
{
if( e.getStateChange() ==e.SELECTED)
{
correctLab.setVisible(true);
temp=ch.getSelectedIndex(); p>
correctLab.setText("La respuesta correcta es: " String.valueOf(correct[temp])
}
else if(e.getStateChange()); ==e.DESELECTED)
{
correctLab.setVisible(false
}
}
}
}
clase pública xhks120
{
public static void main(String args[])
{
Mi marco fr=new Mi marco("");