From 888cfb3692dfcdaa8ed6d706f0d17a77046c0b9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=9E=D0=BC=D0=B5=D0=BB=D1=8C=D1=87=D0=B5=D0=BD=D0=BA=D0=BE?= Date: Sat, 9 Mar 2019 23:11:03 +0200 Subject: [PATCH] Use binary reader/writer --- ServerConsole/Program.cs | 20 +++++++------------- TcpClientLib/Client.Receiver.cs | 5 ++--- TcpClientLib/Client.Sender.cs | 6 ++++-- TcpClientLib/Client.cs | 2 +- WindowsForms/Form1.cs | 6 +++++- 5 files changed, 19 insertions(+), 20 deletions(-) diff --git a/ServerConsole/Program.cs b/ServerConsole/Program.cs index 3906c05..f0ed81b 100644 --- a/ServerConsole/Program.cs +++ b/ServerConsole/Program.cs @@ -74,26 +74,20 @@ public void StartClient(TcpClient inClientSocket) private void Chat() { - var reader = clientSocket.GetStream(); + var reader = new BinaryReader(clientSocket.GetStream()); try { while (true) { - var bytesRead = reader.Read(readBuffer, 0, bufferLength); + var message = reader.ReadString(); - using (var memoryStream = new MemoryStream()) - { - memoryStream.Write(readBuffer, 0, bytesRead); - var message = System.Text.Encoding.ASCII.GetString(memoryStream.ToArray()); - - Log.Debug("Server got this message from client: {message}", message); + Log.Debug("Server got this message from client: {message}", message); - foreach (TcpClient client in Program.GetClients()) - { - var writer = new BinaryWriter(client.GetStream()); - writer.Write($"Server got your message '{message}'"); - } + foreach (TcpClient client in Program.GetClients()) + { + var writer = new BinaryWriter(client.GetStream()); + writer.Write($"Server got your message '{message}'"); } } } diff --git a/TcpClientLib/Client.Receiver.cs b/TcpClientLib/Client.Receiver.cs index eb20c26..3686d4e 100644 --- a/TcpClientLib/Client.Receiver.cs +++ b/TcpClientLib/Client.Receiver.cs @@ -59,9 +59,8 @@ private void Run() } else if (_stream.DataAvailable) // When in Xamarin or WinForms this is never true... { - var b = new byte[1024]; - var bytes = _stream.Read(b, 0, b.Length); - var responseData = Encoding.UTF8.GetString(b, 0, bytes); + var reader = new BinaryReader(_stream); + var responseData = reader.ReadString(); //Don't need this logging since the subscriber to event MainDataReceived logs it out! //Log.Debug("Got a response from the server: " + responseData); diff --git a/TcpClientLib/Client.Sender.cs b/TcpClientLib/Client.Sender.cs index ecd37ff..37394c1 100644 --- a/TcpClientLib/Client.Sender.cs +++ b/TcpClientLib/Client.Sender.cs @@ -12,7 +12,7 @@ public sealed partial class Client { private sealed class Sender { - internal async Task> SendData(byte[] data) + internal async Task> SendData(string data) { var response = new GenericResult(true); @@ -21,10 +21,12 @@ internal async Task> SendData(byte[] data) if (_stream.CanWrite) { // transition the data to the thread and send it... - await WriteWithTimeout(_stream, data, timeoutMs: 5000); + //await WriteWithTimeout(_stream, data, timeoutMs: 5000); // Same code as above without timeout // await _stream.WriteAsync(data, 0, data.Length).ConfigureAwait(false); + var writer = new BinaryWriter(_stream); + writer.Write(data); } else { diff --git a/TcpClientLib/Client.cs b/TcpClientLib/Client.cs index c5e5ce5..673aa01 100644 --- a/TcpClientLib/Client.cs +++ b/TcpClientLib/Client.cs @@ -14,7 +14,7 @@ public async Task> SendData(string data) { try { - return await _sender.SendData(Encoding.ASCII.GetBytes(data)).ConfigureAwait(false); + return await _sender.SendData(data).ConfigureAwait(false); } catch (Exception ex) { diff --git a/WindowsForms/Form1.cs b/WindowsForms/Form1.cs index c5ad315..e9fbe61 100644 --- a/WindowsForms/Form1.cs +++ b/WindowsForms/Form1.cs @@ -43,7 +43,11 @@ private void OnClient_MainDataReceived(object sender, DataReceivedArgs e) { // This never gets called after client.SendData(). // Probably because of something like https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.invoke?view=netframework-4.7.2 - txbResponseFromServer.AppendText(e.Data); + txbResponseFromServer.Invoke((MethodInvoker)delegate () + { + txbResponseFromServer.AppendText(e.Data + Environment.NewLine); + }); + } private async void btnSendData_Click(object sender, EventArgs e)