Vous êtes sur la page 1sur 12

S. E. P. T.N.M.

INSTITUTO TECNOLÓGICO DE ORIZABA

DEPARTAMENTO DE INGENIERÍA
ELÉCTRICA-ELECTRÓNICA
(ÁREA ELECTRÓNICA)

LABORATORIO DE ASIGNATURA: Control distribuido y SCADA


GRUPO: 8e8B
PRÁCTICA No. 3 Mini proyecto con WinSock
EQUIPO No. 3

INTEGRANTES:
Garces Orozco Jose Abel
Martínez Hernández Jose Daniel
Pastelin Morales Israel

Vo. Bo. M. C. Quintana Silva Juan Antonio


Fecha de realización: 30 de marzo de 2019
Fecha de entrega de reporte: 8 de abril de 2019
Competencia específica:

El alumno obtendrá el conocimiento y la habilidad de poder crear interfaces de Cliente/Servidor para


chats entre dos o más computadoras, además de programar cada uno de los aspectos físicos que
esta interfaz conlleva para su correcto funcionamiento.

PRE REPORTE:
Marco teórico:

El control Winsock, invisible para el usuario, proporciona un acceso sencillo a los servicios de red
TCP y UDP. Pueden usarlo los programadores de Microsoft Access, Visual Basic, Visual C++ o Visual
FoxPro. Para escribir aplicaciones de servidor o de cliente no necesita comprender los detalles de
TCP ni llamar a las API de Winsock de nivel inferior. Si establece las propiedades y llama a los
métodos del control, podrá conectar fácilmente con un equipo remoto e intercambiar datos en las dos
direcciones.
Conceptos básicos de TCP
El Protocolo de control de transferencia (TCP) le permite crear y mantener una conexión con un
equipo remoto. Mediante la conexión, ambos equipos pueden intercambiar datos entre sí. Si está
creando una aplicación de cliente, debe saber el nombre del equipo servidor o su dirección IP
(propiedad RemoteHost), así como el puerto (propiedad RemotePort) en el que está "escuchando".
Después, llame al método Connect.
Si está creando una aplicación de servidor, establezca el puerto (propiedad LocalPort) en el que
escuchar y llame al método Listen. Cuando el equipo cliente solicite una conexión, se producirá el
evento ConnectionRequest. Para completar la conexión, llame al método Accept del evento
ConnectionRequest.
Una vez establecida la conexión, los equipos pueden enviar y recibir datos. Para enviar datos, llame
al método SendData. Siempre que se reciben datos, se produce el evento DataArrival. Llame al
método GetData del evento DataArrival para recuperar los datos.
Conceptos básicos de UDP
El Protocolo de datagramas de usuarios (UDP) es un protocolo sin conexiones. A diferencia de las
operaciones de TCP, los equipos no establecen una conexión. Asimismo, una aplicación UDP puede
ser cliente o servidor.
Para transmitir datos, establezca primero la propiedad LocalPort del equipo cliente. El equipo servidor
sólo necesita establecer RemoteHost a la dirección de Internet del equipo cliente y la propiedad
RemotePort al mismo puerto que la propiedad LocalPort del equipo cliente, y llamar al método
SendData para comenzar a enviar mensajes. Después, el equipo cliente utiliza el método GetData del
evento DataArrival para recuperar los mensajes enviados.
MATERIAL Y EQUIPO:

 3 Juego cables UTP para ETHERNET


 1 HUB o ROUTER
 3 Computadoras personales

DESARROLLO:

Para llevar a cabo el mini proyecto de conectar un servidor con dos clientes y poder tener un chat entre ellos,
tomando en cuenta algunos puntos a cumplirse en ella, como por ejemplo que el cliente 1 no pueda ver la
información que se le envía al cliente 2, se tomaron los conocimientos adquiridos de la practica 1, 2 y 3 de la
unidad 1 de CDySCADA, donde ya se tenía la comunicación Cliente/Servidor.

Se requirió añadir comandos en el código del Servidor para que se pudieran tener más de dos conexiones de
Clientes, aceptando cada una de las solicitudes hechas al servidor para comunicarse entre ellos, también se le
anexaron detalles extras como el reconocimiento del Cliente, esto para saber quién lo envía y hacia quien se
dirige, por lo que mostramos a continuación el código del Servidor debidamente comentado para comprender
la función de cada bloque de comandos realizados en la programación de las interfaces.

Código del Servidor

-------------*--------------------*-------------------*--------------------*--------------------*----------------------*-------------------*-

Private Function NuevoSocket() As Integer


Dim numElementos As Integer
Dim i As Integer ' creo una variable
numElementos = Winsock2.UBound 'comparo con un winsock2
For i = 0 To numElementos 'recorr el arreglo
If Winsock2(i).State = sckClosed Then 'retornamos un arreglo
NuevoSocket = i
Exit Function
End If
Next
Load Winsock2(numElementos + 1) 'cargamos y almacenamos y aumentamos un 1porconexion
NuevoSocket = Winsock2.UBound ' devuelve al inicio
End Function
Private Sub Cliente1_Click()
Winsock2(1).SendData TxtMensaje.Text & vbCrLf ''para enviar un mensaje al cliente 1
End Sub
Private Sub Cliente2_Click()
''para enviar un mensaje al cliente 2
Winsock2(1).SendData TxtMensaje.Text & vbCrLf
Winsock2(2).SendData TxtMensaje.Text & vbCrLf
End Sub
Private Sub CmdBorrar_Click()
'' programamos un boton para borrar todo lo que estan en los txt
TxtPanel.Text = ""
TxtMensaje.Text = ""
End Sub
Private Sub CmdDesconectar_Click()
Winsock1.Close
TxtPanel.SelStart = Len(TxtPanel.Text)
TxtPanel.Text = TxtPanel.Text & " conexion cerrada " & vbCrLf
TxtPanel.SelStart = Len(TxtPanel.Text)
End Sub
Private Sub cmdEnviar_Click()
Dim numElementos As Integer
Dim i As Integer
numElementos = Winsock2.UBound
For i = 0 To numElementos
If Winsock2(i).State = sckConnected Then
Winsock2(i).SendData TxtMensaje.Text & vbCrLf
TxtPanel.SelStart = Len(TxtPanel.Text)
TxtPanel.Text = TxtPanel.Text & " Cliente " & i & ">" & TxtMensaje.Text & vbCrLf
TxtPanel.SelStart = Len(TxtPanel.Text)
End If
Next
TxtMensaje.Text = ""
End Sub
Private Sub CmdEscuchar_Click()
Winsock2(0).Close ' cerrar el procesp 0
Winsock2(0).LocalPort = TxtPuerto.Text ' escribir el número del puerto seleccionado
Winsock2(0).Listen ' escuchar
TxtPanel.SelStart = Len(TxtPanel.Text) ' escribir en el panel de texto
TxtPanel.Text = TxtPanel.Text & "**escuchar conexion.(Puerto" & TxtPuerto.Text & ")" & vbCrLf ' escribir la
palabra escuchar dispuesto el puerto y la IP
TxtPanel.SelStart = Len(TxtPanel.Text) ' escribir de una forma
End Sub
Private Sub CmdSonido_Click()
Me.WindowsMediaPlayer1.URL = "C:\Users\IsraelPM\Downloads\ClarodeLuna.mp3" 'poniendo musica
End Sub
Private Sub Form_Load()
BackColor = vbBlack 'ponerle color a nuestro panel
End Sub
Private Sub Winsock1_Close()
Winsock2(0).Close '' cerrarmos por un momento el socket
TxtPanel.SelStart = Len(TxtPanel.Text) ''escribir de forma
TxtPanel.Text = TxtPanel.Text & " conexion cerrada por el cliente " & vbCrLf ' escribir la palabra escuchar
dispuesto el puerto y la IP
TxtPanel.SelStart = Len(TxtPanel.Text)
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
TxtPanel.SelStart = Len(TxtPanel.Text) ' escribir en el panel de texto
TxtPanel.Text = TxtPanel.Text & "**peticion numero" & requestID & vbCrLf 'petición en número y su respuesta
ID
TxtPanel.SelStart = Len(TxtPanel.Text) ' escribir en el panel de texto
Winsock2(0).Close ''cerrar por un momento el socket
Winsock2(0).Accept requestID '' acceptar con la IP
TxtPanel.SelStart = Len(TxtPanel.Text) ''escribir en el panel de texto
TxtPanel.Text = TxtPanel.Text & "**conexion aceptada" & vbCrLf 'petición en número y su respuesta ID
TxtPanel.SelStart = Len(TxtPanel.Text)
End Sub
'Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
'Dim Buffer As String
'Winsock1.GetData Buffer
'TxtPanel.SelStart = Len(TxtPanel.Text)
'TxtPanel.Text = TxtPanel.Text & " cliente> " & Buffer
'TxtPanel.SelStart = Len(TxtPanel.Text)
'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)
Winsock2(0).Close
MsgBox "Error numero " & Number & ": " & Description, vbCritical ''mandar el mensaje de un error y el
numero
End Sub
Private Sub Winsock2_Close(Index As Integer)
Winsock2(Index).Close '' cerrar por un momento el socket
TxtPanel.SelStart = Len(TxtPanel.Text) 'escribir en el panel de texto
TxtPanel.Text = TxtPanel.Text & " se ha ido: " & Winsock2(numSocket).RemoteHostIP & vbCrLf ' cuando se
vaya el usuario marque se desconectó y que se fue la IP que se desconecto
TxtPanel.SelStart = Len(TxtPanel.Text) 'escribir en el panel de texto
End Sub
Private Sub Winsock2_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Dim numSocket As Integer 'crear una variable
TxtPanel.SelStart = Len(TxtPanel.Text) ''escribir en el panel de texto
TxtPanel.Text = TxtPanel.Text & "**IP:" & Winsock2(numSocket).RemoteHostIP & vbCrLf 'cuando se conecte
mencione la IP
TxtPanel.SelStart = Len(TxtPanel.Text) 'escribir en el panel de texto
numSocket = NuevoSocket ' iguala la variable y la almacena en una nueva
Winsock2(numSocket).Accept requestID '' requiere id
TxtPanel.SelStart = Len(TxtPanel.Text) 'escribir en el panel de texto
TxtPanel.Text = TxtPanel.Text & "**conexion aceptada" & vbCrLf 'ya de ser aceptado y almacenado escribí que
la conexión fue aceptada
TxtPanel.SelStart = Len(TxtPanel.Text) 'escribir en el panel de texto
End Sub
Private Sub Winsock2_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim Buffer As String '' crear un almacenamiento llamado buffer
Dim A As String ''crear una variable A
Dim nombre As String ''çrear una variable nombre
Dim o As String ''çrear una variable o
Dim b As String ''çrear una variable b
Winsock2(Index).GetData Buffer ' obtener e mensaje y almacenarlo en la variable buffer
TxtCliente.SelStart = Len(TxtCliente.Text) ''escribir en el panel de texto
TxtCliente.Text = TxtCliente.Text & Buffer & vbCrLf ''almacenar el mensaje en el cuadro de texto Client
TxtCliente.SelStart = Len(TxtCliente.Text) ''escribir en el panel de texto
For l = 1 To Len(TxtCliente.Text) ''mediante el for nos permite conocer la cantidad de caracteres
o = LCase(Mid(TxtCliente.Text, l, 1)) '' almacenar el texto y conocer con una longitud de la primera letra
If (o = "ñ") Then '' cuando este la letra ñ haga la funcion
Winsock2(2).SendData TxtCliente.Text & vbCrLf ''mandar el mensaje al cliente2
Else
A = LCase(Mid(TxtCliente.Text, l, 1)) '' almacenar el texto y conocer con una longitud de la primera letra
If (A = "c") Then '' cuando este la letra A haga la función
Winsock2(1).SendData TxtCliente.Text & vbCrLf ''mandar el mensaje al cliente2
Else
b = LCase(Mid(TxtCliente.Text, l, 1)) '' almacenar el texto y conocer con una longitud de la primera
letra
If (b = "s") Then '' cuando este la letra b haga la funcion
TxtPanel.Text = TxtPanel.Text & " cliente " & Index & " >:" & Buffer & vbCrLf ''escribir cuando llegue un
mensaje al servidor
Else
End If
End If
End If
Next
TxtCliente.Text = " " '' borrar el txtclient
' aqui esta cuando recibo mensajes
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)
Winsock2(Index).Close '' mantener cerrado un momento el puerto
MsgBox "Error numero " & Number & ": " & Description, vbCritical '' mandar un mensaje de erroren el puerto
End Sub
*-------------*------------*-------------*-------------*--------------*-------------*-------------*---------------*------------*-----------*-
Código cliente 1 y 2
En esta parte de código, podremos borrar lo que se encuentre en la caja de texto llamado, txtOutput y txtSend,
las comillas sirven para poder borrar
'para poder borrrar
Private Sub borrar_Click()
txtOutput.Text = ""
txtSend.Text = ""
End Sub
En esta parte, hemos creado un menú, el cual tiene una parte donde mandamos un mensaje al cliente 2, el cual
funciona de esta menara:
Se declara una variable x, la cual entra en función al dar clic en la opción cliente 1, después concatenamos, la
letra ñ, la cual sirve para que el servidor sepa que ese mensaje va para el cliente 2; lo que tenga la caja de texto
txtSend, y la palabra ABEL, el cual, sirve para que el cliente 2 sepa que ese mensaje proviene de dicho usuario.
'Enviar desde menú al otro cliente Daniel
Private Sub Cliente1_Click()
Dim x As String
x = "ñ" & "" & txtSend.Text & "" & ":ABEL"
tcpClient.SendData x
End Sub
En esta parte, realizamos la conexión, para que solo tengamos la opción de enviar una vez, ponemos en
verdadero el botón de enviar al dar click se pone en falso, y el botón de desconectar se pone en verdadero. Del
mismo modo enciende un foco indicador de conexión. Con la opción .Connect, como lo dice su nombre,
conecta.
'Para conectar
Private Sub cmdConnect_Click()
' Invoca el método Connect para iniciar
'una conexión.
tcpClient.Connect
Foco.FillColor = &HFF&
cmdConnect.Enabled = False
desconectar.Enabled = True
'indicador.Caption = tcpClient.RemoteHost 'para ver dirección crear un label o texbox
End Sub
Aquí, realizamos la acción inversa, desconectamos, usando la misma lógica para conectar.
'para desconectar
Private Sub desconectar_Click()
tcpClient.Close
Foco.FillColor = &HE0E0E0
cmdConnect.Enabled = True
desconectar.Enabled = False
End Sub
Esta parte, podemos decir que es la primera funciona al correr el programa, vemos que tenemos el botón de
desconectar en falso, esto para que el usuario primero se conecte.
Igual, al correr el programa, damos la dirección IP a la cual nos vamos a conectar, y también el puerto, el cual
es 1001 siempre en este programa
'para poder saber a dónde conectarme
Private Sub Form_Load()
desconectar.Enabled = False
BackColor = vbvrown
' El nombre del control Winsock es tcpClient.
' Nota: para especificar un host remoto, puede usar
' la dirección IP (como "121.111.1.1") o
' el nombre "descriptivo" del equipo, como se muestra aquí.
tcpClient.RemoteHost = "192.168.1.114"
tcpClient.RemotePort = 1001
End Sub
En esta parte de código, del mismo menú creado, tenemos la opción de salir, ya sea desde el menú o el botón
que se ve en la interfaz, la opción Beep y End es la que nos ayuda para salir
'para poder salir desde menú
Private Sub Salir__Click()
Beep
End
End Sub
'para poder salir, se puede dando clic o scape
Private Sub salir_Click()
Beep
End
End Sub
'mandar desde menú Servidor
Tenemos aquí el envío de mensaje hacia el servidor, es la misma logica para enviar al cliente 2, solo que para
que el servidor sepa que el mensaje es para él, colocamos la letra “s”, concatenado con lo que se tenga en
txt.Send y la palabra ABEL, para saber el destinario del mensaje
Private Sub servidor_Click()
Dim y As String
y = "s" & "" & txtSend.Text & "" & ":ABEL"
tcpClient.SendData y
End Sub
Al final, vemos que que declaramos una variable, llamada strData, el cual es quien va a recibir los mensajes,
con la opcion .GetData, y los direccionamos a la caja de texto txtOutput
'enviar y recibir datos
Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
tcpClient.GetData strData
txtOutput.Text = strData
End Sub

Hasta aquí tenemos el código de cliente 1, el código cliente 2 es lo mismo solo cambiamos la parte donde
mandamos el mensaje para el cliente siguiente.
En la siguiente figura se nos presenta la interfaz de cliente 1
Figura 1 Interfaz Del Cliente 1

Figura 2 Interfaz del Cliente 2


Conclusiones:

En esta práctica se hizo el uso de los conocimientos adquiridos en las prácticas 1 y 2, ya que se
necesitó la conexión entre dos computadoras a través de un router, medio por el cual se
comunicaban las computadoras. Para que esto se llevara a cabo se utilizó una herramienta llamada
WinSock, esta herramienta es de amplio uso ya que nos permite crear una interfaz Servidor/Cliente y
nos da la facilidad de ingresar, modificar, y postular cada uno de los botones y ventanas de textos,
esto para el uso de cada interfaz.
Al concluir esta práctica, el alumno se preparó para un proyecto futuro, un chat de 3, un servidor y
dos clientes, considerado que tenemos que estudiar más, para tener un resultado satisfactorio. La
herramienta utilizada, es de gran ayuda para la realización de prácticas en el futuro, comprender más,
y desarrollar nuestra imaginación para múltiples aplicaciones
Bibliografía:
WinSock_Control.pdf

http://www.mileti.com.ar/winsock.html

Vous aimerez peut-être aussi