You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:42:12