NetworkStream读取UTF8编码JSON时循环异常退出问题排查与解决
NetworkStream发送JSON后接收循环意外退出的问题
问题描述
尝试通过NetworkStream发送JSON对象,能成功发送并反序列化第一条消息,但接收完成后While循环直接退出。原以为是NetworkStream.Read依赖固定字节编码(如ASCII),而使用UTF-8(可变字节编码)导致读取字节数不正确,但实际并非如此。
相关代码
发送数据函数
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); }
接收数据函数
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."); }
解决方案
问题与编码无关,根源是发送消息时意外关闭了客户端流。当流被关闭后,stream.Read()会返回0,触发While循环退出条件。
如果需要保持TCP连接以发送多条消息,需确保发送操作完成后不关闭客户端流;若为单次消息场景,发送完成后关闭流属于预期操作,此时接收端循环退出是正常行为。
内容的提问来源于stack exchange,提问作者Martin Wiklund
相关产品推荐
相关产品推荐

