Сервер сокета в C#
Сервер TCP в C# - это TcpListener
на выбранном адресе и порту.
После Start метод AcceptTcpClientAsync
ждёт клиента и возвращает TcpClient.
Чтение и запись идут через NetworkStream;
объекты закрывают через using.
Примем одного клиента по адресу 127.0.0.1 и порту
18080, прочитаем строку "hello" и отправим
ответ с префиксом "echo: ":
using System.Net;
using System.Net.Sockets;
using System.Text;
Task server = Task.Run(async () =>
{
TcpListener listener = new(IPAddress.Loopback, 18080);
listener.Start();
using TcpClient peer = await listener.AcceptTcpClientAsync();
using NetworkStream stream = peer.GetStream();
byte[] buf = new byte[256];
int n = await stream.ReadAsync(buf);
string line = Encoding.UTF8.GetString(buf, 0, n).TrimEnd();
await stream.WriteAsync(Encoding.UTF8.GetBytes("echo: " + line + "\n"));
Console.WriteLine("echo: " + line); // выведет "echo: hello"
listener.Stop();
});
await Task.Delay(30);
using TcpClient client = new();
await client.ConnectAsync("127.0.0.1", 18080);
using NetworkStream stream = client.GetStream();
await stream.WriteAsync(Encoding.UTF8.GetBytes("hello\n"));
await server;
Схема та же: один приём, одно чтение и один
ответ. Во втором примере ответ печатает
клиент. Сервер вернет строку с префиксом
"ok: ":
using System.Net;
using System.Net.Sockets;
using System.Text;
Task server = Task.Run(async () =>
{
TcpListener listener = new(IPAddress.Loopback, 18080);
listener.Start();
using TcpClient peer = await listener.AcceptTcpClientAsync();
using NetworkStream stream = peer.GetStream();
byte[] buf = new byte[256];
int n = await stream.ReadAsync(buf);
string line = Encoding.UTF8.GetString(buf, 0, n).TrimEnd();
await stream.WriteAsync(Encoding.UTF8.GetBytes("ok: " + line + "\n"));
listener.Stop();
});
await Task.Delay(30);
using TcpClient client = new();
await client.ConnectAsync("127.0.0.1", 18080);
using NetworkStream stream = client.GetStream();
await stream.WriteAsync(Encoding.UTF8.GetBytes("ready\n"));
byte[] buf = new byte[256];
int got = await stream.ReadAsync(buf);
Console.WriteLine(Encoding.UTF8.GetString(buf, 0, got).TrimEnd()); // выведет "ok: ready"
await server;
Отправьте серверу строку "ask\n" и выведите
в консоли клиента ответ "answer: ask".
Получив строку "ping", верните клиенту
"pong" и выведите ее в консоли клиента.