2016-06-16 1 views
0

Я пытаюсь сделать связь с клиентским сервером с помощью C#. Я заставил клиента и сервер взаимодействовать друг с другом. Но проблема, с которой я столкнулся, заключается в том, как мне прекратить общение?Прекращение связи на клиентском сервере с помощью C#

Условие: сервер всегда должен прослушиваться (когда несколько клиентов присутствуют.) (В настоящее время я использую один клиент). Клиент должен иметь условие остановки или выхода (то есть, когда клиент отправляет «выход», клиент должен прекратить работу, сервер все равно должен слушать других клиентов), когда он завершит передачу данных.

Я новичок в C#. Пробовал поиск в google. но не нашел то, что мне нужно.

Часть моего кода:

Сервер:

 try 
     { 
      IPAddress addr = IPAddress.Parse("127.0.0.1"); 
      string a = "recieved by server"; 
      TcpListener Receiver = new TcpListener(addr, 1234); 
      Receiver.Start(); 
      Console.WriteLine("trying to connect to " + addr); 
      Socket s = Receiver.AcceptSocket(); 
      Console.WriteLine("Connected"); 
      while (true) 
      { 
       byte[] b = new byte[100]; 
       int k = s.Receive(b); 
       char[] chars = new char[b.Length/sizeof(char)]; 
       System.Buffer.BlockCopy(b, 0, chars, 0, b.Length); 
       string dataReceived = new string(chars); 
       Console.WriteLine(dataReceived); 
       byte[] bw = new byte[a.Length * sizeof(char)]; 
       System.Buffer.BlockCopy(a.ToCharArray(), 0, bw, 0, bw.Length); 
       Console.WriteLine("sending Acknowledgement to client"); 
       s.Send(bw); 
      } 

      //Receiver.Stop(); 
     } 

Клиент:

 try 
     { 
      TcpClient TcpC = new TcpClient(); 
      TcpC.Connect("127.0.0.1", 1234); 
      while (true) 
      { 
       Console.WriteLine("enter somethiong to send"); 
       String s = Console.ReadLine(); 
       NetworkStream CStream = TcpC.GetStream(); 
       byte[] bw = new byte[s.Length * sizeof(char)]; 
       System.Buffer.BlockCopy(s.ToCharArray(), 0, bw, 0, bw.Length); 
       Console.WriteLine("Transmit"); 
       CStream.Write(bw, 0, bw.Length); 
       if (s == "exit") 
       { 
        CStream.Flush(); 
        CStream.Close(); 
        TcpC.Close(); 
        break; 
       } 
       byte[] br = new byte[100]; 
       int k = CStream.Read(br, 0, 100); 
       char[] chars = new char[br.Length/sizeof(char)]; 
       System.Buffer.BlockCopy(br, 0, chars, 0, br.Length); 
       string ackReceived = new string(chars); 
       Console.WriteLine(ackReceived); 
      } 

      //TcpC.Close(); 
     } 

ответ

0

После того, как вы приняли сокет-соединение от клиента с помощью Socket s = Receiver.AcceptSocket(); вам нужно положить ваши команды обработки логики в ваш блок while (true) { } в каком-то другом потоке (используя Task или Thread), а затем вы ould начнет принимать новое подключение сокета, используя Receiver.AcceptSocket();.

+0

изменил программу Accoding, что сказал Ozmo. Но я понятия не имею о потоках. Можете ли вы привести пример того, как я могу изменить свою программу? –

0

Проблема заключается вы делаете

Receiver.Stop(); 

, когда он должен быть сокет вы закрываете.

Идея заключается в том, что вы создаете новый сокет для обработки каждый раз, когда клиент подключается - и это соединение, которое вы завершаете, а не основной разъем для прослушивания.

Существует хороший пример кода здесь:

https://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener(v=vs.110).aspx

+0

изменил программу с условием выхода. Но теперь сервер закрывается, а не клиент –