一页纸鸢 2024-08-03 21:05 采纳率: 16.7%
浏览 31

无法从传输连接中读取数据: 你的主机中的软件中止了一个已建立的连接。。

无法从传输连接中读取数据: 你的主机中的软件中止了一个已建立的连接。。
请问是什么原因呀!到底是代码哪里出现问题了,应该怎么改


public class MeasuringCameraMethod
{
    private string FileName;
    public Logger logger = new Logger(); // 日志  
    public MeasuringCameraClass measuring;
    public TcpClient client = null;
    private NetworkStream stream = null; // 将 NetworkStream 设为类的成员变量  

    public MeasuringCameraMethod()
    {
        measuring = new MeasuringCameraClass();
        FileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DataOrigin");
        // 完整的文件路径  
        string filePath = Path.Combine(FileName, "MeasuringCameraClass.json"); // 量方相机  
        // 感应器 如果文件存在,则查询数据并回填  
        if (File.Exists(filePath))
        {
            // 读取文件中的 JSON 数据  
            string jsonData = System.IO.File.ReadAllText(filePath);

            // 将 JSON 数据反序列化为 MeasuringCameraClass 对象  
            MeasuringCameraClass mea = JsonConvert.DeserializeObject<MeasuringCameraClass>(jsonData);
            // 设置回填后的值到相应的控件中  
            measuring.MeasuringIp = mea.MeasuringIp;
            measuring.MeasuringPort = mea.MeasuringPort;
        }
    }

    /// <summary>  
    /// 量方相机打开  
    /// </summary>  
    /// <returns></returns>  
    public async Task<bool> CameraOpen()
    {
        try
        {
            // 创建 TCP 监听器  
            string ip = measuring.MeasuringIp;
            int port = Convert.ToInt32(measuring.MeasuringPort);

            // 创建 TcpListener 对象  
            TcpListener listener = new TcpListener(IPAddress.Parse(ip), port);
            listener.Start();
            logger.Log($"量方服务端已启动,正在监听: {ip}:{port}");

            // 设置一个任务来接受客户端连接   
            var acceptTask = listener.AcceptTcpClientAsync();

            // 等待连接或超时  
            var delayTask = Task.Delay(3000);
            var completedTask = await Task.WhenAny(acceptTask, delayTask);

            // 检查是否是接受连接的任务完成  
            if (completedTask == acceptTask)
            {
                client = await acceptTask; // 获取客户端连接  
                logger.Log($"客户端连接成功: {((IPEndPoint)client.Client.RemoteEndPoint).Address}:{((IPEndPoint)client.Client.RemoteEndPoint).Port}");

                // 获取网络流  
                stream = client.GetStream();
                return true; // 连接成功  
            }
            else
            {
                logger.Log("量方服务端连接超时!");
                MessageBox.Show("量方相机连接失败,请检查量方软件是否开启!");
                return false;
            }
        }
        catch (TimeoutException te)
        {
            logger.Log("量方服务端连接超时:" + te.Message);
            return false; // 连接超时  
        }
        catch (SocketException se)
        {
            logger.Log($"量方服务端连接失败: {se.Message}");
            return false; // 连接失败  
        }
        catch (Exception ex)
        {
            logger.Log($"量方服务端发生错误: {ex.Message}");
            return false; // 其他错误  
        }
    }

    /// <summary>  
    /// 处理接收到的指令并返回响应  
    /// </summary> 
    public string CameraRead(string message = "#trig")
    {
        if (stream == null)
        {
            logger.Log("未获取到网络流。请确保客户端已连接。");
            return "";
        }

        try
        {
            // 将要发送的数据转换为字节并发送  
            byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
            stream.Write(data, 0, data.Length);
            // 接收返回数据  
            byte[] buffer = new byte[1024]; // 可以根据实际需求调整缓冲区大小  
            int bytesRead = stream.Read(buffer, 0, buffer.Length);
            // 将接收到的字节转换为字符串  
            string response = System.Text.Encoding.ASCII.GetString(buffer, 0, bytesRead);
            logger.Log($"接收到的回复: {response}");
            return response;
        }
        catch (Exception ex)
        {
            logger.Log($"发送数据或接收回复时发生错误: {ex.Message}");
            return "";
        }
    }

    /// <summary>  
    /// 关闭与量方相机的连接  
    /// </summary>  
    public void CameraClose()
    {
        try
        {
            // 检查客户端是否已连接  
            if (client != null && client.Connected)
            {
                // 关闭网络流  
                if (stream != null)
                {
                    stream.Close();
                    logger.Log("网络流已关闭。");
                }

                // 关闭客户端连接  
                client.Close();
                logger.Log("量方相机客户端已成功关闭。");
            }
            else
            {
                logger.Log("量方相机客户端未连接,无法关闭。");
            }
        }
        catch (Exception ex)
        {
            logger.Log($"关闭量方相机时发生错误: {ex.Message}");
        }
    }
}
  • 写回答

1条回答 默认 最新

  • 专家-司宇[在线] 2024-08-03 21:05
    关注

    引自免费微信小程序:皆我百晓生

    从你给出的代码和错误信息来看,“无法从传输连接中读取数据: 你的主机中的软件中止了一个已建立的连接。”这个错误可能发生在以下几个地方:

    1. 网络连接被意外中断。在CameraRead方法中,当尝试从stream读取数据时,如果此时网络连接被中断或者客户端关闭连接,就会抛出这个异常。你需要确保在读取数据前检查连接是否仍然有效。
    2. 客户端在发送数据后立即关闭了连接。在CameraOpen方法中,一旦接受到客户端的连接请求并成功建立连接后,客户端可能会立即关闭连接,导致在CameraRead方法中尝试读取数据时抛出异常。你需要确保客户端在发送数据后不会立即关闭连接。
    3. 超时导致的连接中断。在CameraOpen方法中,你设置了等待客户端连接的超时时间(3秒)。如果在这个时间内没有接收到客户端的连接请求,会抛出超时异常并关闭连接。如果此时你尝试在已关闭的连接上读取数据,就会抛出这个错误。你需要检查是否在超时后正确处理了连接状态。

    针对上述问题,你可以尝试以下解决方案:

    • 在读取数据前检查连接是否仍然有效。你可以添加一个检查客户端是否仍然连接的逻辑,例如:
    if (client != null && client.Connected) {
        // 进行数据读取操作...
    } else {
        logger.Log("客户端连接已关闭。");
        return ""; // 或者抛出异常,取决于你的需求
    }
    
    • 确保客户端在发送数据后不会立即关闭连接。你可以与客户端开发者沟通,确保在发送数据后保持连接一段时间,以便服务器能够读取并处理数据。
    • 在超时后正确处理连接状态。你可以在超时后重新尝试接受新的连接请求,或者在检测到超时后做一些清理工作(如关闭现有的连接),然后再尝试重新建立新的连接。这样可以避免在已关闭的连接上尝试读取数据导致的错误。你也可以考虑增加超时时间,以便客户端有更多的时间建立连接。具体的解决方案取决于你的需求和实际情况。你可能需要在客户端和服务器端同时进行调整和优化。希望这些建议能帮助你解决问题!如果你还有其他问题或需要进一步的帮助,请随时向我提问。
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 8月3日

悬赏问题

  • ¥15 Coze智能助手搭建过程中的问题请教
  • ¥15 12864只亮屏 不显示汉字
  • ¥20 三极管1000倍放大电路
  • ¥15 vscode报错如何解决
  • ¥15 前端vue CryptoJS Aes CBC加密后端java解密
  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
  • ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值
  • ¥15 VFP如何使用阿里TTS实现文字转语音?