Read NetworkStream with UTF8 Encoding

62 views Asked by At

I'm trying to send JSON-objects via Network Streams. I'm able to send one message and deserialize it but after reciving it my While loop exits. I think it has to do with NetworkStream.Read expecting fixed byte size encoding (ASCII), but I'm using UTF8 with varying byte sizes. Is there some way I can make NetworkStream.Read read the correct amount of bytes?

Function for sending data:

        private void SendMessage(TcpClient client, string message)
    {
            stream = client.GetStream();

            var data = new MessageModel
            {
                RequestType = "Message",
                Name = clientName,
                Date = DateTime.Now,
                Message = message
            };

            string jsonString = JsonSerializer.Serialize(data);
            byte[] jsonData = UTF8Encoding.UTF8.GetBytes(jsonString);
            stream.Write(jsonData, 0, jsonData.Length);
        }
    }

Function for receiving data:

    private void RecieveMessages(TcpClient client)
    {
        NetworkStream stream = client.GetStream();

        byte[] data = new byte[1024];
        int bytesRead;

        while ((bytesRead = stream.Read(data, 0, data.Length)) > 0)
        {
            string jsonString = UTF8Encoding.UTF8.GetString(data, 0, bytesRead);
            MessageModel message = JsonSerializer.Deserialize<MessageModel>(jsonString);

            Console.WriteLine($"RequestType: {message?.RequestType}");
            Console.WriteLine($"Name: {message?.Name}");
            Console.WriteLine($"Date: {message?.Date}");
            Console.WriteLine($"Message: {message?.Message}");
        }

        client.Close();
        Console.WriteLine("Client disconnected.");
    }

Solved: As Jon Skeet pointed out this had nothing to do with encoding. I accidently closed client stream when writing messages.

0

There are 0 answers