Клиент-серверное приложение на потоковом сокете TCP - C#

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

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

Хотел сделать связь между пользователями, вот тут http://professorweb.ru/my/csharp/web/level3/3_2.php подробно все написано, но если запускать 2 клиента, то с них надо отправлять данные по очереди, то есть при двух подключенных клиентах к серверу, с одного из них, не чего второй раз не отправляется, может кто-то знает, как это исправить? Сам сервер
Листинг программы
  1. // SocketServer.cs
  2. using System;
  3. using System.Text;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. namespace SocketServer
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. // Устанавливаем для сокета локальную конечную точку
  13. IPHostEntry ipHost = Dns.GetHostEntry("localhost");
  14. IPAddress ipAddr = ipHost.AddressList[0];
  15. IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);
  16. // Создаем сокет Tcp/Ip
  17. Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
  18. // Назначаем сокет локальной конечной точке и слушаем входящие сокеты
  19. try
  20. {
  21. sListener.Bind(ipEndPoint);
  22. sListener.Listen(10);
  23. // Начинаем слушать соединения
  24. while (true)
  25. {
  26. Console.WriteLine("Ожидаем соединение через порт {0}", ipEndPoint);
  27. // Программа приостанавливается, ожидая входящее соединение
  28. Socket handler = sListener.Accept();
  29. string data = null;
  30. // Мы дождались клиента, пытающегося с нами соединиться
  31. byte[] bytes = new byte[1024];
  32. int bytesRec = handler.Receive(bytes);
  33. data += Encoding.UTF8.GetString(bytes, 0, bytesRec);
  34. // Показываем данные на консоли
  35. Console.Write("Полученный текст: " + data + "\n\n");
  36. // Отправляем ответ клиенту\
  37. string reply = "Спасибо за запрос в " + data.Length.ToString()
  38. + " символов";
  39. byte[] msg = Encoding.UTF8.GetBytes(reply);
  40. handler.Send(msg);
  41. if (data.IndexOf("<TheEnd>") > -1)
  42. {
  43. Console.WriteLine("Сервер завершил соединение с клиентом.");
  44. break;
  45. }
  46. handler.Shutdown(SocketShutdown.Both);
  47. handler.Close();
  48. }
  49. }
  50. catch (Exception ex)
  51. {
  52. Console.WriteLine(ex.ToString());
  53. }
  54. finally
  55. {
  56. Console.ReadLine();
  57. }
  58. }
  59. }
  60. }
И клиент
Листинг программы
  1. // SocketClient.cs
  2. using System;
  3. using System.Text;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. namespace SocketClient
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. try
  13. {
  14. SendMessageFromSocket(11000);
  15. }
  16. catch (Exception ex)
  17. {
  18. Console.WriteLine(ex.ToString());
  19. }
  20. finally
  21. {
  22. Console.ReadLine();
  23. }
  24. }
  25. static void SendMessageFromSocket(int port)
  26. {
  27. // Буфер для входящих данных
  28. byte[] bytes = new byte[1024];
  29. // Соединяемся с удаленным устройством
  30. // Устанавливаем удаленную точку для сокета
  31. IPHostEntry ipHost = Dns.GetHostEntry("localhost");
  32. IPAddress ipAddr = ipHost.AddressList[0];
  33. IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, port);
  34. Socket sender = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
  35. // Соединяем сокет с удаленной точкой
  36. sender.Connect(ipEndPoint);
  37. Console.Write("Введите сообщение: ");
  38. string message = Console.ReadLine();
  39. Console.WriteLine("Сокет соединяется с {0} ", sender.RemoteEndPoint.ToString());
  40. byte[] msg = Encoding.UTF8.GetBytes(message);
  41. // Отправляем данные через сокет
  42. int bytesSent = sender.Send(msg);
  43. // Получаем ответ от сервера
  44. int bytesRec = sender.Receive(bytes);
  45. Console.WriteLine("\nОтвет от сервера: {0}\n\n", Encoding.UTF8.GetString(bytes, 0, bytesRec));
  46. // Используем рекурсию для неоднократного вызова SendMessageFromSocket()
  47. if (message.IndexOf("<TheEnd>") == -1)
  48. SendMessageFromSocket(port);
  49. // Освобождаем сокет
  50. sender.Shutdown(SocketShutdown.Both);
  51. sender.Close();
  52. }
  53. }
  54. }
up!

Решение задачи: «Клиент-серверное приложение на потоковом сокете TCP»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Net;
  6. using System.Net.Sockets;
  7. using System.Threading;
  8.  
  9. namespace SocketServer
  10. {
  11.     class Program
  12.     {
  13.         private static void Func(object o)
  14.         {
  15.             try
  16.             {
  17.                 Socket handler = (Socket) o;
  18.                 string data = null;
  19.                 // Мы дождались клиента, пытающегося с нами соединиться
  20.                 byte[] bytes = new byte[1024];
  21.                 int bytesRec = handler.Receive(bytes);
  22.  
  23.                 data += Encoding.UTF8.GetString(bytes, 0, bytesRec);
  24.  
  25.                 // Показываем данные на консоли
  26.                 Console.Write("Полученный текст: " + data + "\n\n");
  27.  
  28.                 // Отправляем ответ клиенту\
  29.                 string reply = "Спасибо за запрос в " + data.Length.ToString()
  30.                                + " символов";
  31.                 byte[] msg = Encoding.UTF8.GetBytes(reply);
  32.                 handler.Send(msg);
  33.  
  34.                 if (data.IndexOf("<TheEnd>") > -1)
  35.                 {
  36.                     Console.WriteLine("Сервер завершил соединение с клиентом.");
  37.  
  38.                 }
  39.                 handler.Shutdown(SocketShutdown.Both);
  40.                 handler.Close();
  41.             }
  42.  
  43.             catch (Exception e)
  44.             {
  45.  
  46.                 Console.WriteLine(e.Message);
  47.             }
  48.         }
  49.  
  50.         static void Main(string[] args)
  51.         {
  52.             // Устанавливаем для сокета локальную конечную точку
  53.             IPHostEntry ipHost = Dns.GetHostEntry("localhost");
  54.             IPAddress ipAddr = ipHost.AddressList[0];
  55.             IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);
  56.  
  57.             // Создаем сокет Tcp/Ip
  58.             Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
  59.            // sListener.SetSocketOption();
  60.  
  61.             // Назначаем сокет локальной конечной точке и слушаем входящие сокеты
  62.             try
  63.             {
  64.                
  65.                 sListener.Bind(ipEndPoint);
  66.                 sListener.Listen(10);
  67.                 Console.WriteLine("started " + sListener.LocalEndPoint.ToString());
  68.                 List<Thread> threads=new List<Thread>();
  69.                 while (true)
  70.                 {
  71.  
  72.                     Socket s = sListener.Accept();
  73.                     Console.WriteLine("New client Connected");
  74.                    threads.Add(new Thread(Func));
  75.                     threads.Last().IsBackground = true;
  76.                     threads.Last().Start(s);
  77.                 }
  78.             }
  79.             catch (Exception e)
  80.             {
  81.                 Console.WriteLine(e.Message);
  82.             }}
  83.     }
  84. }

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


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

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

14   голосов , оценка 4.357 из 5

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

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

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