Ayuda con una DLL (sock servidor y sock cliente)

15/02/2007 - 15:44 por Paul P. Garcia | Informe spam
Saludos.

Intento comprender la funcionalidad de un pequeño ejemplo sobre la creacion
de un sock (
http://www.elguille.info/colabora/p...sVBNET.htm )

No logro comprender el porque la llega de datos solo funciona con un MsgBox
y no haci con un TextBox:
Private Sub WinsockCliente_DatosRecibidos(ByVal datos As String) Handles
WinSockCliente.DatosRecibidos
MsgBox(datos) 'Esto funciona bien
End Sub

Private Sub WinsockCliente_DatosRecibidos(ByVal datos As String) Handles
WinSockCliente.DatosRecibidos
TextBox1.Text = datos 'TextBox1 nunca obtiene los datos, me pueden decir
porque
End Sub

El mismo proble ocurre en el Sock Servidor, al parecer solo funciona con
MsgBox.
Como se puede soluccionar este problema???

Espero me puedan ayudar
Estoy con WinXP prof sp2 VisualBasic 2005 express
Para agregar mi DLL debo ir menu "Proyecto >Agregar referencia > dentro de
la carpeta bin>Release o obj>Release ???

Luego en el form
Inherits System.Windows.Forms.Form
Dim WithEvents WinsockServer As New Servidor.WinSockServer


[sckCliente DLL]
Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
Imports System.Text
Imports System.IO

Public Class Cliente
#Region "Variable"
Private Stm As Stream 'Utilizado para enviar datos al servidor y recibr
datos
Private m_IPDelHost As String 'Direccion del objeto de la clase Servidor
Private m_PuertoDelHost As String
#End Region
#Region "Eventos"
Public Event ConexionTerminada()
Public Event DatosRecibidos(ByVal Datos As String)
'Public Event Connect()
'Public Event eError(ByVal Number As Integer, ByVal Description As String,
ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal
HelpContext As Long, ByVal CancelDisplay As Boolean)
#End Region
#Region "Propiedades"
Public Property IPDelHost() As String
Get
IPDelHost = m_IPDelHost
End Get
Set(ByVal Value As String)
m_IPDelHost = Value
End Set
End Property
Public Property PuertoDelHost() As String
Get
PuertoDelHost = m_PuertoDelHost
End Get
Set(ByVal Value As String)
m_PuertoDelHost = Value
End Set
End Property
#End Region
#Region "Metodos"
Public Sub Conectar()
Dim tcpClnt As TcpClient
Dim tcpThd As Thread 'Escucha mensajes

tcpClnt = New TcpClient()
tcpClnt.Connect(IPDelHost, PuertoDelHost)
Stm = tcpClnt.GetStream()
'Creo e inicio un thread para que escuche los mensajes enviados por el
servidor
tcpThd = New Thread(AddressOf LeerSocket)
tcpThd.Start()
End Sub

Public Sub EnviarDatos(ByVal Datos As String)
Dim BufferDeEscritura() As Byte

BufferDeEscritura = Encoding.ASCII.GetBytes(Datos)

If Not (Stm Is Nothing) Then
Stm.Write(BufferDeEscritura, 0, BufferDeEscritura.Length)
End If
End Sub
#End Region

#Region "Funciones privadas"
Private Sub LeerSocket()
Dim BufferDeLectura() As Byte

While True
Try
BufferDeLectura = New Byte(100) {}
'Me quedo esperando a que llegue algun mensaje
Stm.Read(BufferDeLectura, 0, BufferDeLectura.Length)
'Genero el evento Arrival, ya que se han recibidos datos
RaiseEvent DatosRecibidos(Encoding.ASCII.GetString(BufferDeLectura))
Catch ex As Exception
Exit While
End Try
End While
'Finalizo la conexion, por lo tanto genero el evento correspondiente
RaiseEvent ConexionTerminada()
End Sub
#End Region
End Class
[/sckCliente DLL]

[sckServidor DLL]
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 informacion sobre un cliente
Public Socket As Socket
Public Thread As Thread
Public UltimosDatosRecibidos As String
End Structure
#End Region
#Region "Variables"
Private tcpLsn As TcpListener
Private Clientes As New Hashtable()
Private tcpThd As Thread
Private IDClienteActual As Net.IPEndPoint
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)
tcpLsn.Start()

tcpThd = New Thread(AddressOf EsperarCliente)
tcpThd.Start()
End Sub
Public Function ObtenerDatos(ByVal IDCliente As Net.IPEndPoint) As String
Dim InfoClienteSolicitado As InfoDeUnCliente

InfoClienteSolicitado = Clientes(IDCliente)
ObtenerDatos = InfoClienteSolicitado.UltimosDatosRecibidos
End Function
Public Sub Cerrar(ByVal IDCliente As Net.IPEndPoint)
Dim InfoClienteActual As InfoDeUnCliente

InfoClienteActual = Clientes(IDCliente)
InfoClienteActual.Socket.Close()
End Sub
Public Sub Cerrar()
Dim InfoClienteActual As InfoDeUnCliente

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

Cliente = Clientes(IDCliente)
Cliente.Socket.Send(Encoding.ASCII.GetBytes(Datos))

End Sub
Public Sub EnviarDatos(ByVal Datos As String)
Dim Cliente As InfoDeUnCliente

For Each Cliente In Clientes.Values
EnviarDatos(Cliente.Socket.RemoteEndPoint, Datos)
Next
End Sub
#End Region

#Region "Funciones privadas"
Private Sub EsperarCliente()
Dim InfoClienteActual As InfoDeUnCliente

With InfoClienteActual
While True

.Socket = tcpLsn.AcceptSocket()

IDClienteActual = .Socket.RemoteEndPoint

.Thread = New Thread(AddressOf LeerSocket)
'Agrego la informacion del cliente al HashArray Clientes.
SyncLock Me
Clientes.Add(IDClienteActual, InfoClienteActual)
End SyncLock

RaiseEvent NuevaConexion(IDClienteActual)
.Thread.Start()
End While
End With
End Sub
Private Sub LeerSocket()
Dim IDReal As Net.IPEndPoint
Dim Recibir() As Byte
Dim InfoClienteActual As InfoDeUnCliente
Dim Ret As Integer = 0

IDReal = IDClienteActual
InfoClienteActual = Clientes(IDReal)

With InfoClienteActual
While True
If .Socket.Connected Then
Recibir = New Byte(100) {}

Try
Ret = .Socket.Receive(Recibir, Recibir.Length, SocketFlags.None)
If Ret > 0 Then

.UltimosDatosRecibidos = Encoding.ASCII.GetString(Recibir)
Clientes(IDReal) = InfoClienteActual

RaiseEvent DatosRecibidos(IDReal)
Else

RaiseEvent ConexionTerminada(IDReal)
Exit While

End If
Catch ex As Exception
If Not .Socket.Connected Then
RaiseEvent ConexionTerminada(IDReal)
Exit While
End If

End Try
End If
End While
Call CerrarThread(IDReal)
End With
End Sub

Private Sub CerrarThread(ByVal IDCliente As Net.IPEndPoint)
Dim InfoClienteActual As InfoDeUnCliente

InfoClienteActual = Clientes(IDCliente)

Try
InfoClienteActual.Thread.Abort()

Catch ex As Exception

SyncLock Me
Clientes.Remove(IDCliente)
End SyncLock

End Try
End Sub
#End Region
End Class
[/sckServidor DLL]

'////**** CODIGO PARA EL FORMULARIO

[frmCliente]
Public Class Form1
Inherits System.Windows.Forms.Form

Dim WithEvents WinSockCliente As New Cliente.Cliente

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
With WinSockCliente
.IPDelHost = "servidor"
.PuertoDelHost = 8050
.Conectar()
End With
End Sub

Private Sub WinSockCliente_ConexionTerminada() Handles
WinSockCliente.ConexionTerminada
MsgBox("ConexionTerminada")
End Sub
Private Sub WinsockCliente_DatosRecibidos(ByVal datos As String) Handles
WinSockCliente.DatosRecibidos
MsgBox(datos)
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
WinSockCliente.EnviarDatos(TextBox1.Text)
End Sub

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As
System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
End
End Sub
End Class
[frmCliente]

[frmServidor]
Public Class Form1
Inherits System.Windows.Forms.Form

Dim WithEvents WinsockServer As New Servidor.WinSockServer


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
With WinsockServer
.PuertoDeEscucha = 8050
.Escuchar()
End With
End Sub

Private Sub WinsockServer_ConexionTerminada(ByVal IDTerminal As
System.Net.IPEndPoint) Handles WinsockServer.ConexionTerminada
MsgBox("Desconectado IP=" & IDTerminal.Address.ToString & " Puerto = " &
IDTerminal.Port)
End Sub

Private Sub WinsockServer_DatosRecibidos(ByVal IDTerminal As
System.Net.IPEndPoint) Handles WinsockServer.DatosRecibidos
MsgBox("Nuevo mensaje desde IP= " & IDTerminal.Port)
Call MsgBox(WinsockServer.ObtenerDatos(IDTerminal))
End Sub

Private Sub WinsockServer_NuevaConexion(ByVal IDTerminal As
System.Net.IPEndPoint) Handles WinsockServer.NuevaConexion
MsgBox("Se ha conectado un nuevo cliente desde IP= " &
IDTerminal.Address.ToString & "puerto= " & IDTerminal.Port)

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
WinsockServer.EnviarDatos(txtMensaje.Text)
End Sub
End Class
[/frmServidor]
 

Leer las respuestas

#1 Carlos Camargo
30/03/2007 - 17:21 | Informe spam
Hola Paul,

Yo me he topado con lo mismo en un proyecto el año pasado, igualmente con
una aplicacion que usa Socks.

Intenta poner este codigo en el evento Load de la forma donde esta el
TextBox:

Control.CheckForIllegalCrossThreadCalls = False

como podras adivinar, esto tiene que ver con threads.

espero te sirva,

ccamargo

"Paul P. Garcia" escribió en el mensaje
news:%231I$R$
Saludos.

Intento comprender la funcionalidad de un pequeño ejemplo sobre la
creacion
de un sock (
http://www.elguille.info/colabora/p...sVBNET.htm )

No logro comprender el porque la llega de datos solo funciona con un
MsgBox
y no haci con un TextBox:
Private Sub WinsockCliente_DatosRecibidos(ByVal datos As String) Handles
WinSockCliente.DatosRecibidos
MsgBox(datos) 'Esto funciona bien
End Sub

Private Sub WinsockCliente_DatosRecibidos(ByVal datos As String) Handles
WinSockCliente.DatosRecibidos
TextBox1.Text = datos 'TextBox1 nunca obtiene los datos, me pueden decir
porque
End Sub

El mismo proble ocurre en el Sock Servidor, al parecer solo funciona con
MsgBox.
Como se puede soluccionar este problema???

Espero me puedan ayudar
Estoy con WinXP prof sp2 VisualBasic 2005 express
Para agregar mi DLL debo ir menu "Proyecto >Agregar referencia > dentro de
la carpeta bin>Release o obj>Release ???

Luego en el form
Inherits System.Windows.Forms.Form
Dim WithEvents WinsockServer As New Servidor.WinSockServer


[sckCliente DLL]
Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
Imports System.Text
Imports System.IO

Public Class Cliente
#Region "Variable"
Private Stm As Stream 'Utilizado para enviar datos al servidor y recibr
datos
Private m_IPDelHost As String 'Direccion del objeto de la clase Servidor
Private m_PuertoDelHost As String
#End Region
#Region "Eventos"
Public Event ConexionTerminada()
Public Event DatosRecibidos(ByVal Datos As String)
'Public Event Connect()
'Public Event eError(ByVal Number As Integer, ByVal Description As
String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As
String, ByVal HelpContext As Long, ByVal CancelDisplay As Boolean)
#End Region
#Region "Propiedades"
Public Property IPDelHost() As String
Get
IPDelHost = m_IPDelHost
End Get
Set(ByVal Value As String)
m_IPDelHost = Value
End Set
End Property
Public Property PuertoDelHost() As String
Get
PuertoDelHost = m_PuertoDelHost
End Get
Set(ByVal Value As String)
m_PuertoDelHost = Value
End Set
End Property
#End Region
#Region "Metodos"
Public Sub Conectar()
Dim tcpClnt As TcpClient
Dim tcpThd As Thread 'Escucha mensajes

tcpClnt = New TcpClient()
tcpClnt.Connect(IPDelHost, PuertoDelHost)
Stm = tcpClnt.GetStream()
'Creo e inicio un thread para que escuche los mensajes enviados por el
servidor
tcpThd = New Thread(AddressOf LeerSocket)
tcpThd.Start()
End Sub

Public Sub EnviarDatos(ByVal Datos As String)
Dim BufferDeEscritura() As Byte

BufferDeEscritura = Encoding.ASCII.GetBytes(Datos)

If Not (Stm Is Nothing) Then
Stm.Write(BufferDeEscritura, 0, BufferDeEscritura.Length)
End If
End Sub
#End Region

#Region "Funciones privadas"
Private Sub LeerSocket()
Dim BufferDeLectura() As Byte

While True
Try
BufferDeLectura = New Byte(100) {}
'Me quedo esperando a que llegue algun mensaje
Stm.Read(BufferDeLectura, 0, BufferDeLectura.Length)
'Genero el evento Arrival, ya que se han recibidos datos
RaiseEvent
DatosRecibidos(Encoding.ASCII.GetString(BufferDeLectura))
Catch ex As Exception
Exit While
End Try
End While
'Finalizo la conexion, por lo tanto genero el evento correspondiente
RaiseEvent ConexionTerminada()
End Sub
#End Region
End Class
[/sckCliente DLL]

[sckServidor DLL]
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 informacion sobre un cliente
Public Socket As Socket
Public Thread As Thread
Public UltimosDatosRecibidos As String
End Structure
#End Region
#Region "Variables"
Private tcpLsn As TcpListener
Private Clientes As New Hashtable()
Private tcpThd As Thread
Private IDClienteActual As Net.IPEndPoint
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)
tcpLsn.Start()

tcpThd = New Thread(AddressOf EsperarCliente)
tcpThd.Start()
End Sub
Public Function ObtenerDatos(ByVal IDCliente As Net.IPEndPoint) As String
Dim InfoClienteSolicitado As InfoDeUnCliente

InfoClienteSolicitado = Clientes(IDCliente)
ObtenerDatos = InfoClienteSolicitado.UltimosDatosRecibidos
End Function
Public Sub Cerrar(ByVal IDCliente As Net.IPEndPoint)
Dim InfoClienteActual As InfoDeUnCliente

InfoClienteActual = Clientes(IDCliente)
InfoClienteActual.Socket.Close()
End Sub
Public Sub Cerrar()
Dim InfoClienteActual As InfoDeUnCliente

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

Cliente = Clientes(IDCliente)
Cliente.Socket.Send(Encoding.ASCII.GetBytes(Datos))

End Sub
Public Sub EnviarDatos(ByVal Datos As String)
Dim Cliente As InfoDeUnCliente

For Each Cliente In Clientes.Values
EnviarDatos(Cliente.Socket.RemoteEndPoint, Datos)
Next
End Sub
#End Region

#Region "Funciones privadas"
Private Sub EsperarCliente()
Dim InfoClienteActual As InfoDeUnCliente

With InfoClienteActual
While True

.Socket = tcpLsn.AcceptSocket()

IDClienteActual = .Socket.RemoteEndPoint

.Thread = New Thread(AddressOf LeerSocket)
'Agrego la informacion del cliente al HashArray Clientes.
SyncLock Me
Clientes.Add(IDClienteActual, InfoClienteActual)
End SyncLock

RaiseEvent NuevaConexion(IDClienteActual)
.Thread.Start()
End While
End With
End Sub
Private Sub LeerSocket()
Dim IDReal As Net.IPEndPoint
Dim Recibir() As Byte
Dim InfoClienteActual As InfoDeUnCliente
Dim Ret As Integer = 0

IDReal = IDClienteActual
InfoClienteActual = Clientes(IDReal)

With InfoClienteActual
While True
If .Socket.Connected Then
Recibir = New Byte(100) {}

Try
Ret = .Socket.Receive(Recibir, Recibir.Length,
SocketFlags.None)
If Ret > 0 Then

.UltimosDatosRecibidos = Encoding.ASCII.GetString(Recibir)
Clientes(IDReal) = InfoClienteActual

RaiseEvent DatosRecibidos(IDReal)
Else

RaiseEvent ConexionTerminada(IDReal)
Exit While

End If
Catch ex As Exception
If Not .Socket.Connected Then
RaiseEvent ConexionTerminada(IDReal)
Exit While
End If

End Try
End If
End While
Call CerrarThread(IDReal)
End With
End Sub

Private Sub CerrarThread(ByVal IDCliente As Net.IPEndPoint)
Dim InfoClienteActual As InfoDeUnCliente

InfoClienteActual = Clientes(IDCliente)

Try
InfoClienteActual.Thread.Abort()

Catch ex As Exception

SyncLock Me
Clientes.Remove(IDCliente)
End SyncLock

End Try
End Sub
#End Region
End Class
[/sckServidor DLL]

'////**** CODIGO PARA EL FORMULARIO

[frmCliente]
Public Class Form1
Inherits System.Windows.Forms.Form

Dim WithEvents WinSockCliente As New Cliente.Cliente

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
With WinSockCliente
.IPDelHost = "servidor"
.PuertoDelHost = 8050
.Conectar()
End With
End Sub

Private Sub WinSockCliente_ConexionTerminada() Handles
WinSockCliente.ConexionTerminada
MsgBox("ConexionTerminada")
End Sub
Private Sub WinsockCliente_DatosRecibidos(ByVal datos As String) Handles
WinSockCliente.DatosRecibidos
MsgBox(datos)
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
WinSockCliente.EnviarDatos(TextBox1.Text)
End Sub

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As
System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
End
End Sub
End Class
[frmCliente]

[frmServidor]
Public Class Form1
Inherits System.Windows.Forms.Form

Dim WithEvents WinsockServer As New Servidor.WinSockServer


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
With WinsockServer
.PuertoDeEscucha = 8050
.Escuchar()
End With
End Sub

Private Sub WinsockServer_ConexionTerminada(ByVal IDTerminal As
System.Net.IPEndPoint) Handles WinsockServer.ConexionTerminada
MsgBox("Desconectado IP=" & IDTerminal.Address.ToString & " Puerto = "
& IDTerminal.Port)
End Sub

Private Sub WinsockServer_DatosRecibidos(ByVal IDTerminal As
System.Net.IPEndPoint) Handles WinsockServer.DatosRecibidos
MsgBox("Nuevo mensaje desde IP= " & IDTerminal.Port)
Call MsgBox(WinsockServer.ObtenerDatos(IDTerminal))
End Sub

Private Sub WinsockServer_NuevaConexion(ByVal IDTerminal As
System.Net.IPEndPoint) Handles WinsockServer.NuevaConexion
MsgBox("Se ha conectado un nuevo cliente desde IP= " &
IDTerminal.Address.ToString & "puerto= " & IDTerminal.Port)

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
WinsockServer.EnviarDatos(txtMensaje.Text)
End Sub
End Class
[/frmServidor]

Preguntas similares