Sistema Operativos
Enviado por Ilhan • 6 de Marzo de 2012 • 4.551 Palabras (19 Páginas) • 287 Visitas
El Servidor
Propiedades
PuertoDeEscucha() As String
Establece/devuelve el puerto donde se quiere que el servidor quede “escuchando”.
Métodos
Escuchar()
Inicia el proceso de escuchar peticiones de conexión de parte de los clientes, en el puerto establecido en la propiedad PuertoDeEscucha.
ObtenerDatos(ByVal IDCliente As Net.IPEndPoint) As String
Obtiene los últimos datos enviados por el cliente especificado.
Cerrar(ByVal IDCliente As Net.IPEndPoint)
Cierra la conexión con el cliente especificado.
Cerrar()
Cierra todas las conexiones abiertas con los clientes.
EnviarDatos(ByVal IDCliente As Net.IPEndPoint, ByVal Datos As String)
Envía un mensaje al cliente especificado.
EnviarDatos(ByVal Datos As String)
Envía un mensaje a todas los clientes.
Eventos
NuevaConexion(ByVal IDTerminal As Net.IPEndPoint)
Se produce cuando un Cliente se conecta al Servidor, y nos devuelve un ID, para que podamos identificarlo mas tarde.
DatosRecibidos(ByVal IDTerminal As Net.IPEndPoint)
Se produce cuando un Cliente nos envía un mensaje. Para obtener los datos recibidos, usaremos el método ObtenerDatos pasándole como parámetro el ID del cliente.
ConexionTerminada(ByVal IDTerminal As Net.IPEndPoint)
Nos avisa que se ha cerrado la conexión con el Cliente recibido como parámetro.
El Cliente
Propiedades
IPDelHost() As String
Establece/devuelve la dirección IP (o el nombre DNS) del equipo donde se encuentra el objeto de la clase Servidor.
PuertoDelHost() As String
Establece/devuelve el numero de puerto en el que estará escuchando el objeto de la clase Servidor al cual nos queremos conectar.
Métodos
Conectar()
Permite conectarse al objeto Servidor que se encuentra escuchando en la dirección especificada por la propiedad IPDelHost en el puerto establecido en la propiedad PuertoDelHost.
EnviarDatos(ByVal Datos As String)
Envía un mensaje al objeto de la clase Servidor a la que se este conectado.
Eventos
ConexionTerminada()
Se produce cuando se termina la conexión con el objeto Servidor.
DatosRecibidos(ByVal Datos As String)
Nos avisa que el servidor nos ha enviado un mensaje, y el mismo se encuentra en el parámetro “Datos”.
Al fin, ahora si llego la hora de ver código… empecemos.
Código de la clase Servidor
Imports System
Imports System.Threading
Imports System.Net.Sockets
Imports System.IO
Imports System.Text
Public Class WinSockServer
#Region "ESTRUCTURAS"
Private Structure InfoDeUnCliente
'Esta estructura permite guardar la información sobre un cliente
Public Socket As Socket 'Socket utilizado para mantener la conexion con el cliente
Public Thread As Thread 'Thread utilizado para escuchar al cliente
Public UltimosDatosRecibidos As String 'Ultimos datos enviados por el cliente
End Structure
#End Region
#Region "VARIABLES"
Private tcpLsn As TcpListener
Private Clientes As New Hashtable() 'Aqui se guarda la informacion de todos los clientes conectados
Private tcpThd As Thread
Private IDClienteActual As Net.IPEndPoint 'Ultimo cliente conectado
Private m_PuertoDeEscucha As String
#End Region
#Region "EVENTOS"
Public Event NuevaConexion(ByVal IDTerminal As Net.IPEndPoint)
Public Event DatosRecibidos(ByVal IDTerminal As Net.IPEndPoint)
Public Event ConexionTerminada(ByVal IDTerminal As Net.IPEndPoint)
#End Region
#Region "PROPIEDADES"
Property PuertoDeEscucha() As String
Get
PuertoDeEscucha = m_PuertoDeEscucha
End Get
Set(ByVal Value As String)
m_PuertoDeEscucha = Value
End Set
End Property
#End Region
#Region "METODOS"
Public Sub Escuchar()
tcpLsn = New TcpListener(PuertoDeEscucha)
'Inicio la escucha
tcpLsn.Start()
'Creo un thread para que se quede escuchando la llegada de un cliente
tcpThd = New Thread(AddressOf EsperarCliente)
tcpThd.Start()
End Sub
Public Function ObtenerDatos(ByVal IDCliente As Net.IPEndPoint) As String
Dim InfoClienteSolicitado As InfoDeUnCliente
'Obtengo la informacion del cliente solicitado
InfoClienteSolicitado = Clientes(IDCliente)
ObtenerDatos = InfoClienteSolicitado.UltimosDatosRecibidos
End Function
Public Sub Cerrar(ByVal IDCliente As Net.IPEndPoint)
Dim InfoClienteActual As InfoDeUnCliente
'Obtengo la informacion del cliente solicitado
InfoClienteActual = Clientes(IDCliente)
'Cierro la conexion con el cliente
InfoClienteActual.Socket.Close()
End Sub
Public Sub Cerrar()
Dim InfoClienteActual As InfoDeUnCliente
'Recorro todos los clientes y voy cerrando las conexiones
For Each InfoClienteActual In Clientes.Values
Call Cerrar(InfoClienteActual.Socket.RemoteEndPoint)
Next
End Sub
Public Sub EnviarDatos(ByVal IDCliente As Net.IPEndPoint, ByVal Datos As String)
Dim Cliente As InfoDeUnCliente
'Obtengo la informacion del cliente al que se le quiere enviar el mensaje
Cliente = Clientes(IDCliente)
'Le envio el mensaje
Cliente.Socket.Send(Encoding.ASCII.GetBytes(Datos))
...