C sharp - Programacion de aplicaciones de red: comunicacion por sockets

 
Vista:

Programacion de aplicaciones de red: comunicacion por sockets

Publicado por Miguel (2 intervenciones) el 27/10/2013 17:16:07
Hola a todos,

Me estoy iniciando en la programación de aplicaciones en redes, y quiero empezar de la forma más sencilla posible. He pensado en realizar la siguiente aplicación:

- 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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//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);
            }
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//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 conexión 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 acogida
            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.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder