Social Icons

viernes, 28 de marzo de 2014

Como programar en red con visual basic 6 - Mini-chat que acepta varias conexiones

Ahora entraremos a la programación de un minichat que aceptará varias conexiones. El anterior solo aceptaba una conexión, que era 1 solo servidor con 1 solo cliente, ahora será 1 solo servidor con x número de clientes.

Viendo este código, se podrán hacer muchas otras aplicaciones similares, éste minichat se puede decir que es la base para poder crear sistemas de administración, ya sea de cybers, control de acceso, en el que se involucran varias computadoras clientes.

El minichat en lugar de usar el puerto 10112 como el anterior, usará el puerto 80 para asegurar de que también podrá usarse a través de internet.

El código tiene explicación linea por linea.


En un formulario, que actuará como menú, se crean los siguientes submenús


Debe verse algo así:


Y entonces programaremos los menús:

Private Sub mcliente1_Click()
  cliente.Show 'llama al formulario "cliente2"
End Sub

Private Sub mcliente2_Click()
  cliente2.Show 'llama al formulario "cliente2"
End Sub

Private Sub salir_Click()
  Unload Me
End Sub

Private Sub servidor1_Click()
  servidor.Show 'llama al formulario "servidor"
End Sub

Entonces creamos un nuevo formulario que se llame “servidor”, al cual le agregaremos:
-          1 listbox
-          2 textos (text2 y text1)
-          1 botón de comando (command2), en caption “Enviar”
-          3 etiquetas (label1, label2, label5), label1 en caption “Estado”, label5 en caption “Mi ip es:”
-          1 timer (timer1), timer1 en interval = 1
-          1 winsock(winsock1), winsock1 en index = 0



Ahora coloca el siguiente código fuente

Public contador_conexiones As Integer
Private Sub Delay(lngCentSeg As Long)
  Dim TimeEnd As Single
  TimeEnd = Timer + lngCentSeg / 100
  Do While TimeEnd > Timer
    DoEvents
  Loop
End Sub

Private Sub Command2_Click()
  Dim enviar As String
  enviar = Text2.Text
  Dim c As Integer
  c = 1
  'Ciclo para enviar datos a todos los clientes
  While c < contador_conexiones
    Call Delay(1)
    If Val(Winsock1(c).State) = 7 Then 'Si la conexión está establecida con el cliente
      Winsock1(c).SendData enviar 'Enviamos datos al cliente
    End If
    c = c + 1
  Wend
  List1.AddItem "yo: " & enviar ' Imprimimos en nuestra pantalla el mensaje mandado
  Text2.Text = ""
End Sub

Private Sub Form_Load()
  Winsock1(0).LocalPort = 80 'Establecemos el puerto que se usará
  Winsock1(0).Listen 'Pone a la escucha el winsock principal
  contador_conexiones = 1
  Text1.Text = Winsock1(0).LocalIP ' Obtenemos la ip de nuestra computadora
End Sub

Private Sub Timer1_Timer()
  If Winsock1(0).State = 2 Then 'Si el winsock está a la espera de conexiones
    Label2.Caption = "Esperando una solicitud de conexión"
  End If
  If List1.ListCount > 0 Then
    List1.ListIndex = List1.ListCount - 1 'Se selecciona el último mensaje recibido
  End If
End Sub




Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
  Load Winsock1(contador_conexiones)  'Se crea un nuevo winsock en el vector
  Winsock1(contador_conexiones).Close 'Se cierra el winsock creado
  Winsock1(contador_conexiones).Accept requestID 'El winsock creado acepta la conexión entrante
  contador_conexiones = contador_conexiones + 1 'Aumentamos nuestra variable de conexiones
End Sub


Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
  Dim datos As String
  Winsock1(Index).GetData datos 'Obtenemos los datos que haya enviado x cliente
  List1.AddItem Winsock1(Index).RemoteHost & datos 'Ponemos en pantalla el mensaje recibido
End Sub


Ahora crea un nuevo formulario el cual se llamará “cliente”, al cual le agregarás:
-          1 listbox
-          2 etiquetas (label1, label3), label1 en caption “IP”, label3 en caption “Mi IP es:”
-          3 textos (text2, text3, text1)
-          2 botones de comando (command2, command1), command2 en caption “Enviar”, command1 en caption ”Conectar ”.
-          1 winsock (winsock1)
-          1 timer (timer1), timer en interval = 30





Ahora agrega el siguiente código:

Private Sub Command1_Click()
  If Command1.Caption = "Conectar" Then
    Winsock1.Connect Text3.Text, 80 'Conectamos mediante el puerto 80
  Else
    Unload Me    'Cerramos el formulario
    cliente.Show 'Lo volvemos a abrir
  End If
End Sub

Private Sub Command2_Click()
  If Winsock1.State = 7 Then 'Si la conexión está establecida
    Dim enviar As String
    enviar = Text2.Text
    Winsock1.SendData Winsock1.LocalHostName & ": " & enviar 'Enviamos un mensaje como el siguiente: nombre_computadora:mensaje
    List1.AddItem "yo" & ": " & enviar 'Imprimimos en nuestra propia pantalla el mensaje enviado
    Text2.Text = ""
  Else
    MsgBox ("Error, al enviar mensaje") 'Se manda un mensaje de error si la conexión no está establecida
  End If
End Sub

Private Sub Form_Load()
  Text1.Text = Winsock1.LocalIP 'Obtenemos nuestra propia IP
End Sub

Private Sub Timer1_Timer()
  If Winsock1.State = 7 Then 'Si la conexión está establecida
    Command1.Caption = "Desconectar"
  End If
  If Winsock1.State = 0 Then 'Si la conexión está cerrada
    Command1.Caption = "Conectar"
  End If
  If List1.ListCount > 0 Then
    List1.ListIndex = List1.ListCount - 1 'Se selecciona el último mensaje recibido
  End If
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  Dim datos As String
  Winsock1.GetData datos 'Obtenemos los datos que haya enviado el servidor
  List1.AddItem "Servidor: " & datos 'Ponemos en pantalla el mensaje recibido
End Sub
Crea un nuevo formulario, que se llamará “cliente2”, y haz lo mismo que en el cliente1.

Ahora procedemos a ejecutar nuestro programa, y se debe ver de la siguiente manera:



Te recordamos que este y otros códigos fuente, los puedes obtener de: 

No hay comentarios.:

Publicar un comentario

 
Blogger Templates