StreamReader или StreamWriter не работают с NetworkStream
Нашел такую статью: https://metanit.com/sharp/net/6.1.php
Решил повторить пример из статьи:
using System.Net.Sockets;
using TcpClient tcpClient = new TcpClient();
var server = "www.google.com";
await tcpClient.ConnectAsync(server, 80);
// получаем поток
var stream = tcpClient.GetStream();
var message = $"GET / HTTP/1.1\r\nHost: {server}\r\nConnection: Close\r\n\r\n";
using var writer = new StreamWriter(stream);
// отправляем сообщение
await writer.WriteAsync(message);
await writer.FlushAsync();
using var reader = new StreamReader(stream);
// считываем весь ответ
var response = await reader.ReadToEndAsync();
Console.WriteLine(response);
Пример работает и ответ гугла выводится в консоль.
НО. Когда я попробовал написать клиент-сервер на тех же StreamReaser и StreamWriter, то ничего не сработало.
Сервер:
class Server
{
private static async Task Main()
{
TcpListener serverSocket = new TcpListener(ServerConfigurations.IPADDRESS, ServerConfigurations.PORT);
serverSocket.Start();
Console.WriteLine("Server started.");
while (true)
{
try
{
TcpClient clientSocket = await serverSocket.AcceptTcpClientAsync();
HandleClient(clientSocket);
}
catch (Exception exception)
{
Console.WriteLine($"Exception {exception.Message}");
}
}
serverSocket.Stop();
Console.WriteLine("Server stoped.");
}
private static async void HandleClient(TcpClient clientSocket)
{
try
{
Console.WriteLine("There is new one connection.");
NetworkStream stream = clientSocket.GetStream();
using StreamReader streamReader = new StreamReader(stream);
using StreamWriter streamWriter = new StreamWriter(stream);
string recievedString = await streamReader.ReadToEndAsync();
Console.WriteLine($"Message: {recievedString} has been recieved.");
string sendString = recievedString.ToLower();
await streamWriter.WriteLineAsync(sendString);
await streamWriter.FlushAsync();
Console.WriteLine($"Message: {sendString} has been sent.");
clientSocket.Close();
}
catch (Exception exception)
{
Console.WriteLine(exception.Message);
}
}
}
Клиент:
class Client
{
private static async Task Main()
{
using TcpClient client = new TcpClient();
await client.ConnectAsync(ServerConfigurations.IPADDRESS, ServerConfigurations.PORT);
NetworkStream stream = client.GetStream();
using StreamReader streamReader = new StreamReader(stream);
using StreamWriter streamWriter = new StreamWriter(stream);
Console.WriteLine("Write your string:");
string sendString = Console.ReadLine();
await streamWriter.WriteAsync(sendString);
await streamWriter.FlushAsync();
string recievedString = await streamReader.ReadToEndAsync();
Console.WriteLine($"Server returns result: {recievedString}");
}
}
Когда я запускаю всё это дело и ввожу строку для отправки в клиента:
Console.WriteLine("Write your string:");
string sendString = Console.ReadLine();
То ничего более не происходит. То ли сервер не принимает сообщение, то ли клиент по итогу ничего не отправляет.
Что я делаю не так?
Источник: Stack Overflow на русском