StreamReader или StreamWriter не работают с NetworkStream

Рейтинг: 0Ответов: 1Опубликовано: 20.02.2023

Нашел такую статью: 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();

То ничего более не происходит. То ли сервер не принимает сообщение, то ли клиент по итогу ничего не отправляет.

Что я делаю не так?

Ответы

▲ 0Принят

В чем проблема я так и не выяснил. Но тот же код только с streamReader.ReadLineAsync(); вместо streamReader.ReadToEndAsync(); всё исправил.