Многопоточные сокеты без очереди - C#

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

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

Socket socket;
        Socket s;
        public void start()
        {
            try
            {
                //создаем сокет
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                tb.Text += "\n" + DateTime.Now + ": Server start.";
            }
            catch { enabled.Text = "Запуск"; tb.Text += "\n" + DateTime.Now + ": Server starting error."; }
            //запускаем сокет в отдельном потоке
            ThreadPool.QueueUserWorkItem(
                (o) =>
                {
                    //привязываем сокет к порту
                    socket.Bind(new IPEndPoint(IPAddress.Any, 81));
                    //стартуем прослушку 
                    socket.Listen(0);
                    //бесконечный цикл приема коннектов клиентов
                    while (true)
                    {
                        //ждем пока приконектится клиент
                        s = socket.Accept();
                        BeginInvoke(
                            new MethodInvoker(() =>
                            {
                                tb.Text += "\n" + DateTime.Now + ": Connect to socket.";
                            }));
                        while (true)
                        {
                            try
                            {
                                //читаем данные от клиента
                                byte[] buffer = new byte[1024];
                                int recived = s.Receive(buffer);
                                string message = Encoding.ASCII.GetString(buffer, 0, recived);
                                string messageup = null;
                                if (message == "CLOSE") messageup = "Close Socket."; else 
                                messageup = Server.Command(message);
                                //отправлем ответ клиенту
                                s.Send(Encoding.ASCII.GetBytes(messageup));
                                //заносим принятые данные в textBox, вызывая присвоение в главном потоке
                                BeginInvoke(
                                    new MethodInvoker(() =>
                                    {
                                        tb.Text += "\n" + DateTime.Now + ": <- " + message;
                                        tb.Text += "\n" + DateTime.Now + ": -> " + messageup;
 
                                    }));
                            }
                            catch { break; }}
                        s.Close();
                    }
                });
        }
когда один клиент подключаешь то всё ок.. Они могут общатся бесконечно друг с другом. Но! Когда подключаешь ещё 1 пока предедущий конект сервером не закрыт то второй будет в очереди почемуто... Вопрос.. Как мне сделать так что бы можно было много потоков открыть одновременно и поддержить их а также из 1 потока посылать инфу в другой поток... Тоесть какнибудь наименовать каждый поток.. Например по имени пользователя - s["SkoT"].Send....... s["cyber"].Send.......

Решение задачи: «Многопоточные сокеты без очереди»

textual
Листинг программы
// где то в классе 
  private void DoCommunication(Socket forCurConnection)
  {
         while (true)
                        {
                            try
                            {
                                //читаем данные от клиента
                                byte[] buffer = new byte[1024];
                                int recived = forCurConnection.Receive(buffer);
                                string message = Encoding.ASCII.GetString(buffer, 0, recived);
                                string messageup = null;
                                if (message == "CLOSE") messageup = "Close Socket."; else 
                                messageup = Server.Command(message);
                                //отправлем ответ клиенту
                                forCurConnection.Send(Encoding.ASCII.GetBytes(messageup));
                                //заносим принятые данные в textBox, вызывая присвоение в главном потоке
                                BeginInvoke(
                                    new MethodInvoker(() =>
                                    {
                                        tb.Text += "\n" + DateTime.Now + ": <- " + message;
                                        tb.Text += "\n" + DateTime.Now + ": -> " + messageup;
 
                                    }));
                            }
                            catch { break; }}
                        forCurConnection.Close();
   
  }
 
 Action<Socket> ActionCommunication = new Action<Socket>(DoCommunication);
----------------------------
Socket socket;
        Socket s;
        public void start()
        {
            try
            {
                //создаем сокет
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                tb.Text += "\n" + DateTime.Now + ": Server start.";
            }
            catch { enabled.Text = "Запуск"; tb.Text += "\n" + DateTime.Now + ": Server starting error."; }
            //запускаем сокет в отдельном потоке
            ThreadPool.QueueUserWorkItem(
                (o) =>
                {
                    //привязываем сокет к порту
                    socket.Bind(new IPEndPoint(IPAddress.Any, 81));
                    //стартуем прослушку 
                    socket.Listen(0);
                    //бесконечный цикл приема коннектов клиентов
                    while (true)
                    {
                        //ждем пока приконектится клиент
                        s = socket.Accept();
                        BeginInvoke(
                            new MethodInvoker(() =>
                            {
                                tb.Text += "\n" + DateTime.Now + ": Connect to socket.";
                            }));
                            ActionCommunication.BeginInvoke(s,null,null);
                      
                    }
                });
        }

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


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

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

6   голосов , оценка 3.667 из 5
Похожие ответы