none
Aplicação Servidor - Saber se cliente desconectou RRS feed

  • Pergunta

  • Bom dia a todos!

    Estou fazendo uma aplicação servidor onde vou receber dados de um aparelho gps. Conforme vou estudando vão surgindo duvidas.

    No momento estou com duas duvidas que são:

    1° - Como saber se o gps desconectou do servidor.

    2º - Eu preciso de uma forma de o servidor ficar sempre lendo dados que chegam do gps, fiz isso com um loop mas não deu certo porque trava o form.Preciso de algo que a cada vez que ele receber dados o mapa seja atualizado com latitude e longitude, e outros dados que vou receber como velocidade e altura.

    Grato pela atenção.

    quinta-feira, 19 de agosto de 2010 15:21

Respostas

  • Gustavo,

    Fiz um exemplo usando o BackGroundWorker, espero que te ajude...

      private BackgroundWorker Worker = null;
    
      private void StartTCPListener()
      {
       if (this.Worker == null)
       {
        this.Worker = new BackgroundWorker();
        this.Worker.WorkerReportsProgress = true;
        this.Worker.WorkerSupportsCancellation = true;
        this.Worker.DoWork += new DoWorkEventHandler(DoWork);
        this.Worker.ProgressChanged += new ProgressChangedEventHandler(DoProgressChanged);
       }
    
       // verifica se está executando...
       if (!this.Worker.IsBusy)
        this.Worker.RunWorkerAsync();
      }
    
      private void StopTCPListener()
      {
       if (this.Worker != null)
        this.Worker.CancelAsync();
      }
    
      private void DoWork(object sender, DoWorkEventArgs e)
      {
       // inicializa o TcpListener...
       System.Net.IPAddress localaddr = System.Net.IPAddress.Parse("127.0.0.1");
       System.Net.Sockets.TcpListener MainServer = new System.Net.Sockets.TcpListener(localaddr, 9000);
    
       // inicializa as variáveis para leitura do listener...
       Byte[] bytes = new Byte[1024];
       String data = null; 
       
       // loop de leitura...
       while (true)
       {
        // verifica se não cancelou...
        if (this.Worker.CancellationPending)
         return;
    
        // espera a conexão do client...
        System.Net.Sockets.TcpClient client = MainServer.AcceptTcpClient();
    
        // limpa os buffers...
        data = null;
    
        // pega o stream do client...
        System.Net.Sockets.NetworkStream stream = client.GetStream();
    
        int i;
        
        // loop para receber os dados do cliente...
        while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
        {
         // verifica se não cancelou...
         if (this.Worker.CancellationPending)
          return;
    
         // pega o texto...
         data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
    
         // atualiza o form...
         this.Worker.ReportProgress(0, data);
        }
       }
      }
    
      private void DoProgressChanged(object sender, ProgressChangedEventArgs e)
      {
       // pega os dados lidos...
       string data = Convert.ToString(e.UserState);
       // atualiza o form...
    
      }
    
    

    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    quinta-feira, 19 de agosto de 2010 16:26

Todas as Respostas

  • Gustavo,

    O que você esta usando para o Servidor?

    Dependendo, você deve criar um Thread separada para receber os dados do GPS e depois atualiza o Form.

    Qualquer coisa, confira a minha resposta neste post sobre Threads:

    http://social.msdn.microsoft.com/Forums/pt-BR/vscsharppt/thread/6759ef20-b852-4a08-97df-d8e1cc6eec20

    At.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    quinta-feira, 19 de agosto de 2010 15:38
  • Ahh sim estou usando TCPListener, para o servidor.
    quinta-feira, 19 de agosto de 2010 16:12
  • Gustavo,

    Fiz um exemplo usando o BackGroundWorker, espero que te ajude...

      private BackgroundWorker Worker = null;
    
      private void StartTCPListener()
      {
       if (this.Worker == null)
       {
        this.Worker = new BackgroundWorker();
        this.Worker.WorkerReportsProgress = true;
        this.Worker.WorkerSupportsCancellation = true;
        this.Worker.DoWork += new DoWorkEventHandler(DoWork);
        this.Worker.ProgressChanged += new ProgressChangedEventHandler(DoProgressChanged);
       }
    
       // verifica se está executando...
       if (!this.Worker.IsBusy)
        this.Worker.RunWorkerAsync();
      }
    
      private void StopTCPListener()
      {
       if (this.Worker != null)
        this.Worker.CancelAsync();
      }
    
      private void DoWork(object sender, DoWorkEventArgs e)
      {
       // inicializa o TcpListener...
       System.Net.IPAddress localaddr = System.Net.IPAddress.Parse("127.0.0.1");
       System.Net.Sockets.TcpListener MainServer = new System.Net.Sockets.TcpListener(localaddr, 9000);
    
       // inicializa as variáveis para leitura do listener...
       Byte[] bytes = new Byte[1024];
       String data = null; 
       
       // loop de leitura...
       while (true)
       {
        // verifica se não cancelou...
        if (this.Worker.CancellationPending)
         return;
    
        // espera a conexão do client...
        System.Net.Sockets.TcpClient client = MainServer.AcceptTcpClient();
    
        // limpa os buffers...
        data = null;
    
        // pega o stream do client...
        System.Net.Sockets.NetworkStream stream = client.GetStream();
    
        int i;
        
        // loop para receber os dados do cliente...
        while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
        {
         // verifica se não cancelou...
         if (this.Worker.CancellationPending)
          return;
    
         // pega o texto...
         data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
    
         // atualiza o form...
         this.Worker.ReportProgress(0, data);
        }
       }
      }
    
      private void DoProgressChanged(object sender, ProgressChangedEventArgs e)
      {
       // pega os dados lidos...
       string data = Convert.ToString(e.UserState);
       // atualiza o form...
    
      }
    
    

    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    quinta-feira, 19 de agosto de 2010 16:26
  • Comecei a escrever esse exeplo pra dar uma estudada, e na seguinte linha da erro:

    this.Worker.DoWork += new DoWorkEventHandler(DoWork);

    diz que o DoWork entre parenteses não existe no texto, sera que falta alguma diretiva using ou coisa do tipo?

    Grato pela atenção!

    sexta-feira, 20 de agosto de 2010 12:46
  • Gustavo,

    O método DoWork está no código que te passei...

      private void DoWork(object sender, DoWorkEventArgs e)

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    sexta-feira, 20 de agosto de 2010 12:54
  • Muito obrigado Rogerio, fiz aqui e deu pra compreender o funcionamento, e atende a exatamente ao que eu precisava.

    Valew Um abraço!

    sexta-feira, 20 de agosto de 2010 13:58