Клиент-серверное приложение на потоковом сокете TCP - C#
Формулировка задачи:
Хотел сделать связь между пользователями, вот тут http://professorweb.ru/my/csharp/web/level3/3_2.php подробно все написано, но если запускать 2 клиента, то с них надо отправлять данные по очереди, то есть при двух подключенных клиентах к серверу, с одного из них, не чего второй раз не отправляется, может кто-то знает, как это исправить?
Сам сервер
И клиент
// SocketServer.cs using System; using System.Text; using System.Net; using System.Net.Sockets; namespace SocketServer { class Program { static void Main(string[] args) { // Устанавливаем для сокета локальную конечную точку IPHostEntry ipHost = Dns.GetHostEntry("localhost"); IPAddress ipAddr = ipHost.AddressList[0]; IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000); // Создаем сокет Tcp/Ip Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp); // Назначаем сокет локальной конечной точке и слушаем входящие сокеты try { sListener.Bind(ipEndPoint); sListener.Listen(10); // Начинаем слушать соединения while (true) { Console.WriteLine("Ожидаем соединение через порт {0}", ipEndPoint); // Программа приостанавливается, ожидая входящее соединение Socket handler = sListener.Accept(); string data = null; // Мы дождались клиента, пытающегося с нами соединиться byte[] bytes = new byte[1024]; int bytesRec = handler.Receive(bytes); data += Encoding.UTF8.GetString(bytes, 0, bytesRec); // Показываем данные на консоли Console.Write("Полученный текст: " + data + "\n\n"); // Отправляем ответ клиенту\ string reply = "Спасибо за запрос в " + data.Length.ToString() + " символов"; byte[] msg = Encoding.UTF8.GetBytes(reply); handler.Send(msg); if (data.IndexOf("<TheEnd>") > -1) { Console.WriteLine("Сервер завершил соединение с клиентом."); break; } handler.Shutdown(SocketShutdown.Both); handler.Close(); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } finally { Console.ReadLine(); } } } }
// SocketClient.cs using System; using System.Text; using System.Net; using System.Net.Sockets; namespace SocketClient { class Program { static void Main(string[] args) { try { SendMessageFromSocket(11000); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } finally { Console.ReadLine(); } } static void SendMessageFromSocket(int port) { // Буфер для входящих данных byte[] bytes = new byte[1024]; // Соединяемся с удаленным устройством // Устанавливаем удаленную точку для сокета IPHostEntry ipHost = Dns.GetHostEntry("localhost"); IPAddress ipAddr = ipHost.AddressList[0]; IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, port); Socket sender = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp); // Соединяем сокет с удаленной точкой sender.Connect(ipEndPoint); Console.Write("Введите сообщение: "); string message = Console.ReadLine(); Console.WriteLine("Сокет соединяется с {0} ", sender.RemoteEndPoint.ToString()); byte[] msg = Encoding.UTF8.GetBytes(message); // Отправляем данные через сокет int bytesSent = sender.Send(msg); // Получаем ответ от сервера int bytesRec = sender.Receive(bytes); Console.WriteLine("\nОтвет от сервера: {0}\n\n", Encoding.UTF8.GetString(bytes, 0, bytesRec)); // Используем рекурсию для неоднократного вызова SendMessageFromSocket() if (message.IndexOf("<TheEnd>") == -1) SendMessageFromSocket(port); // Освобождаем сокет sender.Shutdown(SocketShutdown.Both); sender.Close(); } } }
up!
Решение задачи: «Клиент-серверное приложение на потоковом сокете TCP»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; namespace SocketServer { class Program { private static void Func(object o) { try { Socket handler = (Socket) o; string data = null; // Мы дождались клиента, пытающегося с нами соединиться byte[] bytes = new byte[1024]; int bytesRec = handler.Receive(bytes); data += Encoding.UTF8.GetString(bytes, 0, bytesRec); // Показываем данные на консоли Console.Write("Полученный текст: " + data + "\n\n"); // Отправляем ответ клиенту\ string reply = "Спасибо за запрос в " + data.Length.ToString() + " символов"; byte[] msg = Encoding.UTF8.GetBytes(reply); handler.Send(msg); if (data.IndexOf("<TheEnd>") > -1) { Console.WriteLine("Сервер завершил соединение с клиентом."); } handler.Shutdown(SocketShutdown.Both); handler.Close(); } catch (Exception e) { Console.WriteLine(e.Message); } } static void Main(string[] args) { // Устанавливаем для сокета локальную конечную точку IPHostEntry ipHost = Dns.GetHostEntry("localhost"); IPAddress ipAddr = ipHost.AddressList[0]; IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000); // Создаем сокет Tcp/Ip Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp); // sListener.SetSocketOption(); // Назначаем сокет локальной конечной точке и слушаем входящие сокеты try { sListener.Bind(ipEndPoint); sListener.Listen(10); Console.WriteLine("started " + sListener.LocalEndPoint.ToString()); List<Thread> threads=new List<Thread>(); while (true) { Socket s = sListener.Accept(); Console.WriteLine("New client Connected"); threads.Add(new Thread(Func)); threads.Last().IsBackground = true; threads.Last().Start(s); } } catch (Exception e) { Console.WriteLine(e.Message); }} } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д