Асинхронный сокет: подключение нескольких клиентов - C#
Формулировка задачи:
Как сделать что-бы к серверу подключалось сразу несколько клиентов. Что я не так сделал? Как это исправить?
class Program { public static void ReceiveCallback(IAsyncResult AsyncCall) { string nameDoname; //имя домена int port; //порт сайта System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); // byte[] messageSend = Encoding.UTF8.GetBytes("Занят"); byte[] messageRecv = new byte[124]; Socket listener = (Socket)AsyncCall.AsyncState; Socket client = listener.EndAccept(AsyncCall); Console.WriteLine("Client: " + client.RemoteEndPoint.ToString()); string Recv = null; while (true) { int length = client.Receive(messageRecv); string rec = Encoding.UTF8.GetString(messageRecv); Recv = Recv + rec; if (length < 124) { //Console.WriteLine(Recv); break; } } //Console.WriteLine(Recv); string host; string[] hostPort; //вычисляем имя хоста с принятых данных и порт если он имеется if(Host(Recv, out host)) { hostPort = host.Split(':'); nameDoname = hostPort[0]; if (hostPort.Length > 1) { if (hostPort[1] == null) port = 80; else port = Int32.Parse(hostPort[1]); } else port = 80; Console.WriteLine("host: {0}\n port: {1}", nameDoname, port); Connect(port, nameDoname, Recv, client); } Console.WriteLine("Закрытие соединения " + host); client.Close(); // listener.BeginAccept(new AsyncCallback(ReceiveCallback), listener); } public static void Main() { try { IPAddress localAddress = IPAddress.Parse("127.0.0.1"); Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipEndpoint = new IPEndPoint(localAddress, 2200); listenSocket.Bind(ipEndpoint); listenSocket.Listen(1); listenSocket.BeginAccept(new AsyncCallback(ReceiveCallback), listenSocket); Console.WriteLine("Ожидание соединения… {0}", listenSocket.LocalEndPoint); while (true) { listenSocket.BeginAccept(new AsyncCallback(ReceiveCallback), listenSocket); } } catch (Exception e) { Console.WriteLine("Произошла ошибка: {0}", e.ToString()); } } public static void Connect(int port, string nameDoname, string recv1, Socket clientRecv) { byte[] recv = Encoding.UTF8.GetBytes(recv1); byte[] ipByte = new byte[4]; int[] ipInt = new int[4]; byte[] messageRead; byte[] messageReadchank; string prowNaSimv = nameDoname.Substring(nameDoname.Length - 1); if (prowNaSimv == "\r") { nameDoname = nameDoname.Substring(0, nameDoname.Length - 1); } string ip = Dns.GetHostEntry(nameDoname).AddressList[0].ToString(); Console.WriteLine(ip); TcpClient client = new TcpClient(); string[] ipName = ip.Split('.'); for (int i = 0; i < ipName.Length; i++) { ipInt[i] = Int32.Parse(ipName[i]); ipByte[i] = Convert.ToByte(ipInt[i]); } try { client.Connect(new IPAddress(ipByte), port); NetworkStream stream = client.GetStream(); stream.Write(recv, 0, recv.Length); //отправляем данные на сайт которые пришли с браузера int byteRead; while (true) { try { byteRead = 0; messageRead = new byte[1024]; byteRead = stream.Read(messageRead, 0, messageRead.Length); //считываем данные string Recv = Encoding.UTF8.GetString(messageRead); messageReadchank = new byte[byteRead]; messageReadchank = messageRead; clientRecv.Send(messageReadchank, byteRead, SocketFlags.None); //передаём данные if (byteRead < 1024) { client.Close(); break; } Thread.Sleep(100); } catch (Exception) { client.Close(); break; // Console.WriteLine(e.ToString()); } } Console.WriteLine("Передали."); } catch (Exception e) { } } public static bool Host(string line, out string host) { string[] adresSplit = line.Split('\n'); if (line == null) { throw new ArgumentNullException("null"); } host = null; for (int i = 0; i < adresSplit.Length; i++) { if (adresSplit[i].StartsWith("Host: ")) { host = adresSplit[i].Substring("Host: ".Length); return true; } } return false; } }
Решение задачи: «Асинхронный сокет: подключение нескольких клиентов»
textual
Листинг программы
listenSocket.Listen(1);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д