杜小姐的bug人生 2024-09-20 10:36 采纳率: 54.5%
浏览 12
已结题

C#服务器链接,客户端断开后,服务器显示断开后立马连接

img


明明客户端已经关闭,但是又立马显示连接成功。


    public Form1()
    {
        InitializeComponent();
        menuStrip1.Items[0].Enabled = true;
        menuStrip1.Items[1].Enabled = false;
        CheckForIllegalCrossThreadCalls = false;
        strMesLogPath = AppDomain.CurrentDomain.BaseDirectory + "MesLogs\\";         // 日志记录在运行目录下的MesLogs目录下

        server = new TcpServer();

        LoadPara();

        server.Host = tbIP.Text;
        server.Port = int.Parse(tbPort.Text);

        server.Started += Server_Started;
        server.Closed += Server_Closed;
        server.ClientConnected += Server_ClientConnected;
        server.ClientDisconnected += Server_ClientDisconnected;
        server.ClientConnectionAcceptedHandle = (s, e) => { 
            if(server.Clients.Count()<10)
            {
                return true;
            }
            else
            {
                AddLog(0, $"服务器已满,关闭[{e.ClientSocket.RemoteEndPoint}]的连接");
                return false;
            }
        };
        this.lstLog.Columns[1].Width = this.lstLog.Width - this.lstLog.Columns[0].Width;
    }
    private void Server_ClientDisconnected(object sender,ClientDisconnectedEventArgs e)
    {
        AddLog(0, $"客户端[{e.Client.Host}:{e.Client.Port}] 断开连接");
        Thread.Sleep(500);
    }

    private void Server_Closed(object sender, EventArgs e)
    {
        menuStrip1.Items[0].Enabled = true;
        menuStrip1.Items[1].Enabled = false;
        AddLog(0,"结束工作");
    }

    private void Server_ClientConnected(object sender, ClientConnectedEventArgs e)
    {
        AddLog(1, $"客户端[{ e.Client.Host}:{ e.Client.Port}] 连接成功");
        e.Client.OnDataReceived += Client_OnDataReceived;
    }

    private void Client_OnDataReceived(object sender, STTech.BytesIO.Core.DataReceivedEventArgs e)
    {
        TcpClient tcpClient = (TcpClient)sender;
        AddLog(1, $"来自客户端[{tcpClient.RemoteEndPoint}]的消息: {e.Data.EncodeToString("GBK")}");
        string ClientMsg = e.Data.EncodeToString("GBK");
        if(!ClientMsg.Contains('\n'))
        {
            AddLog(0, $"来自客户端[{tcpClient.RemoteEndPoint}]的消息: {e.Data.EncodeToString("GBK")},错误");
            return;
        }
        string[] msg = ClientMsg.Split('\n');
        string strJson = JsonData.GetJsonData(msg[1]);
        byte[] dateArray = null;
        string outStr = "";
        try
        {
            MesFun pMesFunc = new MesFun();
            dateArray = pMesFunc.ProcessReceivedString(strJson, outStr);
            AddLog(1, $"向客户端[{tcpClient.RemoteEndPoint}]发送消息: {dateArray.EncodeToString("GBK")}");
            tcpClient.SendAsync(dateArray);
        }
        catch (Exception s)
        {
            
            AddLog(0, $"调用MES接口失败:[{s.ToString()}]", s);
            dateArray = System.Text.Encoding.Default.GetBytes(s.ToString());
            tcpClient.SendAsync(dateArray);
        }
#if DEBUG
        string strMsg = strJson;
        dateArray = System.Text.Encoding.Default.GetBytes(strMsg);
        AddLog(1, $"向客户端[{tcpClient.RemoteEndPoint}]发送消息: {dateArray.EncodeToString("GBK")}");
        tcpClient.SendAsync(dateArray);
#endif
    }

    private void Server_Started(object sender, EventArgs e)
    {
        menuStrip1.Items[0].Enabled = false;
        menuStrip1.Items[1].Enabled = true;
        AddLog(1, "开始工作");
    }

    private void TsmiStart_Click(object sender, EventArgs e)
    {
        try
        {
            server.StartAsync();
        }
        catch(Exception s)
        {
            AddLog(0, $"开始失败:[{s.ToString()}]", s);
        }
    }

    private void TsmiClose_Click(object sender, EventArgs e)
    {
        try
        {
            server.CloseAsync();
        }
        catch (Exception s)
        {
            AddLog(0, $"关闭失败:[{s.ToString()}]", s);
        }
    }
  • 写回答

1条回答 默认 最新

  • wanghui0380 2024-09-20 10:53
    关注

    你只是如实记录了情况,至于立刻连接了,对方换端口重连了(注意看,端口好是变了)

    至于为啥对方要这么处理。从你贴图上看,基本上断开前,你都判定了一个“XXXX 错误”,然后就retrun了,不给对方发送回复消息了

    如果我是客户端,我会想,连续发送给你消息,你都超时不回复,是个啥情况。断开重连看看。

    ps:老生常谈问题,tcp,串口是流式数据,请流式接受并判定,每次Client_OnDataReceived收的数据不一定有“\n”是正常的,结果你按非正常处置了,也就是你server端故意丢包,造成客户端收不到回复,从而认定通信有误,达到断开重连判定

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月31日
  • 已采纳回答 10月31日
  • 创建了问题 9月20日

悬赏问题

  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?
  • ¥50 复现论文;matlab代码编写
  • ¥30 echarts 3d地图怎么实现一进来页面散点数据和卡片一起轮播
  • ¥15 数字图像的降噪滤波增强
  • ¥15 心碎了,为啥我的神经网络训练的时候第二个批次反向传播会报错呀,第一个批次都没有问题
  • ¥15 MSR2680-XS路由器频繁卡顿问题
  • ¥15 VB6可以成功读取的文件,用C#读不了
  • ¥15 如何使用micpyhon解析Modbus RTU返回指定站号的湿度值,并确保正确?
  • ¥15 C++ 句柄后台鼠标拖动如何实现