В массив выводить данные-id клиента, данные серверу и данные, отправленные сервером - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Имеется клиент-серверное приложение, вопрос по стороне сервера. Имеется backgroundworker-bw_clientReceining:
Листинг программы
  1. TcpListener serverSocket = new TcpListener(8888);
  2. TcpClient clietnSocket = default(TcpClient);
  3.  
  4. serverSocket.Start();
  5. bw_clientReceining.ReportProgress(1);
  6. while (true | !bw_clientReceining.CancellationPending)
  7. {
  8. counterClient++;
  9. clietnSocket = serverSocket.AcceptTcpClient();
  10. bw_clientReceining.ReportProgress(2);
  11. handleClient client = new handleClient();
  12. client.startClient(clietnSocket, Convert.ToString(counterClient));
  13. Thread.Sleep(5000);
  14. DataClientToServerID.Add("");
  15. DataClientToServerStatus.Add("");
  16. DataServerTOClientStatus.Add("");
  17. }
  18. clietnSocket.Close();
  19. serverSocket.Stop();
и есть класс handleClient: Принимаем новых клиентов в классе:
Листинг программы
  1. public void startClient(TcpClient inClientSocket, string clientNO)
  2. {
  3. this.clientSocket = inClientSocket;
  4. clientNO = clientNO;
  5. Thread ctThread = new Thread(doChat);
  6. ctThread.Start();
  7. }
так же в классе есть функция общения doChat()-её код опустим Задача заключается вот в чём: Хочу в массив выводить данные-ид клиента, данные серверу и данные отправленные сервером. Смотрите, когда я завожу нового клиента, он в функцию startClient(TcpClient inClientSocket, string clientNO)-передаёт clientNO-то есть я думал это использовать в качестве идентификатора строки массива. Единственное решение, которое пришло в голову, это создать ещё один backgroundworker-bw_statusUp и в нём бесконечный цикл сделать, где мы будем получать свойство нашего класса. В класс handleClient добавил свойства:
Листинг программы
  1. public int ClientNo
  2. {
  3. get
  4. {
  5. return clientNO;
  6. }
  7. }
  8. public string ClientID
  9. {
  10. get
  11. {
  12. return clID;
  13. }
  14. }
Но я не учёл того, что в backgroundworker-bw_statusUp нет возможножности дотянуться до класса handleClient, так как он в другом backgroundworker потоке создан. Вопросы: 1. Правильно ли я думаю про то, как вытаскивать данные из потока, или есть какой-то более правильный способ. Если есть способ, подскажите его, а если нет, то подскажите, как дотянуться из потока backgroundworker-bw_statusUp до данных класса в потоке backgroundworker-bw_clientReceining. 2. В случае отключения клиента, как мы отключаем клиента
Листинг программы
  1. clientSocket.Close();
Верно? А как нам остановить именно тот поток, от которого отключился клиент. Не понимаю. Уважаемые, очень надеюсь на Вашу помощь. Спасибо.

Решение задачи: «В массив выводить данные-id клиента, данные серверу и данные, отправленные сервером»

textual
Листинг программы
  1.     class Server : BackgroundWorker
  2.     {
  3.         private TcpListener listener;
  4.         private List<Connection> connections;
  5.         private bool exit;
  6.  
  7.         public Server(int port)
  8.         {
  9.             listener = new TcpListener(IPAddress.Any, port);
  10.             listener.Start();
  11.         }
  12.  
  13.         private void Message(string message)
  14.         {
  15.             Console.Write(DateTime.Now.ToLongTimeString() + ": " + message);
  16.         }
  17.  
  18.         public void Broadcast(string message)
  19.         {
  20.             for (int i = 0; i < connections.Count; i++)
  21.             {
  22.                 if (connections[i].currentState == Connection.State.Authorized)
  23.                     connections[i].Write(message);
  24.             }
  25.         }
  26.  
  27.         protected override void OnDoWork(DoWorkEventArgs e)
  28.         {
  29.             Message("Сервер стартовал\n");
  30.  
  31.             while (true)
  32.             {
  33.                 Thread.Sleep(1);
  34.                 if (exit) return;
  35.  
  36.                 try
  37.                 {
  38.                     if (listener.Pending())
  39.                     {
  40.                         TcpClient client = listener.AcceptTcpClient();
  41.                         Message("Подключился клиент: " + client.Client.RemoteEndPoint.ToString() + "\n");
  42.                         Connection c = new Connection(client, this);
  43.                         connections.Add(c);
  44.                         c.onBroadcast += new EventHandler<ObjectEventArgs>(c_onBroadcast);
  45.                         c.onClose += new EventHandler<ObjectEventArgs>(c_onClose);
  46.                     }
  47.                 }
  48.                 catch (Exception err)
  49.                 {
  50.                     Message("Сервер сообщает об ошибке: " + err.Message + "\n");
  51.                     continue;
  52.                 }
  53.             }
  54.         }
  55.  
  56.         void c_onClose(object sender, ObjectEventArgs e)
  57.         {
  58.             Connection c = sender as Connection;
  59.             c.Exit();
  60.             connections.Remove(c);
  61.         }
  62.  
  63.         void c_onBroadcast(object sender, ObjectEventArgs e)
  64.         {
  65.             Broadcast(e.value.ToString());
  66.         }
  67.  
  68.         public void Exit()
  69.         {
  70.             exit = true;
  71.         }
  72.     }
  73.  
  74.     class Connection
  75.     {
  76.         public enum State
  77.         {
  78.             WaitForLogin = 0,
  79.             WaitForPassword = 1,
  80.             Authorized = 2
  81.         }
  82.         public State currentState { get; private set; }
  83.         private Server server;
  84.         private TcpClient client;
  85.         private NetworkStream stream;
  86.         private Thread communicatingThread;
  87.         private Random rnd;
  88.  
  89.         private byte[] sessionID;
  90.         private string ip;
  91.         private string port;
  92.         private int wrongPasswordsAttempt;
  93.         private bool exit;
  94.  
  95.         public event EventHandler<ObjectEventArgs> onBroadcast = delegate { };
  96.         public event EventHandler<ObjectEventArgs> onClose = delegate { };
  97.  
  98.         public Connection(TcpClient client, Server server)
  99.         {
  100.             currentState = State.WaitForLogin;
  101.             this.server = server;
  102.             this.client = client;
  103.             ip = ((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString();
  104.             port = ((IPEndPoint)client.Client.RemoteEndPoint).Port.ToString();
  105.             stream = client.GetStream();
  106.             communicatingThread = new Thread(new ThreadStart(Communicating));
  107.             communicatingThread.IsBackground = true;
  108.             communicatingThread.Start();
  109.             rnd = new Random();
  110.         }
  111.  
  112.         private void Message(string message)
  113.         {
  114.             Console.Write(DateTime.Now.ToLongTimeString() + ": " + message);
  115.         }
  116.  
  117.         private void Communicating()
  118.         {
  119.             string input = String.Empty;
  120.             byte[] message = new byte[0];
  121.  
  122.             Message("Поток соединения " + ip + ":" + port + " стартовал\n");
  123.  
  124.             while (true)
  125.             {
  126.                 if (exit) break;
  127.                 Thread.Sleep(1);
  128.  
  129.                 try
  130.                 {
  131.                     if (stream.CanRead)
  132.                     {
  133.                         message = new byte[0];
  134.                         if (stream.DataAvailable)
  135.                         {
  136.                             byte[] buffer = new byte[65535];
  137.  
  138.                             using (MemoryStream messageStream = new MemoryStream())
  139.                             {
  140.                                 while (stream.DataAvailable)
  141.                                 {
  142.                                     int bytesRead = stream.Read(buffer, 0, buffer.Length);
  143.                                     messageStream.Write(buffer, 0, bytesRead);
  144.                                 }
  145.  
  146.                                 message = messageStream.ToArray();
  147.                             }
  148.                         }
  149.  
  150.                         if (message.Length > 0)
  151.                         {
  152.                             switch (currentState)
  153.                             {
  154.                                 case State.WaitForLogin:
  155.                                     input = Encoding.UTF8.GetString(message);
  156.                                     CheckLogin(input);
  157.                                     break;
  158.  
  159.                                 case State.WaitForPassword:
  160.                                     CheckPassword(message);
  161.                                     break;
  162.  
  163.                                 case State.Authorized:
  164.                                     input = Encoding.UTF8.GetString(message);
  165.                                     Message(String.Format("[{0} {1}:{2}]: {3}\n", currentAccount.Login, ip, port, input));
  166.                                     onBroadcast(this, new ObjectEventArgs(String.Format("[{0}]: {1}\n", currentAccount.Login, input)));
  167.                                     break;
  168.  
  169.                                 default:
  170.                                     throw new Exception(String.Format("Соединение оказалось в неизвестном состоянии и будет закрыто\n"));
  171.                             }
  172.                         }
  173.                     }
  174.                     if (client.Client.Poll(0, SelectMode.SelectRead))
  175.                     {
  176.                         byte[] checkConn = new byte[1];
  177.                         if (client.Client.Receive(checkConn, SocketFlags.Peek) == 0)
  178.                         {
  179.                             Message("Клиент " + ip + ":" + port + " отключился\n");
  180.                             break;
  181.                         }
  182.                     }
  183.                 }
  184.                 catch (Exception err)
  185.                 {
  186.                     Message(String.Format("Соединение {0}:{1} сообщает об ошибке:{2}\n", ip, port, err.Message));
  187.                     break;
  188.                 }
  189.             }
  190.  
  191.             Message("Соединение " + ip + ":" + port + " закрывается\n");
  192.             stream.Close();
  193.             client.Close();
  194.             Message("Поток соединения " + ip + ":" + port + " завершился\n");
  195.             onClose(this, null);
  196.         }
  197.  
  198.         public void Write(string message)
  199.         {
  200.             try
  201.             {
  202.                 byte[] bytes = Encoding.UTF8.GetBytes(message);
  203.                 stream.Write(bytes, 0, bytes.Length);
  204.             }
  205.             catch (IOException) { return; }
  206.         }
  207.  
  208.         public void Write(byte[] buffer)
  209.         {
  210.             try
  211.             {
  212.                 stream.Write(buffer, 0, buffer.Length);
  213.             }
  214.             catch (IOException) { return; }
  215.         }
  216.  
  217.         public void Exit()
  218.         {
  219.             exit = true;
  220.         }
  221.     }
  222.  
  223.  
  224.     class ObjectEventArgs : EventArgs
  225.     {
  226.         public object value { get; private set; }
  227.  
  228.         public ObjectEventArgs(object arg)
  229.         {
  230.             value = arg;
  231.         }
  232.     }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы