Me estoy iniciando en la programación de aplicaciones en redes, y quiero empezar de la forma más sencilla posible, para luego ir añadiendo funcionalidades e ir aprendiendo. He pensado en realizar la siguiente aplicación, por el momento es una app de consola, pero la modificare añadiendo windows forms:
- Cliente: Lee de la entrada estándar una cadena, y se la envía mediante socket TCP al servidor.
- Servidor: Crea socket de conexión, captura cadena pasada por el cliente y la imprime en la salida estandar.
No tengo muchos conocimientos de la clase System.Net, pero tras mucho estudio y mirar otros ejemplos de internet, he implementado la siguiente solucion:
Código:
//Cliente: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Net; namespace TCPCliente { class TCPCliente { static void Main(string[] args) { String cadena; int bytes = 0; byte[] datos_envio; cadena = Console.ReadLine(); //Dirección IP servidor: servidor en mi propia maquina IPAddress[] ipDestino = Dns.GetHostAddresses("localhost"); //Dirección Socket servidor: puerto 6536 aleatorio IPEndPoint ipe = new IPEndPoint(ipDestino[0], 6536); //Creación Socket cliente Socket socketCliente = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { //Conexión entre sockets socketCliente.Connect(ipe); } catch (SocketException) { Console.WriteLine("No se ha podido producir la conexión"); } datos_envio = System.Text.ASCIIEncoding.ASCII.GetBytes(cadena); socketCliente.Send(datos_envio,datos_envio.Length,SocketFlags.None); } } }
Código:
Cuando ejecuto servidor y luego cliente pasando cadena por teclado, mete un petardazo y me lanza la siguiente excepción://Servidor: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; namespace TCPServidor { class TCPServidor { static void Main(string[] args) { byte[] datos = new byte[1024]; int bytes; String cadena; //Creamos socket de acogida para el servidor IPAddress[] ipDestino = Dns.GetHostAddresses("localhost"); IPEndPoint ipe = new IPEndPoint(ipDestino[0], 6536); Socket socketServidor = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { //Se ancla el socket al puerto especificado socketServidor.Bind(ipe); } catch (SocketException) { Console.WriteLine("Otra aplicación está usando el puerto"); } socketServidor.Listen(1); //Creamos socket de conexion Socket cliente = socketServidor.Accept(); while(true) { //Leemos cadena y escribimos por pantalla. bytes = cliente.Receive(datos); cadena = System.Text.ASCIIEncoding.ASCII.GetString(datos); cadenaMayuscula = cadena.ToUpper(); if (cadena == "Exit") break; Console.WriteLine(cadenaMayuscula); } } } }
An unhandled exception of type 'System.Net.Sockets.SocketException' occurred in System.dll
Additional information: Se ha forzado la interrupción de una conexión existente por el host remoto
¿Por favor, alguien me puede guiar e indicarme que estoy haciendo bien y mal?
Muchas gracias de antemano.