Сервер на сокетах 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);
}
}
}