Hola a todos,
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:
//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);
}
}
}
}
Cuando ejecuto servidor y luego cliente pasando cadena por teclado, mete un petardazo y me lanza la siguiente excepción:
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.