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?
![Neurótico](http://static.forosdelweb.com/fdwtheme/images/smilies/scared.png)
En fin, gracias desde ya. Saludos.