开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 4152|回复: 11
收起左侧

[C#源码] Msdn5SockeHelpert类库源码

[复制链接]
结帖率:50% (1/2)
发表于 2017-2-23 23:04:50 | 显示全部楼层 |阅读模式   新疆维吾尔自治区巴音郭楞蒙古自治州
本帖最后由 君临 于 2017-2-23 23:12 编辑

【开源类库,定期维护】


类库采用TcpLister,TcpClient高度封装,
采用NetworkStream进行异步模式读取数据.
采用Semaphore来进行并发控制,
类库中还有一个没有加入工程的asynchelper,这个类库是纯异步实现.
当前处理方式:  异步+同步 ,海量数据并发不是靠异步就能解决的问题!


在对学习Socket和想快速使用Socket的朋友来说,同步才是最好的选择.

可同时接受5000+连接同时访问,而CPU消耗完全忽略不计..

本着代码简洁,简单.通俗易懂的原则,进行过度代码封装,不像其他通信框架写很多各式各样的接口.对新手朋友和刚接触通信程序的朋友带来很大的困扰.




更新日志



  • 2.6.3

  • 修正缓冲区大小为1024
  • 新增服务端重载,可监听所有网卡
  • 修正若干小bug.



  • 2.6.2修正部分

  • 增加服务端Demo多次开启判断.
  • 增加ErrorCode中的ConnectSuccess状态(用于推送连接状态)
  • 修正一写无用/冗余代码
  • 增加客户DuanDemo状态推送扩展

ErrorCode可以自行扩展为StatusCode,用来区分不同的状态.





  • 修改原发送sendData 方法为SendToClient  允许直接发送byte数组
  • 增加 SendToClient 重载  【 直接发送byte 】


  1. /// <summary>
  2.            /// 向某一位客户Duan发送信息
  3.            /// </summary>
  4.            /// <param name="ip">客户DuanIP+端口地址</param>
  5.            /// <param name="SendData">发送的数据包</param>
  6.            public void SendToClient(IPEndPoint ip, byte[] SendDataBuffer)
复制代码







  • 增加掉线重连(自动复活)   方法名 : RestartInit()
  • 增加几个异常推送的枚举  ErrorCode
  1. /// <summary>
  2.            /// 具体错误类型
  3.            /// </summary>
  4.            public enum ErrorCodes
  5.            {
  6.                /// <summary>
  7.                /// 对象为null
  8.                /// </summary>
  9.                objectNull,
  10.                /// <summary>
  11.                /// 连接时发生错误
  12.                /// </summary>
  13.                ConnectError,
  14.                /// <summary>
  15.                /// 尝试发送失败异常
  16.                /// </summary>
  17.                TrySendData,
  18.            }
复制代码




下面我和大家一起来分享这个类库的使用方式.
服务端的调用


先来看下服务端的界面

第一个列表框用来获取服务端状态信息.
第二个列表框用来获取客户Duan发来的消息.
一个下来列表框来记录客户Duan上线.边上的0来记录当前连接数

界面非常简洁,咱们来看类库的使用方式.
第一步,引入命名空间


当引用xuanjiSocket类库以后,请添加
  1. using XuanJiSocket;
复制代码


添加服务端类.如果没有引入命名空间,那么可以将鼠标光标置于类变量中,按快捷键 Shift + Alt + F10 自动引入类库命名空间
  1. SocketHelper.TcpServer server;
复制代码


在窗体加载事件中,完成对server变量的初始化.
SocketHelper.pushSockets = new SocketHelper.PushSockets(Rec);


这是本类非常重要的委托变量.
它的作用就是推送所有信息.!请在Start前对其初始化.!
  1. private void Rec(SocketHelper.Sockets sks)
  2.         {
  3.         }

复制代码



这是处理推送器消息的方法.!

SocketHelper.Sockets


大家可以看下这个自定义对象
  1. /// <summary>
  2.        /// 自定义Socket对象
  3.        /// </summary>
  4.        public class Sockets
  5.        {
  6.            /// <summary>
  7.            /// 接收缓冲区
  8.            /// </summary>
  9.            public byte[] RecBuffer = new byte[8 * 1024];  
  10.            /// <summary>
  11.            /// 发送缓冲区
  12.            /// </summary>
  13.            public byte[] SendBuffer = new byte[8 * 1024];
  14.            /// <summary>
  15.            /// 异步接收后包的大小
  16.            /// </summary>
  17.            public int Offset { get; set; }
  18.            /// <summary>
  19.            /// 空构造
  20.            /// </summary>
  21.            public Sockets() { }
  22.            /// <summary>
  23.            /// 创建Sockets对象
  24.            /// </summary>
  25.            /// <param name="ip">Ip地址</param>
  26.            /// <param name="client">TcpClient</param>
  27.            /// <param name="ns">承载客户DuanSocket的网络流</param>
  28.            public Sockets(IPEndPoint ip, TcpClient client, NetworkStream ns)
  29.            {
  30.                Ip = ip;
  31.                Client = client;
  32.                nStream = ns;
  33.            }
  34.            /// <summary>
  35.            /// 当前IP地址,端口号
  36.            /// </summary>
  37.            public IPEndPoint Ip { get; set; }
  38.            /// <summary>
  39.            /// 客户Duan主通信程序
  40.            /// </summary>
  41.            public TcpClient Client { get; set; }
  42.            /// <summary>
  43.            /// 承载客户DuanSocket的网络流
  44.            /// </summary>
  45.            public NetworkStream nStream { get; set; }
  46.            /// <summary>
  47.            /// 发生异常时不为null.
  48.            /// </summary>
  49.            public Exception ex { get; set; }
  50.            /// <summary>
  51.            /// 新客户Duan标识.如果推送器发现此标识为true,那么认为是新的连接
  52.            /// </summary>
  53.            public bool NewClientFlag { get; set; }
  54.        }
复制代码



每个属性都有注释,来解释这个属性的作用..具体处理细节.请下载demo阅读
上面那些信息绝非无用,而是整个类的重中之重以及消息处理方式.

启动类库,并开始监听

  1. erver.InitSocket(IPAddress.Any, 9527);//监听所有地址,监听端口为9527
  2.                 server.Start();//启动服务端
复制代码



之前在窗体加载时已经初始化过变量,现在直接使用它的InitSocket来配置服务端.使用Start方法启动监听.!
默认调用后便认为监听成功.!
如若其他情况,例如异常时: 会推送监听失败消息至服务端Rev方法中.具体参阅源码.
停止服务端


直接调用Stop方法即可停止服务端.Stop方法调用后,可继续启动服务端.!
至此,服务端的描述就介绍完了,使用非常简单,
你要做的就下面几件事:
                                               1 、 声明服务端变量。
                                               2 、 初始化推送器。
                                               3 、 配置服务端。
                                               4 、 启动服务端
服务端发送信息


服务端有两个自带方法
         
  1. server.SendToAll("服务端消息:msdn5.com 随机消息:"+Guid.NewGuid().ToString());//直接发送字符串
复制代码




该方法将会对所有连接至服务端的客户Duan发送消息.如果在发送中客户Duan下线或发生异常,服务端将维护客户Duan集合 ClientList
ClientList  会在客户Duan接入时添加.如果发生异常等情况会自动删除
  1. SendToClient(IPEndPoint ip, string SendData);

复制代码





像单独某位客户发起数据.
当客户Duan连接时,除去ClientList会自动维护列表外,也会将客户Duan推送至UI界面,供大家组合自己想要的客户Duan列表.详细请阅读demo
客户Duan介绍



客户Duan与服务端一样,需要先声明客户Duan变量

  1. SocketHelper.TcpClients client; //声明客户Duan变量 与服务端一样在窗体加载时初始化.
复制代码


配置客户Duan,启动客户Duan.
  1. client.InitSocket(ip, int.Parse(port)); //IP地址支持字符串类型
  2.                 client.Start();

复制代码



客户Duan发送方法,与服务端一致.调用Send方法.调用Start方法来连接服务器,调用Stop方法断开连接.支持断开后重新连接服务端


最后来一张运行时的截图吧


Demo + 类库下载地址:


XuanJiSocketDemo_2.6.4.zip (164.76 KB, 下载次数: 36)
发表于 2017-5-29 11:14:58 | 显示全部楼层   江苏省盐城市
支持一下.支持一下.
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)
发表于 2017-4-12 15:29:58 | 显示全部楼层   安徽省马鞍山市
看看好用么!
回复 支持 反对

使用道具 举报

发表于 2017-4-12 11:04:57 | 显示全部楼层   四川省成都市
大R的帖子一定要来顶下
回复 支持 反对

使用道具 举报

结帖率:100% (11/11)

签到天数: 20 天

发表于 2017-2-24 13:23:08 | 显示全部楼层   广东省阳江市
精易客服 发表于 2017-2-24 11:45
win7及以上系统好象是系统默认自带.net3.5是么,3.5的类库是不是会更少,影响大不大呢

特意去查了下MSDN,win7是不预装NET的,win8以上才预装

https://msdn.microsoft.com/zh-cn/library/8z6watww(v=vs.110).aspx  这个页面显示了客户Duan和服务器的预装和支持安装的net版本 1.jpg
2.jpg




评分

参与人数 1好评 +1 精币 +5 收起 理由
精易客服 + 1 + 5 奉上小小红包希望笑纳

查看全部评分

回复 支持 反对

使用道具 举报

结帖率:100% (11/11)

签到天数: 20 天

发表于 2017-2-24 13:17:39 | 显示全部楼层   广东省阳江市
精易客服 发表于 2017-2-24 11:45
win7及以上系统好象是系统默认自带.net3.5是么,3.5的类库是不是会更少,影响大不大呢

3.5的类库是个失败的类库,或者企业的用的多,有几百MB.所以常见的C#程序,要么net2,要么net4

net2是20多M,而net4是40多M.

win7不自带net3.5的,应该是net4,我的系统,是原装盘安装的,没有发现net3.5,我电脑只有net4.61
---------
微软的目前升级规则是,如果你的电脑是net4以上的版本,你安装新版,会升级,而不是并存的方式

比如,如果我现在,安装4.62,那么我的4.61就会没有了,变成4.62,4以上的版本目前是无缝升级的
回复 支持 反对

使用道具 举报

签到天数: 22 天

发表于 2017-2-24 11:45:43 | 显示全部楼层   广东省揭阳市
御风软件 发表于 2017-2-24 11:36
我现在用net4,还是要兼顾xp的用户,坑啊。何况,我之前就是XP党。

不然,我就直接上net4.62了,何况, ...

win7及以上系统好象是系统默认自带.net3.5是么,3.5的类库是不是会更少,影响大不大呢
回复 支持 反对

使用道具 举报

结帖率:100% (11/11)

签到天数: 20 天

发表于 2017-2-24 11:36:10 | 显示全部楼层   广东省阳江市
精易客服 发表于 2017-2-24 11:23
慢慢就习惯英文了哈,况且你有这么深的编程功底

xp已经淘汰了,win7都是自带.net框架的,以后C#会流行

我现在用net4,还是要兼顾xp的用户,坑啊。何况,我之前就是XP党。

不然,我就直接上net4.62了,何况,有的人还在服务器,win2003系统上挂机

没有办法,老的电脑,或者挂机的,用的系统并不会很好,如果我不是新买了电脑,我估计现在还是xp

不过,最坑的还是易语言,自己写软件,自己运行没有啥问题,但是发布到用户电脑,各种ghost,各种死法。

而Net的好处,就是兼容好,只要用户电脑能安装net框架,那么就不会出现环境问题了,没有后续的各种疑难杂症

而且,net4写的程序,是后续兼容的,所以,只要用户电脑安装了net4以上的,都是可以的,效率看用户电脑版本。像我的电脑,装的vs2015,就装了net4.61,而net2和3.5写的就比较坑了,什么系统都必须安装的。。

点评

win7及以上系统好象是系统默认自带.net3.5是么,3.5的类库是不是会更少,影响大不大呢   广东省揭阳市  详情 回复 发表于 2017-2-24 11:45
回复 支持 反对

使用道具 举报

签到天数: 22 天

发表于 2017-2-24 11:23:31 | 显示全部楼层   广东省揭阳市
御风软件 发表于 2017-2-24 11:18
嗯,很早之前就学习了,但是一直都是在徘徊,理论知识储备的还可以,就是还没有正式的写过啥

一直维护 ...

慢慢就习惯英文了哈,况且你有这么深的编程功底

xp已经淘汰了,win7都是自带.net框架的,以后C#会流行
回复 支持 反对

使用道具 举报

结帖率:100% (11/11)

签到天数: 20 天

发表于 2017-2-24 11:18:21 | 显示全部楼层   广东省阳江市
精易客服 发表于 2017-2-23 23:14
貌似御风在前2年就开始转C#了吧

嗯,很早之前就学习了,但是一直都是在徘徊,理论知识储备的还可以,就是还没有正式的写过啥

一直维护的,都是易语言写的软件,C#也是一直在学习中,而且,为了找个师傅,我是这个家伙的VIP

主要的还是英文问题,VS对英文支持很好的,但是中文方面,那智能提示和没有一样,不支持首拼,全拼

写代码要来回的切换的输入法,而且,需要什么功能,都需要去百度搜索下,MSdn有文档,但是不可能都看完再写吧,看完了,也不一定记得住呀。

现在的话,还是继续学习c#,等火山支持PC,但是那个应该要很久了,所以,想要写产品,还是要用c#

我现在写的,一直写的,其实对界面要求不高,都是效率问题,易语言效率不行,自己又不会算法什么的

一些方法,易语言只能是数组,自定义类型的组合,功能实现了,但是效率慢,而C#提供了大量的类库,直接使用就有不错的效率。


开始为了有逼格,我是翻译为英文写代码的,后面还是放弃了,现在还是用中文的来写c#代码,2333

点评

慢慢就习惯英文了哈,况且你有这么深的编程功底 xp已经淘汰了,win7都是自带.net框架的,以后C#会流行   广东省揭阳市  详情 回复 发表于 2017-2-24 11:23
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表