2015-10-01 6 views
0

Я создал небольшую клиентскую программу, которая получит сообщение от сервера. Я хочу отключить клиента с сервера безопасно после получения сообщения (может возникнуть и другой случай, который, я хочу сравнить полученное значение с другим значением, и если они не совпадают, клиент будет отключен). Моя выборка код:Отключение клиента от сервера после получения сообщения в C# socket

using System; 
using System.Collections.Generic; 
using System.Net; 
using System.Net.Sockets; 
using System.IO; 
using System.Text; 
class Program 
{ 

    static void Main(string[] args) 
    { 
     try 
     {     
      TcpClient tcpClient = new TcpClient("127.0.0.1", 1234); 

      NetworkStream ns = tcpClient.GetStream(); 
      StreamReader sr = new StreamReader(ns); 
      StreamWriter sw = new StreamWriter(ns); 
      string data; 

      //receiving message 
      data = sr.ReadLine(); 
      Console.WriteLine(data); 

      //I want to disconnect here  
     } 
     catch (Exception e) 
     { 
      Console.Write(e.Message); 
     } 

     Console.Read(); 
    } 
} 

Какие дополнительные вещи мне нужно добавить?

ответ

0

Просто оберните использование экземпляра TcpClient и NetworkStream в использовании блока:

using(TcpClient tcpClient = new TcpClient("127.0.0.1", 1234)) 
using(NetworkStream ns = tcpClient.GetStream()) 
{ 
    // Do read here 
} 
+0

В чем разница между использованием блока и его использованием? @Ananke –

+0

Использование блока приведет к тому, что оба экземпляра будут удалены, когда они будут завершены, в этом случае закрытие TCP-соединения. Как правило, вы должны использовать блок использования для всех типов, реализующих IDisposable. Есть некоторые заметные исключения, например. Задача и задача , которые вам обычно не нужны. – Ananke

+0

Чтобы удовлетворить ваши измененные требования, проведите вокруг строк чтения блока, пока полученные данные не будут соответствовать ожидаемому значению. – Ananke

0

Я бы структурировать ваш код более как:

using (var tcpClient = new TcpClient("127.0.0.1", 1234)) 
{ 
    using(var ns = tcpClient.GetStream()) 
    { 
     StreamReader sr = new StreamReader(ns); 
     StreamWriter sw = new StreamWriter(ns); 
     string data; 

     //receiving message 
     data = sr.ReadLine(); 

     if(data == somePreDeterminedValue) 
     { 
      Console.WriteLine(data); 
     } 
    } 
} 

Это будет означать, что, когда вы нажмете закрытия она автоматически закрывает TCPClient и NetworkStream для вас и удаляет их экземпляры.

В этом случае, если значение, которое вы получаете из потока, является правильным, оно не будет отключено, просто. Я думаю, вам нужно будет предоставить то, что вы хотите сделать в целом, для полного ответа на свой вопрос, как в этих простых терминах, что я бы сделал, но в этом примере TCPClient закрыт независимо.

В приложении реального мира вы, по сути, хотите сохранить поле TCPClient, которое вы открываете и закрываете по всему приложению, и удаляете его только при размещении объекта обмена сообщениями.

+0

Я немного отредактировал сообщение @Stephen Ross Как я буду отключать клиента охотно, если полученное значение не соответствует заданному значению? –

+0

Это немного другой вопрос. В этом случае я немного отредактирую свой ответ. –

+0

есть ли способ отключиться, используя tcpclient.close() или ns.close() или такие вещи? @Stephen Ross –

Смежные вопросы