Асинхронный сокет: подключение нескольких клиентов - C#

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

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

Как сделать что-бы к серверу подключалось сразу несколько клиентов. Что я не так сделал? Как это исправить?
Листинг программы
  1. class Program
  2. {
  3. public static void ReceiveCallback(IAsyncResult AsyncCall)
  4. {
  5. string nameDoname; //имя домена
  6. int port; //порт сайта
  7. System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
  8. // byte[] messageSend = Encoding.UTF8.GetBytes("Занят");
  9. byte[] messageRecv = new byte[124];
  10. Socket listener = (Socket)AsyncCall.AsyncState;
  11. Socket client = listener.EndAccept(AsyncCall);
  12. Console.WriteLine("Client: " + client.RemoteEndPoint.ToString());
  13. string Recv = null;
  14. while (true)
  15. {
  16. int length = client.Receive(messageRecv);
  17. string rec = Encoding.UTF8.GetString(messageRecv);
  18. Recv = Recv + rec;
  19. if (length < 124)
  20. {
  21. //Console.WriteLine(Recv);
  22. break;
  23. }
  24. }
  25. //Console.WriteLine(Recv);
  26. string host;
  27. string[] hostPort;
  28. //вычисляем имя хоста с принятых данных и порт если он имеется
  29. if(Host(Recv, out host))
  30. {
  31. hostPort = host.Split(':');
  32. nameDoname = hostPort[0];
  33. if (hostPort.Length > 1)
  34. {
  35. if (hostPort[1] == null)
  36. port = 80;
  37. else
  38. port = Int32.Parse(hostPort[1]);
  39. }
  40. else
  41. port = 80;
  42. Console.WriteLine("host: {0}\n port: {1}", nameDoname, port);
  43. Connect(port, nameDoname, Recv, client);
  44. }
  45. Console.WriteLine("Закрытие соединения " + host);
  46. client.Close();
  47. // listener.BeginAccept(new AsyncCallback(ReceiveCallback), listener);
  48. }
  49. public static void Main()
  50. {
  51. try
  52. {
  53. IPAddress localAddress = IPAddress.Parse("127.0.0.1");
  54. Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  55. IPEndPoint ipEndpoint = new IPEndPoint(localAddress, 2200);
  56. listenSocket.Bind(ipEndpoint);
  57. listenSocket.Listen(1);
  58. listenSocket.BeginAccept(new AsyncCallback(ReceiveCallback), listenSocket);
  59. Console.WriteLine("Ожидание соединения… {0}", listenSocket.LocalEndPoint);
  60. while (true)
  61. {
  62. listenSocket.BeginAccept(new AsyncCallback(ReceiveCallback), listenSocket);
  63. }
  64. }
  65. catch (Exception e)
  66. {
  67. Console.WriteLine("Произошла ошибка: {0}", e.ToString());
  68. }
  69. }
  70. public static void Connect(int port, string nameDoname, string recv1, Socket clientRecv)
  71. {
  72. byte[] recv = Encoding.UTF8.GetBytes(recv1);
  73. byte[] ipByte = new byte[4];
  74. int[] ipInt = new int[4];
  75. byte[] messageRead;
  76. byte[] messageReadchank;
  77. string prowNaSimv = nameDoname.Substring(nameDoname.Length - 1);
  78. if (prowNaSimv == "\r")
  79. {
  80. nameDoname = nameDoname.Substring(0, nameDoname.Length - 1);
  81. }
  82. string ip = Dns.GetHostEntry(nameDoname).AddressList[0].ToString();
  83. Console.WriteLine(ip);
  84. TcpClient client = new TcpClient();
  85. string[] ipName = ip.Split('.');
  86. for (int i = 0; i < ipName.Length; i++)
  87. {
  88. ipInt[i] = Int32.Parse(ipName[i]);
  89. ipByte[i] = Convert.ToByte(ipInt[i]);
  90. }
  91. try
  92. {
  93. client.Connect(new IPAddress(ipByte), port);
  94. NetworkStream stream = client.GetStream();
  95. stream.Write(recv, 0, recv.Length); //отправляем данные на сайт которые пришли с браузера
  96. int byteRead;
  97. while (true)
  98. {
  99. try
  100. {
  101. byteRead = 0;
  102. messageRead = new byte[1024];
  103. byteRead = stream.Read(messageRead, 0, messageRead.Length); //считываем данные
  104. string Recv = Encoding.UTF8.GetString(messageRead);
  105. messageReadchank = new byte[byteRead];
  106. messageReadchank = messageRead;
  107. clientRecv.Send(messageReadchank, byteRead, SocketFlags.None); //передаём данные
  108. if (byteRead < 1024)
  109. {
  110. client.Close();
  111. break;
  112. }
  113. Thread.Sleep(100);
  114. }
  115. catch (Exception)
  116. {
  117. client.Close();
  118. break;
  119. // Console.WriteLine(e.ToString());
  120. }
  121. }
  122. Console.WriteLine("Передали.");
  123. }
  124. catch (Exception e) { }
  125. }
  126.  
  127. public static bool Host(string line, out string host)
  128. {
  129. string[] adresSplit = line.Split('\n');
  130. if (line == null)
  131. {
  132. throw new ArgumentNullException("null");
  133. }
  134. host = null;
  135. for (int i = 0; i < adresSplit.Length; i++)
  136. {
  137. if (adresSplit[i].StartsWith("Host: "))
  138. {
  139. host = adresSplit[i].Substring("Host: ".Length);
  140. return true;
  141. }
  142. }
  143. return false;
  144. }
  145. }

Решение задачи: «Асинхронный сокет: подключение нескольких клиентов»

textual
Листинг программы
  1. listenSocket.Listen(1);

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


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

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

15   голосов , оценка 3.933 из 5

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

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

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