Test3 - #8
Conversation
| clientStream.Position = 0; | ||
| var receivedByClient = await clientReader.ReadLineAsync(); | ||
| Assert.That(receivedByClient, Is.EqualTo(serverMessage)); | ||
| } |
There was a problem hiding this comment.
Вы потестировали библиотечные StreamReader и StreamWriter, тут собственно "боевой" код нигде не упоминается даже
| if (serverIp == null) | ||
| { | ||
| throw new ArgumentNullException(nameof(serverIp)); | ||
| } |
There was a problem hiding this comment.
Используйте ArgumentNullException.ThrowIfNull. На три строчки короче.
| try | ||
| { | ||
| Console.WriteLine($"Подключение к серверу {serverIp}:{port}..."); | ||
| var client = new TcpClient(); |
There was a problem hiding this comment.
| var client = new TcpClient(); | |
| using var client = new TcpClient(); |
| await using (var stream = client.GetStream()) | ||
| using (var reader = new StreamReader(stream, Encoding.UTF8)) | ||
| await using (var writer = new StreamWriter(stream, Encoding.UTF8)) | ||
| { |
There was a problem hiding this comment.
Тут можно было без скобок, тогда бы объекты дожили до конца блока (думаю, что Console.WriteLine пережил бы, если бы они были живы)
|
|
||
| var sendTask = SendMessagesAsync(writer); | ||
|
|
||
| await Task.WhenAny(receiveTask, sendTask); |
There was a problem hiding this comment.
По-хорошему надо корректно остановить и дождаться завершения обеих задач
| using System.Net; | ||
| using System.Net.Sockets; | ||
| using System.Text; | ||
|
|
There was a problem hiding this comment.
А тут надо было предупреждения StyleCop поправить
| { | ||
| try | ||
| { | ||
| var listener = new TcpListener(IPAddress.Any, port); |
| Console.WriteLine($"Сервер запущен на порту {port}"); | ||
| Console.WriteLine("Ожидание подключения клиента..."); | ||
|
|
||
| var client = await listener.AcceptTcpClientAsync(); |
There was a problem hiding this comment.
Тоже надо было сделать отменяемым, а то вдруг к нам никто так и не подключится, оно будет висеть тут вечно (справедливости рад, чтобы это было можно отменить, нужна некоторая дополнительная машинерия в отдельном потоке, которую не надо было реализовывать на контрольной — но сейчас оно неотменяемо by design, и даже если захотеть, эту машинерию не сделать).
| { | ||
| Console.WriteLine($"\nОшибка при отправке клиенту: {ex.Message}"); | ||
| } | ||
| } |
There was a problem hiding this comment.
На стороне клиента то же самое, надо было унифицировать как-то. По смыслу циклы передачи-приёмки сообщений на сервере и на клиенте никак не отличаются.
| if (message.ToLower() == "exit") | ||
| { | ||
| Console.WriteLine("\nСервер завершил соединение"); | ||
| break; |
There was a problem hiding this comment.
Нас уведомляют, что сервер завершил соединение, но из цикла ввода не выходят, так что попытка что-то отправить закончится исключением Broken pipe. А всё потому, что Вы CancellationToken не используете.
No description provided.