Hola, a ver si alguien me puede ayudar, he seguido este manual al pie de la letra, pero no he conseguido que funcione, ya que está exactamente igual, pero me dice al intentar conectar, que se requiere un objeto, y no se qué puede ser. Os pongo el manual, y después os pongo el código tanto del cliente, como del servidor.
MANUAL
//////////////////////////////////////////////////////////
Comenzando a programar con WinSock Control.
Protocolos TCP/IP y UDP
Como anteriormente quedó aclarado dos programas se pueden conectar entre sí a través de internet o de una LAN.
Internet usa el protocolo TCP/IP que significa “Transmision Control Protocol / Internet Protocol”, es el que se encarga de recibir paquetes de información y redirigirlos al usuario final que los solicitó. Este protocolo es el preferido por todos ya que posee una característica que UDP le envidia, TCP/IP puede verificar que el paquete de información haya llegado con éxito al destinatario final, concretando así la transacción.
Por el contrario UDP no puede hacer esto, solo manda el paquete con la información y no verifica que haya llegado satisfactoriamente, poniendo de esta manera en peligro al paquete, ya que puede no llegar entero al destinatario y por lo tanto no sirve si el paquete no llega en su totalidad.
Todas las máquinas que están conectadas a Internet tienen asignadas un número que se forma con 4 cifras de 3 dígitos (que no pueden superar al número 255). Ejemplo del IP máximo que se puede encontrar: 255.255.255.255
Propiedades, métodos y eventos de WinSock.
Una vez que tenemos el WinSock control en nuestra barra de controles en Visual Basic ya podemos comenzar a ver las propiedades, eventos y métodos más importantes del control. Para agregarlo manualmente ir a Proyecto> Componentes> y luego seleccionar WinSock Control y Aceptar. Como mencionamos anteriormente este control no es visible en tiempo de ejecución.
Primero abrimos un proyecto (EXE Estándar) y colocamos en control en cualquier parte del formulario. Vamos a comenzar por ver las propiedades, estas pueden ser puestas en tiempo de diseño como también en tiempo de ejecución. A continuación las propiedades más importantes;
Lista de propiedades más importantes_________________________________________
LocalIP: Devuelve la dirección IP de la máquina local en el formato de cadena con puntos de dirección IP (xxx.xxx.xxx.xxx).
LocalHostName: Devuelve el nombre de la máquina local.
RemoteHost: Establece el equipo remoto al que se quiere solicitar la conexión.
LocalPort: Establece el puerto que se quiere dejar a la escucha.
RemotePort: Establece el número del puerto remoto al que se quiere conectar.
State: Verifica si el Control WinSock esta siendo utilizado o no.
Estas son algunas de las propiedades más importantes, y a continuación la sintaxis de cada propiedad.
Objeto.Propiedad = Valor
Donde Objeto va el nombre del Control WinSock, el nombre predeterminado cuando lo incluimos en alguna aplicación es “WinSock1”. Luego le sigue la propiedad que deseamos asignar y finalmente el valor que la misma tomará.
Entonces por ejemplo si queremos probar la propiedad LocalIP debemos seguir el ejemplo 1.
Ejemplo 1_________________________________________________________________
Crear un Proyecto (EXE Estándar) y agregar el WinSock Control. Luego agregar una etiqueta vacía, es decir un Label. Despues introducimos el siguiente código.
Private Sub Form_Load()
Label1.caption = WinSock1.LocalIP
End Sub
Este simple ejemplo nos da de forma rápida nuestro IP, aunque no estemos conectados a Internet el IP aparece igual, solo que siempre va a tomar el valor : 127.0.0.1
Ahora que sabemos manejar las propiedades podemos seguir con los Métodos. A continuación la lista de algunos de los Métodos más importantes del Control WinSock.
Lista de Métodos más importantes____________________________________________
Accept: Sólo para las aplicaciones de servidor TCP. Este método se utiliza para aceptar una conexión entrante cuando se está tratando un evento ConnectionRequest.
GetData: Recupera el bloque actual de datos y lo almacena en una variable de tipo Variant.
Listen: Crea un socket y lo establece a modo de escucha.
SendData: Envía datos a un equipo remoto.
Lista de Eventos más importantes____________________________________________
ConnectionRequest: Se produce cuando el equipo remoto solicita una conexión. Sin este evento no se puede llevar a cabo la conección.
Connect: Se produce cuando el equipo local se conecta al equipo remoto y se establece una conexión.
Close: Se produce cuando el equipo remoto cierra la conexión. Las aplicaciones deben usar el método Close para cerrar correctamente una conexión TCP.
DataArrival: Se produce cuando llegan nuevos datos. Este evento es importante, ya que debemos hacer algo con la información que llega.
La sintaxis de los métodos y eventos es igual a la sintaxis de las propiedades, por lo cual no vamos a hacer referencia a ella.
Programando la primera aplicación Cliente/Servidor.
Conociendo las propiedades, métodos y eventos del Control WinSock podemos pasar a la engorrosa labor de la programación.
Para poder programar la siguiente aplicación necesitan tener el Control WinSock en el formulario, eso siempre es fundamental para que el programa ande.
Para enterder el correcto funcionamiento del protocolo TCP/IP vamos a empezar por programar la aplicación Servidor a la cual luego se conectará el Cliente.
Comenzamos por crear un proyecto nuevo (EXE estándar) para el Servidor, y agregamos la siguiente lista de controles al formulario principal. La ubicación de dichos controles es a gusto del programador, siempre tratando de que el usuario final este a gusto con el producto y que se pueda manejar libremente sin problemas por el entorno del mismo.
- WinSock Control
- 2 cajas de texto (TextBox)
- 2 botones.
A continuación hace falta que cambiemos algunas propiedades de los controles, debajo la lista de controles con las respectivas propiedades a cambiar.
Control (nombre predeterminado) Propiedad (nuevo valor)
WinSock1 LocalPort = 888
Text1 Text =
Text2 Text =
Command1 Caption = “Escuchar”
Command2 Caption = “Enviar”
Para que el ejemplo funcione a la perfección conviene que seguir la ubicación de los controles como esta indicado en la figura 1.
Figura 1
Una vez hecho esto podemos empezar a tipear código. El sangrado del programa es una cuestión de entendimiento para el programador, algunos recurren a éste como otros no, eso también queda a criterio del que programa.
En el Evento Click del Command1 incluimos el siguiente código; (sólo lo que esta en NEGRITA, el resto es en modo de ayuda, ya que aparece cuando se hace doble click en algun control).
Private Sub Command1_Click()
Winsock1.Listen
End Sub
Esto hace que el Control WinSock empiece a funcionar, escuchando el puerto que se indicó en las propiedades de dicho control. Este puerto es el 888. Ahora si realizamos todo a la perfección el puerto 888 esta siendo vigilado para aceptar conexiones remotas.
Luego en el Evento DataArrival del WinSock;
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim datos As String
Winsock1.GetData datos
Text1.Text = Text1.Text + datos
End Sub
Datos queda transformada en una variable de cadena, y WinSock almacena los datos que recibe del Cliente en el buffer y luego ingresan a la variable datos, dicha variable mostrará su contenido en el control TextBox (Text1).
En el evento ConnectionRequest;
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Winsock1.Close
Winsock1.Accept requestID
End Sub
Este evento es muy importante, permite aceptar la petición de conexión. Sin este evento el resto del programa no tendría efecto.
En el evento Click del command2;
Private Sub Command2_Click()
Dim enviar As String
enviar = Text2.Text
Winsock1.SendData enviar
End Sub
Esto permite enviar el texto que se introduzca en el TextBox número 2.
Por ahora este es un simple programa Servidor, lo que hace es: designar un puerto, dejarlo a la escucha para aceptar conexiones, si se realiza una petición de conexión aceptarla, y por último enviar datos al Cliente y recibir los datos que éste mande.
Para seguir programando el Cliente hace falta crear un nuevo proyecto y en el formulario principal incluir la siguiente lista de controles:
- WinSock Control
- 3 cajas de texto (TextBox)
- 2 botones.
Como lo hicimos anteriormente hace falta cambiar algunas propiedades. Debajo la lista de controles con las respectivas propiedades para cambiar.
Control (nombre predeterminado) Propiedad (nuevo valor)
WinSock1 RemotePort = 888
Text1 Text =
Text2 Text =
Text3 Text =
Command1 Caption = “Conectar”
Command2 Caption = “Enviar”
Para tener una referencia de cómo situar los controles conviene seguir la Figura 2.
Figura 2
En el método del command1;
Private Sub Command1_Click()
Winsock1.RemoteHost = Text3.Text
Winsock1.Connect
End Sub
El evento connect permite conectar al programa servidor que esta esperando la solicitud, este evento requiere un parámetro fundamental, el IP o nombre de host el cual es introducido previamente a la conexión en el cuadro de texto número 3 (Text3).
En el evento DataArrival del WinSock Control;
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim datos As String
Winsock1.GetData datos
Text1.Text = Text1.Text + datos
End Sub
Esto permite a la aplicación (a través de WinSock) recibir información del servidor y mostrarla en pantalla.
En el método del command2;
Private Sub Command2_Click()
Dim enviar As String
enviar = Text2.Text
Winsock1.SendData enviar
End Sub
Estas instrucciones son necesarias para enviar información al servidor.
Este ejemplo del primer programa Cliente / Servidor es muy simple, para utilizarlo al máximo es necesario por ejemplo poner las propiedades de los TextBox en Multiline, lo que hace que si los datos recibidos exceden el tamaño del TextBox estos datos vayan directo a la línea de abajo.
//////////////////////////////////////////////////////////
CÓDIGO CLIENTE
Private Sub Command1_Click()
Winsock1.RemoteHost = Text3.Text
Winsock1.Connect
End Sub
Private Sub Command2_Click()
Dim enviar As String
enviar = Text2.Text
Winsock1.SendData enviar
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim datos As String
Winsock1.GetData datos
Text1.Text = Text1.Text + datos
End Sub
CÓDIGO SERVIDOR
Private Sub Command1_Click()
Winsock1.Listen
End Sub
Private Sub Command2_Click()
Dim enviar As String
enviar = Text2.Text
Winsock1.SendData enviar
End Sub
Private Sub Form_Load()
Label1.Caption = Winsock1.LocalIP
End Sub
Private Sub winsock1_Dataarrival(ByVal bytesTotal As Long)
Dim datos As String
Winsock1.GetData datos
Text1.Text = Text1.Text + datos
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Winsock1.Close
wincsock1.Accept requestID
End Sub
A ver si alguien puede saber qué es, gracias