[ Foro de C# ]

no llega mensaje entre cliente y servidor utilizando sockets

13-Jul-2016 20:41
joel tamez
0 Respuestas

Buen día para todos quienes conforman este gran foro, soy nuevo por aquí.

les comento que estoy modificando un ejemplo que por la web me encontrara, que consiste en un chat muy simple entre servidor y clientes.

sin embargo, algo parece estar mal pues si copio el código tal cual se muestra en el ejemplo de donde lo extraje, me da un error muy simple a la hora de compilar. pues me dice que no se reconoce el nombre de una variable, pues efectivamente, la misma en el ejemplo no fue declarada en el código cliente. y a pesar que la he declarado y el programa corre, los mensajes no llegan entre el cliente y el servidor y a la inversa.

sin más, dejo el código del cliente, del servidor, la clase que se agrega a ambos programas, y cito al final el link del foro donde se encuentra el ejemplo.
esperando con ello, alguien pueda orientarme al respecto, pues aún tengo conocimientos muy básicos de programación, y que ya intenté realizar algunos cambios pero no logro que funcione.

código servidor (parece funcionar):


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;

namespace restaurantServerForm
{
    public partial class Form1 : Form
    {
        TcpListener servidor = new TcpListener(IPAddress.Any, 123);
        TcpClient cliente_aceptado = null;
//        Timer tmrEscuchar = new Timer();
//        Timer tmrRecibir = new Timer();

        public Form1()
        {
            InitializeComponent();
            tmrEscuchar.Tick += new EventHandler(tmrEscuchar_Tick);
        }

        private void tmrEscuchar_Tick(object sender, EventArgs e)
        {
            if (servidor.Pending()) // Determina si hay conexiones pendientes
            {
                TcpClient cliente = servidor.AcceptTcpClient();
                tmrRecibir.Start();//<- Agregado

            }


        }

        private void btnIniciar_Click(object sender, EventArgs e)
        {
            servidor.Start();
            tmrEscuchar.Start();
        }

        private void btnEnviar_Click(object sender, EventArgs e)
        {
            if (txtMensaje.Text != "")
            {
                EnviarRecibir.Enviar(cliente_aceptado, txtMensaje.Text);//Enviar mensaje
                rtbConversacion.Text += "Yo: " + txtMensaje.Text + "\n"; //Efecto de conversación
                txtMensaje.Text = "";
            }
        }

        private void tmrRecibir_Tick(object sender, EventArgs e)
        {
            try
            {
                if (cliente_aceptado.Available > 0)//Si hay informacion disponible que leer
                {
                    rtbConversacion.Text += "Servidor: " + EnviarRecibir.Recibir(cliente_aceptado) + "\n";
                }
            }
            catch (Exception)
            { }
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            Dispose();
             
        }
    }
}




código clase común en cliente y servidor:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.IO;//Para escritura y lectura de "streams"

namespace restaurantServerForm
{
    class EnviarRecibir
    {
        public static void Enviar(TcpClient cliente, String Dato)
        {
            try
            {
                NetworkStream netstream = cliente.GetStream();
                StreamWriter escribir = new StreamWriter(netstream);
                escribir.WriteLine(Dato);
                escribir.Flush();
            }
            catch (Exception) { }
        }

        public static String Recibir(TcpClient cliente)
        {
            try
            {
                NetworkStream netstream = cliente.GetStream();
                StreamReader leer = new StreamReader(netstream);

                return leer.ReadLine();
            }
            catch (Exception) { return ""; }
        }



    }
}



código cliente (no compila):


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
namespace restaurantClientForm
{
    public partial class Form1 : Form
    {
        public static TcpClient Cliente = new TcpClient();

        public Form1()
        {
            InitializeComponent();
        }

        private void btnConectar_Click(object sender, EventArgs e)
        {
            try
            {
                Cliente.Connect(IPAddress.Parse("127.0.0.1"), 123);//Conectar a  servidor por el puerto 123
                if (Cliente.Connected)
                {
                    tmrRecibir.Start();
                }
                            }
            catch (Exception) { lblEstado.Text = "Desconectado"; }


        }

        private void btnEnviar_Click(object sender, EventArgs e)
        {
            if (txtMensaje.Text != "")
            {
                EnviarRecibir.Enviar(cliente_aceptado, txtMensaje.Text);//Enviar mensaje
                // EnviarRecibir.Enviar(Cliente, txtMensaje.Text);//Enviar mensaje

                rtbConversacion.Text += "Yo: " + txtMensaje.Text + "\n"; //Efecto de conversación
                txtMensaje.Text = "";
            }
        }

        private void tmrRecibir_Tick(object sender, EventArgs e)
        {
            try
            {
                if (cliente_aceptado.Available > 0)//Si hay informacion disponible que leer

                {
                    rtbConversacion.Text += "Servidor: " + EnviarRecibir.Recibir(cliente_aceptado) + "\n";

                }
            }
            catch (Exception)
            { }
            
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            Dispose();

        }
    }
}



la variable que falta declarar es "cliente_aceptado", misma que sí aparece en el código del servidor.

link al ejemplo:
http://cspromex.activo.mx/t102-sockets-conexionenvio-y-recepcion-de-datos-mini-chat-cliente-servidor

de antemano, muchas gracias a quien se tome el tiempo de leer mi consulta y dar respuesta a la misma.

salu2




(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)