Foros del Web » Programación para mayores de 30 ;) » .NET »

Vuelvo a las andadas con TcpClient y TcpListener (VB.NET)

Estas en el tema de Vuelvo a las andadas con TcpClient y TcpListener (VB.NET) en el foro de .NET en Foros del Web. Muy Buenas Xente !!! Pues nada, ahroa me ha entrado la "venada" de darle a esto de los Sockets y aqui estoy, peléandome con TcpListener ...
  #1 (permalink)  
Antiguo 07/02/2005, 12:31
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Vuelvo a las andadas con TcpClient y TcpListener (VB.NET)

Muy Buenas Xente !!!

Pues nada, ahroa me ha entrado la "venada" de darle a esto de los Sockets y aqui estoy, peléandome con TcpListener y TcpClient, antes de pasar a la Clase Sockets.

Bueno, pues la cuestión es que tengo creado una aplicación Cliente y una aplicación Servidor. Y tengo un pequeño problema.

El asunto es que cuando está escuchando el servidor, ejecuto un cliente, que lanza un mensaje, el servidor lo recibe perfectamente y lanza un MsgBox mostrando el dato recibido. Vale, hasta ahi Perfecto !!!

Si despues abro otro cliente, SIN haber cerrado el otro, y lanzo el mesaje, el servidor no me muestra el msgbox con ese mensaje. Si despues cierro el primer cilente, entonces si, me muestra un msgbox, con todos los mensajes que lance con el segundo cliente.

Espero haberme explicado. El código es el siguiente (Moderadores, disculpen la sobrecarga y si creen que es mucho código lo que he puesto, hagan lo que crean más correcto):

************************
SERVIDOR
************************
Imports System.Threading
Imports System.Net.Sockets
Imports System.Net

Dim Servidor As TcpListener = New TcpListener(IPAddress.Any, 1500)
Dim Hebra As Thread

Private Sub Form1_Load(ByVal sender As S........
Servidor.Start()
Hebra = New Thread(AddressOf Recibiendo)
Hebra.Start()
End Sub

Sub Recibiendo()
Dim client As TcpClient
Dim stream As NetworkStream
Dim i As Int32
Dim bytes(1024) As Byte
Dim data As String
While True
data = Nothing
client = Servidor.AcceptTcpClient
stream = client.GetStream()
' Loop to receive all the data sent by the client.
i = stream.Read(bytes, 0, bytes.Length)
While (i <> 0)
' Translate data bytes to a ASCII string.
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i)
MsgBox(data.ToString)
i = stream.Read(bytes, 0, bytes.Length)
End While
End While
End Sub

Private Sub Form1_Closing(ByVal sender As Object, ....
If Hebra.IsAlive Then
Hebra.Abort()
End If
Servidor.Stop()
Application.Exit()
End Sub

*****************************
FIN SERVIDOR
*****************************



*****************************
CLIENTE (Lleva solamente un botón para mandar el msg)
*****************************
Dim Cliente As ClienteTCP
Private Sub Form1_Load(ByVal sender As .....
Cliente = New ClienteTCP("localhost", 1500)
Cliente.Conectar()
If Cliente.EstaConectado Then
MsgBox("Todo bien")
Cliente.EnviarDatos()
End If
End Sub

Private Sub Button1_Click(ByVal sender As Syst.....
If Cliente.EstaConectado() Then
Cliente.EnviarDatos()
End If
End Sub

End Class




Class ClienteTCP
Inherits TcpClient

Private HostServidor As String
Private Puerto As Int16
Private netStream As NetworkStream

Public Sub New(ByVal host As String, ByVal port As Int16)
HostServidor = host
Puerto = port
End Sub

Public Function EstaConectado() As Boolean
If Me.Active Then
Return True
Else
Return False
End If
End Function

Public Sub Conectar()
Try
Me.Connect(Me.HostServidor, Me.Puerto)
Catch ex As Exception
MessageBox.Show(ex.Message, "Error al Conectar", ......)
End Try
End Sub

Public Sub EnviarDatos()
netStream = Me.GetStream
Dim Bytes() As Byte
If netStream.CanWrite Then
Bytes = Encoding.UTF8.GetBytes("Probando")
netStream.Write(Bytes, 0, Bytes.Length)
Else
Throw New Exception("Error al escribir")
Return
End If
End Sub
***************************************
FIN CLIENTE
***************************************

Bueno, espero haberme explicado, resumiendo el problema:

- Inicio el Servidor.
- Inicio un Cliente y envío datos.
- El Servidor lanza un msgbox con el dato enviado.
- Cada vez que doy al boton del cliente este envía un dato y el servidor lanza un msgbox.
- Inicio Otro Cliente sin cerrar el anterior.
- Mando datos con este nuevo cliente dando al boton.
- No pasa nada.
- Cierro el primer cliente.
- El Servidor lanza un msgbox con todos los datos enviados del segundo cliente en vez de un msgbox por dato.


He estado peleandome, probando a cerrar el stream, pero entonces peor. ¿Alguien puede darme alguna solución?, ¿Qué me falta para poder usar tantos clientes como quiera?

En fin, gracias desde ya. Saludos.
__________________
Charlie.
  #2 (permalink)  
Antiguo 07/02/2005, 12:57
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 4 meses
Puntos: 7
Para no generar tráfico como dices, bueno aquí hay una aplicación en la que explica como hacer lo que pides, es una aplicación simple y está fácil para adaptarlo a tus necesidades:

http://msdn.microsoft.com/library/de...et08282001.asp
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #3 (permalink)  
Antiguo 07/02/2005, 13:00
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 4 meses
Puntos: 7
No trabajo mucho con vb.net pero para c# existe un libro que es muy bueno para lo que es programación en redes:

Título: C# Network Programming
Autor: Richard Blum
ISBN : 0782141765
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #4 (permalink)  
Antiguo 07/02/2005, 13:13
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Lo sé, encuanto haya cogido más soltura me pondré a leerlo, ya le había hechado el ojo hacía tiempo. Mientras tanto, ¿Puedes ayudarme con la duda?
__________________
Charlie.
  #5 (permalink)  
Antiguo 07/02/2005, 14:07
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 4 meses
Puntos: 7
El hecho de que no te acepta más conecciones es que estás utilizando un sólo cliente (TcpClient), para eso deberías crear más TcpClient's, una especie de array o algo así.

Por la razón que indicaste arriba no envío el código, pero si quieres te lo puedo enviar por correo, puedes contactarme en xknown at gmail dot com.
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #6 (permalink)  
Antiguo 07/02/2005, 15:05
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Bueno, pues si no te importa mandármela te lo agradecería mucho.

Aqui te dejo mi eMail.


carlos arroba dualidea.com

Nuevamente, thanks.
__________________
Charlie.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:16.