浅谈Socket长连+多线程[原创,欢迎指点]

本文介绍了在分布式环境下,如何利用Socket实现长连接和多线程进行设备管控和IM主控。主要内容包括分布式服务器的监听与资源分配、前置机处理客户端连接、线程管理及编码策略。作者分享了自己在处理心跳、断线重连、线程状态监控等方面的经验,并提供了部分流程思路,但未给出详细代码。
摘要由CSDN通过智能技术生成

前戏


 

     【PS:原文手打,转载说明出处】

  【PS:博主自认为适用于云平台设备管控,且适用于IM主控】

  好久没来了,13年时还想着多写一些博客,这都17年过年,年前也写一写Scoket+多线程,不足之处,见谅。(算是个人小总结)

缘由


 

     不知各位同仁有没有发现,用简单,无外乎就是都是一个流程

     1)监听链接

  2)校验链接是否是正常链接

  3)保存链接至全局静态字典

  4)开启新线程监听监听到的线程报文

  5)执行对应命令或者发送对应命令

  然后内部各种心跳,各种断线重连后释放缘由链接对象,重新保存对象;

  其实使用过程当中,貌似也就这些来着,不管再大的系统,也都是这个主流程,但是一些细节处理如何把握;

  下面我简单的说说我的处理

  (1)分布式

  (2)线程在无命令状态下自我销毁

  (3)线程状态监听

  

正文

 


  1 分布式

    背景:其实吧,也算是我公司穷,用不起高大上的硬件负载,其次能由于个人学历水平有限,搞不定各种开源导致的以下产物

    1.1 流程图

      

    1.2 流程说明

      分布式服务器中植入程序

        1)负责监听前置机发送当前连接数以及服务资源使用情况

        2)监听客户机连接并返回当前最优前置至客户机

        3)客户机连接前置

  2 前置机处理

     当客户机连接至前置机时,前置机实时监听后,开始监听到底是哪一台客户机连接上来,在用Dictionary<key,Socket>存储连接Socket,开启新线程监听客户机心跳等

             

    关键:连接初始化指令时,带入客户机唯一标识,这时字典中存储的key为唯一标识,value为Socket

    2.1 前置与分布式服务器

        1:根据字典中保存的Socket,监听Socket最后链接时间,以及判断Socket链接状态,统计连接成功数据,释放连接中断Socket,发送连接数至分布式服务器

        2:发送当前前置程序内存、CPU占用百分比等相关服务器硬件使用情况信息至分布式服务器

     2.2 前置与客户机

      因为连接上了,不止只收取命令,还需要发送对应命令至客户机,顾沿用字典中存储的长连接Socket对象,发送命令至客户机

      因为是命令,遵循应答原则,必须命令到达后,返回明确指令收到,在发送下一条命令,这里我使用了线程阻塞(当然,如果是IM发送聊天记录就没关系了,集体丢到客户机就可以了,返回成功后在更新发送时间以及发送状态就好)

   3 编码

      流程大家应该其实都懂,然后就是代码,因为马上年终尾牙,要去粗饭了,代码贴上来,各自领悟领悟哈

 

      为什么要重写堆栈,以为我的是设备,设备命令必须保证命令一定送达,而且有顺序的执行,则重新写了个规则

      

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace KR.DevFx.SocketTools
{
    public class DevQueue:IDisposable
    {
        #region 属性
        private int no = 0;

        /// <summary>
        /// 序号
        /// </summary>
        public int No
        {
            get { return no; }
            set { no = value; }
        }

        private int currentCommandNo = 0;

        /// <summary>
        /// 当前执行序号
        /// </summary>
        public int CurrentCommandNo
        {
            get { return currentCommandNo; }
            set { currentCommandNo = value; }
        }

        private bool queueSwitch = false;

        /// <summary>
        /// 堆栈开关
        /// </summary>
        public bool QueueSwitch
        {
            get { return queueSwitch; }
            set { queueSwitch = value; }
        }

        private bool isMeanwhileExec = false;

        /// <summary>
        /// 是否同时执行
        /// </summary>
        public bool IsMeanwhileExec
        {
            get { return isMeanwhileExec; }
            set { isMeanwhileExec = value; }
        }

        private Dictionary<int, object> dicCommand = new Dictionary<int, object>();

        /// <summary>
        /// 堆栈内容
        /// </summary>
        public Dictionary<int, object> DicCommand
        {
            get { return dicCommand; }
            set { dicCommand = value; }
        }

        #endregion

        #region 方法

        /// <summary>
        /// 参数入栈
        /// </summary>
        /// <param name="_param"></param>
        public void AddQueue(object _param)
        {
            if (No == int.MaxValue)
            {
                No = 0;
            }
            No = No + 1;
            DicCommand.Add(No, _param);
        }

        /// <summary>
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值