Сервер на сокетах TCP - C#
Формулировка задачи:
Здравствуйте.Пробую по примеру сделать простенький чат на TCP. В клиенте отсылаю сообщения, но до сервера доходит только первое. В чем может быть проблема?
Сервер
Клиент
class Program { static int port = 8005; // порт для приема входящих запросов static void Main(string[] args) { // создаем сокет Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // получаем адреса для запуска сокета IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("192.168.137.1"), port); try { // связываем сокет с локальной точкой, по которой будем принимать данные socket.Bind(ipPoint); // начинаем прослушивание socket.Listen(2); Console.WriteLine("Сервер запущен. Ожидание подключений..."); while (true) { Socket handler = socket.Accept(); // ****************************************************************************** // получаем сообщение StringBuilder builder = new StringBuilder(); int bytes = 0; // количество полученных байтов byte[] data = new byte[256]; // буфер для получаемых данных do { bytes = handler.Receive(data); builder.Append(Encoding.Unicode.GetString(data, 0, bytes)); } while (handler.Available > 0); Console.WriteLine(DateTime.Now.ToShortTimeString() + ": " + builder.ToString()); // ****************************************************************************** // закрываем сокет handler.Shutdown(SocketShutdown.Both); handler.Close(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } }
namespace клиент { class Program { static void Main(string[] args) { try { Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("192.168.137.1"), 8005); // подключаемся к серверу socket.Connect(ipPoint); while (true) { // отправляем сообщение **************************** Console.Write("Введите сообщение:"); string message = Console.ReadLine(); byte[] data = Encoding.Unicode.GetBytes(message); socket.Send(data); //************************************************** } // закрываем сокет socket.Shutdown(SocketShutdown.Both); socket.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.Read(); } } }
Решение задачи: «Сервер на сокетах TCP»
textual
Листинг программы
namespace Server { class ClientState { public Socket Socket { get; } public byte[] Buffer { get; } public ClientState(Socket sock) { Socket = sock; Buffer = new byte[256]; } } class Program { static int port = 8005; static Socket socket; static void Main(string[] args) { socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Bind(new IPEndPoint(IPAddress.Any, port)); socket.Listen(100); Accept(); Console.ReadKey(); //socket.Shutdown(SocketShutdown.Both); //socket.Close(); } static void Accept() { socket.BeginAccept(AcceptCallback, null); } static void AcceptCallback(IAsyncResult res) { Socket handler = socket.EndAccept(res); Console.WriteLine("client connected: {0}", handler.RemoteEndPoint); Accept(); Receice(new ClientState(handler)); } static void Receice(ClientState client) { client.Socket.BeginReceive(client.Buffer, 0, client.Buffer.Length, SocketFlags.None, ReceiveCallback, client); } static void ReceiveCallback(IAsyncResult res) { ClientState client = (ClientState)res.AsyncState; int received; try { received = client.Socket.EndReceive(res); } catch (Exception exc) { Console.WriteLine(exc.Message); return; } if (received == 0) { Console.WriteLine("client disconnected"); return; } Receice(client); string message = Encoding.Unicode.GetString(client.Buffer, 0, received); Console.WriteLine("{0:HH:mm:ss}: {1}", DateTime.Now, message); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д