none
Socket está quase funcionando, quase RRS feed

  • Pergunta

  • O socket está funcionando enviando dados do cliente para o server e está recebendo resposta, porém, quando o server recebe a mensagem, ele não exibi na tela. Já tentei exibir a mensagem através de javascript, em um textbox, criei uma thread somente para exibir a mensagem que foi enviada do client, mas não funciona. O que pode está acontecendo?

    OBS.: o server é um web form e o client é um windows form.

    O código do server:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Threading;
    using System.Net.Sockets;
    using System.Net;
    using System.IO;
    using System.Reflection;
    
    
    namespace servidor.socket
    {
        public partial class _Default : System.Web.UI.Page
        {
            private delegate void AdicionarItemListboxDelegate(string item);
          
            private Thread tipoThread;
    
            protected void Page_Load(object sender, EventArgs e)
            {
                tipoThread = new Thread(new ThreadStart(RunServer));
                tipoThread.Start();
    
            }
    
            public void RunServer()
            {
                int conta = 1; //contaremos quantas conexões teremos
                try
                {
                     //indica a porta de conexão
                    const int PORTA = 9300;
                    //cria o servidor
                    classSocketServer servidor;
                    Label1.Text = " Aguardando conexões";
                    servidor = new classSocketServer(PORTA);
                    Label1.Text = " Conexão estabelecida com cliente";
     
                    while (true)
                    {
                        try
                        {
                            //executa o servidor
                            servidor.Run();
                            //exibe as mensagens na tela
    
                            /*!!!!!!!!!!!!!!    ISSO QUE NÃO FUNCIONA  !!!!!!!!!!!!!!!!!!! */
                            
                            //ScriptManager.RegisterStartupScript(this, this.GetType(), "Teste", "javascript:alert('" + " mensagem do cliente :"+servidor.MensagemCliente + "');", true);
                            
                            TextBox1.Text = "Dados do Cliente: " + servidor.MensagemCliente; //essa é a mensagem do cliente que será exibida na tela,
                                                                                                //mas não exibe.
                            conta++;
                        }
                        catch (Exception ex)
                        {
                            Label1.Text = ex.ToString();
                        }
                    }                
                }
                catch (Exception error)
                {
                    Label1.Text = error.ToString();
                }
            }
        }
    }
    

    Essa é a classe classSocketServer que está sendo usando no código acima:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Net.Sockets;
    using System.Net;
    using System.Text;
    
    namespace servidor.socket
    {
        public class classSocketServer
        {
            private const int TAMANHO_BUFFER = 10000;
            private int requisicoes;
    
            //mensagem que o cliente manda para o servidor
            private string mensagemCliente;
            //mensagem que o servidor manda ao cliente
            private string respostaServidor;
    
            public string MensagemCliente
            {
                get { return mensagemCliente; }
                set { mensagemCliente = value; }
            }
            public string RespostaServidor
            {
                get { return respostaServidor; }
                set { respostaServidor = value; }
            }
    
            //Socket do servidor
            private TcpListener servidor;
            //Socket do cliente
            private TcpClient cliente;
    
            public classSocketServer(int porta)
            {              
                this.servidor =  new TcpListener(IPAddress.Any, porta);
                this.cliente = default(TcpClient);
                this.servidor.Start();
                this.cliente = servidor.AcceptTcpClient();
                this.requisicoes = 0;
                this.respostaServidor = "";
            }
    
            public void Run()
            {
                this.requisicoes++;
    
                NetworkStream netStream = cliente.GetStream();
                byte[] recebido = new byte[TAMANHO_BUFFER];
                //recebe a mensagem do cliente
                netStream.Read(recebido, 0, (int)cliente.ReceiveBufferSize);
                //converte bytes em string
                this.mensagemCliente = Encoding.ASCII.GetString(recebido);
                /* reduz a string deixando de fora os caracteres
                    * adicionados durante o processo de conversão bytes->string */
                this.mensagemCliente = this.mensagemCliente.Substring(0, this.mensagemCliente.IndexOf("$"));
    
                /* define a resposta do servidor
                    * manda para o cliente a mensagem recebida
                    * convertida em letras maiusculas */
                this.respostaServidor = "Mensagem nº" + Convert.ToString(requisicoes) + ": " +this.mensagemCliente.ToUpperInvariant();
    
                Byte[] enviado = Encoding.ASCII.GetBytes(this.respostaServidor);
                //envia a resposta em bytes ao cliente
                netStream.Write(enviado, 0, enviado.Length);
                netStream.Flush();                
            }
        }
    }

    Aqui o código do windows form caso quiserem testar:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    using System.Net.Sockets;
    using System.IO;
    using System.Net;
    using System.Reflection;
        
    namespace Cliente.socket
    {
        public partial class Form1 : Form
        {
            private Thread tipoThread;
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
            
            classSocketClient cliente = new classSocketClient();
            private void botao_Click(object sender, EventArgs e)
            {
                tipoThread = new Thread(new ThreadStart(envia));
                tipoThread.Start();           
            }
            
            public void envia() {
                cliente.EnviarMensagem(txtEnvia.Text);
    
                //Exibe.Text = ">> " + cliente.RespostaServidor;
                SetControlPropertyValue(Exibe, "Text", cliente.RespostaServidor);
            }
    
            delegate void SetControlValueCallback(Control oControl, string propName, object propValue);
            private void SetControlPropertyValue(Control oControl, string propName, object propValue)
            {
                if (oControl.InvokeRequired)
                {
                    SetControlValueCallback d = new SetControlValueCallback(SetControlPropertyValue);
                    oControl.Invoke(d, new object[] { oControl, propName, propValue });
                }
                else
                {
                    Type t = oControl.GetType();
                    PropertyInfo[] props = t.GetProperties();
                    foreach (PropertyInfo p in props)
                    {
                        if (p.Name.ToUpper() == propName.ToUpper())
                        {
                            p.SetValue(oControl, propValue, null);
                        }
                    }
                }
            }
        }
    }

    quinta-feira, 6 de junho de 2013 19:43