Usuário com melhor resposta
Aplicação Servidor - Saber se cliente desconectou

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.
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)- Sugerido como Resposta AndreAlvesLimaModerator quinta-feira, 19 de agosto de 2010 20:29
- Marcado como Resposta GustavoCarlos sexta-feira, 20 de agosto de 2010 13:58
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) -
-
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)- Sugerido como Resposta AndreAlvesLimaModerator quinta-feira, 19 de agosto de 2010 20:29
- Marcado como Resposta GustavoCarlos sexta-feira, 20 de agosto de 2010 13:58
-
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!
-
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) -