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

Problema VB.NET introduciendome con TcpListener y TcpClient

Estas en el tema de Problema VB.NET introduciendome con TcpListener y TcpClient en el foro de .NET en Foros del Web. Buenas noches !!! Bueno, este post creo que va a ser un poco largo, asi que espero que haya alguien con paciencia y me heche ...
  #1 (permalink)  
Antiguo 27/01/2005, 16:05
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Problema VB.NET introduciendome con TcpListener y TcpClient

Buenas noches !!!

Bueno, este post creo que va a ser un poco largo, asi que espero que haya alguien con paciencia y me heche un cable.

Bueno, la cuestión es que me estoy iniciando con esto de los "Sockets", estoy empezando con TcpClient y TcpServer.

Hice un pequeño TcpClient, creando una nueva clase que hereda de TcpClient, para asi poder usar más metodos que trae:


*************************************
PROYECTO CLIENTE
*************************************

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", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub

Public Sub EnviarDatos()
netStream = Me.GetStream
If netStream.CanWrite Then
Dim Bytes() As Byte = Encoding.UTF8.GetBytes("Probando")
netStream.Write(Bytes, 0, Bytes.Length)

Bytes = Encoding.UTF8.GetBytes("Otra movida")
netStream.Write(Bytes, 0, Bytes.Length)

Bytes = Encoding.UTF8.GetBytes("")
netStream.Write(Bytes, 0, Bytes.Length)
Else
Throw New Exception("Error al escribir")
Return
End If
End Sub

************
En el formulario
************
Private Sub Form1_Load(ByVal sender As System.Object, .....
Dim Cliente As ClienteTCP
Cliente = New ClienteTCP("localhost", 1500)
Cliente.Conectar()
If Cliente.EstaConectado Then
MsgBox("Todo bien")
Cliente.EnviarDatos()
End If
End Sub

*********************************************
FIN PROYECTO CLIENTE
*********************************************


Este TcpClient tiene que mandar información al servidor, la manda y el servidor la recibe sin problemas. Despues, si cierro la aplicación cliente, el servidor me dice que tiene un error.

"Información adicional: No se puede escribir datos de en la conexión de transporte."


**********************************************
PROYECTO SERVIDOR
**********************************************

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

Private Sub Form1_Load(ByV......
Servidor.Start()

Dim client As TcpClient = Servidor.AcceptTcpClient()
Dim stream As NetworkStream = client.GetStream()
Dim i As Int32
Dim bytes(1024) As Byte
Dim data As String = Nothing

' 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([String].Format("Received: {0}", data))
i = stream.Read(bytes, 0, bytes.Length)
End While
stream.close
End Sub
***********************************************
FIN PROYECTO SERVIDOR
***********************************************

Espero que no os parezca mucho lo que he puesto y que nun se me mosqueen esos moderadores . . . .

Bueno, pues tengo unas de dudillas, que por más que me peleo, no soy quién a resolver haber que os parece:

1-. Al cerrar el cliente, ¿Como podría hacer que el servidor no me de ese error y que siga escuchando por posibles conexiones?

2-.
Dim Servidor As TcpListener = New TcpListener(IPAddress.Any, 1500)

Aqui le digo al servidor que escuche por cualquier IP que tenga el equipo, ¿Como podría indcar que solo escuche por una IP específica?


Bueno, pues eso es todo, nuevamente, si les parece que es una exageración de texto lo que he puesto aqui, les pido disculpas.

Y desde ya, muchas gracias por la buena ayuda ofrecida siempre acá.

Saludos
__________________
Charlie.
  #2 (permalink)  
Antiguo 27/01/2005, 18:27
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 3 meses
Puntos: 50
lo acabo de leer de carrera friend, pero trataré de darte una respuesta mañana porque ya me voy...

Se que a lo mejor no tiene mucho escribir éste post sin respuesta, pero lo hago para que no se quede porque el tema de sockets es algo entretenido, uf.. ya no se ni lo que estoy diciendo.. jeje, es lo que pasa despues de estar mas de 10 horas en la chamba jugando con .Net...

Mañana lo checamos friend.

Salu2
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #3 (permalink)  
Antiguo 28/01/2005, 07:16
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Thnks tio, a mi tb mólame ganso esto de la comunicación entre equipos. :D
__________________
Charlie.
  #4 (permalink)  
Antiguo 30/01/2005, 16:19
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
¿Y bien?, ¿Nadie puede comentarme alguna solución?
__________________
Charlie.
  #5 (permalink)  
Antiguo 31/01/2005, 10:45
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 3 meses
Puntos: 50
sorry por la espera pero ya sabes como es esto del trabajo.. en fin, lo que se me estaba ocurriendo es que primero crees una especi de listener para hacer el check, y recuerda hacer un close de tu tcpclient para que no se quede colgado, posiblemente por ahi venga tu problema..

Mira.. te paso éste código para que te des una mejor idea de como podría ser (es solo un ejemplo "x")

Cita:
Dim tcpClient As New TcpClient
tcpClient.Connect(host, port)

Dim networkStream As NetworkStream = tcpClient.GetStream()
If networkStream.CanWrite And networkStream.CanRead Then
'hacer un simple write
Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("Probando, probando...")
networkStream.Write(sendBytes, 0, sendBytes.Length)
'Leer la el stream en un buffer (byte)
Dim bytes(tcpClient.ReceiveBufferSize) As Byte
networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))
'Salida de los datos recibidos de host
Dim returndata As String = Encoding.ASCII.GetString(bytes)
MessageBox.Show(("Host returned: " + returndata))
Else
If Not networkStream.CanRead Then
MessageBox.Show("No puedo escribir datos en mi stream...")
tcpClient.Close()
Else
If Not networkStream.CanWrite Then
MessageBox.Show("No puedo leer datos de mi stream...")
tcpClient.Close()
End If
End If
End If

Espero aque te sirva de algo.

Salu2
  #6 (permalink)  
Antiguo 01/02/2005, 10:13
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 3 meses
Puntos: 50
Si te sirvió el ejemplo chcma ?

Salu2
  #7 (permalink)  
Antiguo 01/02/2005, 10:32
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Gracias RootK, todavía no he tenido tiempo de mirarlo, de todas formas creo que no me he explicado bien.

El problema está en el servidor, no en el cliente.

Cuando conecto un cliente al servidor, este manda información, y el servidor la redibe.
Pero si cierro ese cliente, el servidor da un error.

De todas formas, ya mandaré más concretamente el error, que ahora estoy en el trabajo.

Nuevamente, gracias por contestar. ;)
__________________
Charlie.
  #8 (permalink)  
Antiguo 02/02/2005, 13:57
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Vale RootK, eso me sirve para controlar que el cliente pueda mandar datos o no, dependiendo de si el servidor está conectado.

Bien, eso lo entiendo.

Pero, lo que yo digo es que:
Inicio el servidor.
Abro un cliente.exe
El cliente manda datos al servidor.
El servidor lanza un msgbox con los datos recibidos.
Cierro el cliente.
Abro otro cliente.exe.
No hay ningún error, pero el servidor no me muestra el msgbox de lso datos que debería recibir.

¿Como puedo hacer para que cuando se conecte un cliente, el servidor reciba lo que le mande el cliente?
¿Y que si se desconecta este cliente y se conecta otro, que el servidor siga recibiendo los datos?

Bueno, no sé si me he explicado.

Si sabes por onde puedo empezar a mirar o tienen alguna sugerencia, os estaré muy agradecido.

Saludos.
__________________
Charlie.
  #9 (permalink)  
Antiguo 03/02/2005, 01:51
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 eso debes usar sockets asíncronos que justamente evita que se suspenda la ejecución de la aplicación del servidor mientras ce cierra una conexión de un cliente y se espera una otras conexiones.

Te sugiero que revises la siguiente dirección:
http://msdn.microsoft.com/library/sp...conSockets.asp
Para que "escuche" sólo en una dirección específica puedes utilizar IPAddress.Parse:
Dim Servidor As TcpListener = New TcpListener(IPAddress.Parse("192.168.0.1"), 1500)

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #10 (permalink)  
Antiguo 03/02/2005, 04:24
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Joder, pero con TcpListener también se debería poder, ¿No?.

Ya sé que en la msdn dicen que está más limitado que usar sockets, pero coño, tan limitado no creo que esté ...

Gracias por lo de ipadrres. ;)
__________________
Charlie.

Última edición por chcma; 03/02/2005 a las 04:26
  #11 (permalink)  
Antiguo 03/02/2005, 10:26
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 lograrlo con TcpListener debes usar hilos al momento de esperar conexiones, aquí un pequeño ejemplo:
Servidor
Código:
namespace Buayacorp {
	using System;
	using System.Net.Sockets;
	using System.Net ;
	using System.Text;
	using System.Threading ;

	public class Servidor
	{
		private TcpListener servidorLst ;
		private int port = 4554 ;
		
		public Servidor()
		{
			try{
					servidorLst = new TcpListener(IPAddress.Any, port) ;
					servidorLst.Start();
					Console.WriteLine("Servidor - Esperando Conexiones ...") ;
					Thread th = new Thread(new ThreadStart(EscucharConexion));
					th.Start() ;
					
				}
			catch(Exception e)
			{
				Console.WriteLine("Ocurrió un excepción :"+e.ToString());
			}
			
		}
		public static void Main(String[] argv)
		{
			Servidor dts = new Servidor();
		}
		public void EscucharConexion()
		{
			while(true)
			{
				Socket client = servidorLst.AcceptSocket() ;
				if(client.Connected)
				{
					Console.WriteLine("Cliente Conectado de "+client.RemoteEndPoint.ToString());
					string mensaje = "\n\n\tBienvenido al Servidor: La hora es: "+ DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString();
					byte[] msg = Encoding.UTF8.GetBytes(mensaje);
					
					client.Send(msg,msg.Length,0);

					Byte[] datos = new Byte[64];
					
                    int i=client.Receive(datos,datos.Length,0);
					char[] novalido = {' ',' ',' '};

					string recibido = System.Text.Encoding.UTF8.GetString(datos);
					recibido = recibido.TrimEnd(novalido);
					
					Console.WriteLine("Cliente: "+recibido) ;
					
					mensaje="\n\nServidor recibio: "+recibido;
					msg = Encoding.ASCII.GetBytes(mensaje);
					client.Send(msg,msg.Length,0);
				}
			}
		}
	}
}
Cliente
Código:
namespace Buayacorp {

	using System ;
	using System.Net.Sockets ;
	using System.Net ;
	using System.Threading ;

	public class Cliente
	{
		private TcpClient tcpc;
		private string msg ;
		private int port=4554 ;
		private bool readData=false ;

		public Cliente(string msg)
		{
			this.msg=msg ;
			try
			{
                tcpc =new TcpClient("localhost",port) ;
				NetworkStream nts = tcpc.GetStream() ;
				if(nts.CanWrite)
				{
					string sender = msg ;
					Byte[] sends = System.Text.Encoding.UTF8.GetBytes(sender.ToCharArray());
					nts.Write(sends,0,sends.Length) ;
					nts.Flush() ;
				}
				while(!readData&&nts.CanRead)
				{
					if(nts.DataAvailable)
					{
						byte[] rcd = new byte[128];
						int i=nts.Read( rcd,0,128);
						
						string ree = System.Text.Encoding.UTF8.GetString(rcd);
						char[] unwanted = {' ',' ',' '};
						
						Console.WriteLine(ree.TrimEnd(unwanted)) ;
						readData=true ;
					}
				}
			}
			catch(Exception e)
			{
				Console.WriteLine("No se pudo conectar al servidor "+e.ToString());
			}
		}
		public static void Main(string[] argv)
		{
			if(argv.Length<=0)
			{
				Console.WriteLine("Usage: Cliente <msg>") ;
				Console.Write("Mensaje: ") ;
				string msg=Console.ReadLine();
				Cliente dc = new Cliente(msg) ;
			}
			else
			{
				Cliente dc = new Cliente(argv[0]) ;
			}
			Console.WriteLine("Desconectado!!") ;
			Console.ReadLine() ;
		}
	}
}
Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #12 (permalink)  
Antiguo 03/02/2005, 12:53
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Ok tio, eso creo que es lo que necesito, voy a probar.

De todas formas, otra cosa, En vez de meter todo en un bucle infinito while(true), ¿No se podría crear un Evento para que se ejecute EscucharConexion() cada vez qeu se conecte un cliiente?
__________________
Charlie.
  #13 (permalink)  
Antiguo 06/07/2010, 21:58
Avatar de affv  
Fecha de Ingreso: diciembre-2002
Ubicación: Ahora aqui
Mensajes: 485
Antigüedad: 21 años, 5 meses
Puntos: 0
Respuesta: Problema VB.NET introduciendome con TcpListener y TcpClient

Yo busco lograr lo ultimo que quieres lograr un evento cuando se conecta un nuevo cliente en lugar del bucle infinito

Gracias y espero alguien nos pueda dar una sugerencia o solucion
__________________
Todo tiene un comienzo y un fin!!
Postea tus proyectos
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 09:56.