Ayuda con Sockets - Estoy que reviento...

03/01/2006 - 22:53 por Camilo | Informe spam
Hola Comunidad!!!

Llevaba rato de no participar de este medio de conocimiento... todo debido a
politicas laborales de la empresa en la cual laboraba... pero ahora, gracias
a Dios tengo acceso a esta fuente del saber...

La situación es la siguiente, estoy migrando una aplicación que fue
realizada en Visual Basic 6.0 a Visual Basic .NET (Express) 2005, en vista
de que muchas de las palabras claves cambian, y la definición de muchos
objetos cambia, decidí realizar desde CERO el código, dicha aplicación es
una interface de comunicación entre unas terminales móviles (Lipman Nurit
8320) y un servidor de Base de Datos, para descargar datos de ventas de la
terminal, y cargarle información de artículos en existencia de devuelta...

hasta hay todo muy bien, pero resulta que esta aplicación establece
comunicación via TCP/IP con la terminal Lipman, y esta última le envia por
un puerto configurado previamente, la información sobre los movimientos,
ventas y devoluciones hechas, etc... Pues bien, es en este proceso, donde
patino... inicalmente era cuestion de IP (mi equipo no estaba apuntando al
DNS adecuado), ya esto lo resolví... e hice una prueba a través de Hyper
Terminal, configurandolo para que escuche por el puerto utilizado en la
aplicación y efectivamente me llegan datos, toda la información completa...

Pero en mi aplicacion de .NET, no... estuve revisando código por código,
linea a linea a ver que sucede y todo está tal cual los ejemplos de la MSDN
para realizar un Listener que escuche un puerto X y extraiga el flujo de
datos enviados por el canal... más sin embargo solo logro trar el primera
fila de datos, y el resto de datos, no llegan... y para colmo de males no
saca error de excepción...

Realmente no se que hacer, le he dado vueltas a este asunto y no encuentro
una solución... no en el momento, y con lo poco que conozco de Visual Studio
.NET 2005

Agradezco de ustedes cualesquier luz al respecto...

anexo el fragmento de código que empleo para traer los datos de la terminal
lipman.

Public Shared Sub Main(ByRef frmFormulario As frmPrincipal, ByVal intPuerto
As Integer, ByVal strIpAddress As String)

Try

' Set the TcpListener on port 13000.

Dim tcpServer As New TcpListener(Net.IPAddress.Parse(strIpAddress),
intPuerto)

' Start listening for client requests.

tcpServer.Start()

Dim data As [String] = Nothing

' Enter the listening loop.

While True

frmFormulario.UpdateStatus("Waiting for a connection... ")

' Perform a blocking call to accept requests.

' You could also user server.AcceptSocket() here.

Dim tcpCliente As TcpClient = tcpServer.AcceptTcpClient()

frmFormulario.UpdateStatus("Connected!")

' Get a stream object for reading and writing

Dim nwsLector As NetworkStream = tcpCliente.GetStream()

'Buffer for reading data

Dim bytLector(tcpCliente.ReceiveBufferSize) As [Byte]

nwsLector.Read(bytLector, 0, CInt(tcpCliente.ReceiveBufferSize))

data = Nothing

' Translate data bytes to a ASCII string.

data = System.Text.Encoding.ASCII.GetString(bytLector, 0,
CInt(tcpCliente.ReceiveBufferSize))

frmFormulario.UpdateStatus([String].Format("Receibido: {0}", data))

' Shutdown and end connection

tcpCliente.Close()

tcpServer.Stop()

frmFormulario.UpdateStatus([String].Format("Receibido: {0}", data))

End While

Catch e As SocketException

frmFormulario.UpdateStatus([String].Format("SocketException: {0}", e))

End Try

End Sub 'Main
 

Leer las respuestas

#1 Leonardo Azpurua [mvp vb]
03/01/2006 - 23:34 | Informe spam
Hola, Camilo:

Todavia soy un poco dinosaurio (sigo dedicando el 80% del tiempo a VB6),
pero fíjate en estas líneas de tu procedimiento:

tcpServer.Start()
...
While True
...
tcpServer.Stop()
End While

Una vez que has recibido la primera linea del terminal, cierras el socket de
escucha y nunca mas lo abres. ¿Cómo pretendes obtener ninguna notificacion
adicional de un Listener cerrado?


Salud!


"Camilo" escribió en el mensaje
news:%23azY1%
Hola Comunidad!!!

Llevaba rato de no participar de este medio de conocimiento... todo debido
a
politicas laborales de la empresa en la cual laboraba... pero ahora,
gracias
a Dios tengo acceso a esta fuente del saber...

La situación es la siguiente, estoy migrando una aplicación que fue
realizada en Visual Basic 6.0 a Visual Basic .NET (Express) 2005, en vista
de que muchas de las palabras claves cambian, y la definición de muchos
objetos cambia, decidí realizar desde CERO el código, dicha aplicación es
una interface de comunicación entre unas terminales móviles (Lipman Nurit
8320) y un servidor de Base de Datos, para descargar datos de ventas de la
terminal, y cargarle información de artículos en existencia de devuelta...

hasta hay todo muy bien, pero resulta que esta aplicación establece
comunicación via TCP/IP con la terminal Lipman, y esta última le envia por
un puerto configurado previamente, la información sobre los movimientos,
ventas y devoluciones hechas, etc... Pues bien, es en este proceso, donde
patino... inicalmente era cuestion de IP (mi equipo no estaba apuntando al
DNS adecuado), ya esto lo resolví... e hice una prueba a través de Hyper
Terminal, configurandolo para que escuche por el puerto utilizado en la
aplicación y efectivamente me llegan datos, toda la información
completa...

Pero en mi aplicacion de .NET, no... estuve revisando código por código,
linea a linea a ver que sucede y todo está tal cual los ejemplos de la
MSDN
para realizar un Listener que escuche un puerto X y extraiga el flujo de
datos enviados por el canal... más sin embargo solo logro trar el primera
fila de datos, y el resto de datos, no llegan... y para colmo de males no
saca error de excepción...

Realmente no se que hacer, le he dado vueltas a este asunto y no encuentro
una solución... no en el momento, y con lo poco que conozco de Visual
Studio
.NET 2005

Agradezco de ustedes cualesquier luz al respecto...

anexo el fragmento de código que empleo para traer los datos de la
terminal
lipman.

Public Shared Sub Main(ByRef frmFormulario As frmPrincipal, ByVal
intPuerto
As Integer, ByVal strIpAddress As String)

Try

' Set the TcpListener on port 13000.

Dim tcpServer As New TcpListener(Net.IPAddress.Parse(strIpAddress),
intPuerto)

' Start listening for client requests.

tcpServer.Start()

Dim data As [String] = Nothing

' Enter the listening loop.

While True

frmFormulario.UpdateStatus("Waiting for a connection... ")

' Perform a blocking call to accept requests.

' You could also user server.AcceptSocket() here.

Dim tcpCliente As TcpClient = tcpServer.AcceptTcpClient()

frmFormulario.UpdateStatus("Connected!")

' Get a stream object for reading and writing

Dim nwsLector As NetworkStream = tcpCliente.GetStream()

'Buffer for reading data

Dim bytLector(tcpCliente.ReceiveBufferSize) As [Byte]

nwsLector.Read(bytLector, 0, CInt(tcpCliente.ReceiveBufferSize))

data = Nothing

' Translate data bytes to a ASCII string.

data = System.Text.Encoding.ASCII.GetString(bytLector, 0,
CInt(tcpCliente.ReceiveBufferSize))

frmFormulario.UpdateStatus([String].Format("Receibido: {0}", data))

' Shutdown and end connection

tcpCliente.Close()

tcpServer.Stop()

frmFormulario.UpdateStatus([String].Format("Receibido: {0}", data))

End While

Catch e As SocketException

frmFormulario.UpdateStatus([String].Format("SocketException: {0}", e))

End Try

End Sub 'Main


Preguntas similares