Многопоточные сокеты без очереди - 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);
}
});
}