Многопоточные сокеты без очереди - 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(); } }); }
Решение задачи: «Многопоточные сокеты без очереди»
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); } }); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д