C# winForm socket服务器和客户端通信

Yunkai! 2021-04-05 03:55:08
服务器端有检测客户端非正常断线重连功能采用KeepAlive机制的程序案例。[face]monkey2:019.png[/face]
...全文
670 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2021-04-06
  • 打赏
  • 举报
回复
我随手写个基本框架,当然我只是展示,如何利用tcp固有的机制进行处理,并不是想写一个完整无误,高性能的,高可用,高复用的服务器代码,所以下面的代码,和你主题无关的部分,我能略过就略过
 public class Class1
    {


        public Class1()
        {
            TcpListener xx = new TcpListener(IPAddress.Any, 8);
            xx.Server.SetSocketOption();//那边展示给你如何设置他

            xx.Server.Listen(100);

        }

        public async Task accept(TcpListener tcpserver)
        {
            while (true)
            {
                var clientsocket = await tcpserver.AcceptSocketAsync();
            }
        }

        public async Task handChildSocket(Socket clientsocket)
        {
            clientsocket.SetSocketOption(); //还是那边告诉你的如何处理

            var receivetask = Receive(clientsocket);
            var sendtask = send(clientsocket); //send我不想展示了

            await Task.WhenAll(receivetask, sendtask);
        }

        public async Task Receive(Socket clientsocket)
        {
            while (true)
            {
                try
                {
                    var r =await clientsocket.ReceiveAsync();//如何处理接收我也不想写,都是常规动作
                    //如同那个文章所说,因为你启用了keepalive机制,并且修改了默认配置,那么当异常断线的时候,超过你配置的时间后,他会自动启动一个在线探测,当探测失败他会自动异常
                }
                catch (Exception e)
                {
                    //异常了就close他,shutdown他,根本就无需搞啥你说的我要删除什么的操作
                    clientsocket.Close();
                    clientsocket.Shutdown();

                }

            }
        }

    }
wanghui0380 2021-04-06
  • 打赏
  • 举报
回复
额,这玩意,我也不想费脑筋写啥服务器,直接给你现成的资料。看了一下这资料可以用,虽然里面也做了很多多余的事情,但是起码比那些博大神好点,最起码他明白这是tcp本身的机制,并不需要做那种多余的心跳 https://cloud.tencent.com/developer/article/1459421
Yunkai! 2021-04-06
  • 打赏
  • 举报
回复
引用 2 楼 wanghui0380 的回复:
服务器端有检测客户端非正常断线重连功能采用KeepAlive机制的程序案例 顺带说一句,正常情况这个本身是不合理要求,要求本身来说前半段合理,后半段又是博大仙们的选择性遗忘病(选择性遗忘,先把你忽悠瘸了,然后卖拐) 后半段,服务器端重连客户端?又选择性遗忘了,非ipv6,NAT内网了把
老哥,悬赏200RMB能帮我弄个完整的DEMO案例来嘛,就是PC服务器判断客户端是否不正常断线并清除,因为我用的'MOAX nport5110串口转服务器模块不支持心跳功能,只支持keepAlive
wanghui0380 2021-04-06
  • 打赏
  • 举报
回复
服务器端有检测客户端非正常断线重连功能采用KeepAlive机制的程序案例 顺带说一句,正常情况这个本身是不合理要求,要求本身来说前半段合理,后半段又是博大仙们的选择性遗忘病(选择性遗忘,先把你忽悠瘸了,然后卖拐) 后半段,服务器端重连客户端?又选择性遗忘了,非ipv6,NAT内网了把
Yunkai! 2021-04-06
  • 打赏
  • 举报
回复
引用 5 楼 wanghui0380的回复:
我随手写个基本框架,当然我只是展示,如何利用tcp固有的机制进行处理,并不是想写一个完整无误,高性能的,高可用,高复用的服务器代码,所以下面的代码,和你主题无关的部分,我能略过就略过
 public class Class1
    {


        public Class1()
        {
            TcpListener xx = new TcpListener(IPAddress.Any, 8);
            xx.Server.SetSocketOption();//那边展示给你如何设置他

            xx.Server.Listen(100);

        }

        public async Task accept(TcpListener tcpserver)
        {
            while (true)
            {
                var clientsocket = await tcpserver.AcceptSocketAsync();
            }
        }

        public async Task handChildSocket(Socket clientsocket)
        {
            clientsocket.SetSocketOption(); //还是那边告诉你的如何处理

            var receivetask = Receive(clientsocket);
            var sendtask = send(clientsocket); //send我不想展示了

            await Task.WhenAll(receivetask, sendtask);
        }

        public async Task Receive(Socket clientsocket)
        {
            while (true)
            {
                try
                {
                    var r =await clientsocket.ReceiveAsync();//如何处理接收我也不想写,都是常规动作
                    //如同那个文章所说,因为你启用了keepalive机制,并且修改了默认配置,那么当异常断线的时候,超过你配置的时间后,他会自动启动一个在线探测,当探测失败他会自动异常
                }
                catch (Exception e)
                {
                    //异常了就close他,shutdown他,根本就无需搞啥你说的我要删除什么的操作
                    clientsocket.Close();
                    clientsocket.Shutdown();

                }

            }
        }

    }
谢谢大佬
wanghui0380 2021-04-05
  • 打赏
  • 举报
回复
这个玩意,你就正常写。只要你的所谓心跳包没有特殊意义的化,正常写就好。(有些系统的心跳包有特殊意义) 大多数情况我们说,只要你不迷信那些博大神的所谓高级文章,你正常处理就可以得到正常结果,反倒是天天看那些所谓高级文章,反倒是一堆“高级bug” 你这个只需正常写,唯一需要处理的就是处理一下“SocketOption”参数,不需要那些博大神文章,还是那句话博大神们长期的行为都是选择性单向推广病 这些博大神们想推广他们的博文,只会采用夸大,片面忽悠的方式,去推广他们的玩意。同时他们会选择性遗忘他们不想推广的东西---------这是种病,必须治,不治的话,我们只能一遍一遍看到更大的基础程序员去学他们那套到处“高级bug”的代码方式 在option里有这么几个参数 keepalive_time:单位秒,表示发送探测报文之前的链接空闲时间,默认为7200。 keepalive_intvl:单位秒,表示两次探测报文发送的时间间隔,默认为75。 keepalive_probes:表示探测的次数,默认9次 也就是博大神们会选择性遗忘,keealive本身就是tcp本身的机制,而他们推广他们那套玩意的时候,会选择性遗忘这个。他们会说如果tcp断网,无法立刻收到异常,从而不能立刻选择重连等操作 我们得告诉你,正是他们得选择性遗忘病而导致如此,因为option得keepalive_time默认为7200秒,也就是默认空闲心跳检查时间是2小时,所以他们无法立刻得到异常,所以想解决这个问题,只需简单在你开启sokect处理时刻,修改一下默认option即可

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧