精易论坛

标题: Msdn5SockeHelpert类库源码 [打印本页]

作者: 君临    时间: 2017-2-23 23:04
标题: Msdn5SockeHelpert类库源码
本帖最后由 君临 于 2017-2-23 23:12 编辑

【开源类库,定期维护】


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


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

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

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




更新日志





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






  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)
复制代码






  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-2-23 23:11
好厉害,一下共享了那么多玩意
作者: 精易客服    时间: 2017-2-23 23:14
御风软件 发表于 2017-2-23 23:11
好厉害,一下共享了那么多玩意

貌似御风在前2年就开始转C#了吧
作者: 御风软件    时间: 2017-2-24 11:18
精易客服 发表于 2017-2-23 23:14
貌似御风在前2年就开始转C#了吧

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

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

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

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

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

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

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


开始为了有逼格,我是翻译为英文写代码的,后面还是放弃了,现在还是用中文的来写c#代码,2333
作者: 精易客服    时间: 2017-2-24 11:23
御风软件 发表于 2017-2-24 11:18
嗯,很早之前就学习了,但是一直都是在徘徊,理论知识储备的还可以,就是还没有正式的写过啥

一直维护 ...

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

xp已经淘汰了,win7都是自带.net框架的,以后C#会流行
作者: 御风软件    时间: 2017-2-24 11:36
精易客服 发表于 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写的就比较坑了,什么系统都必须安装的。。
作者: 精易客服    时间: 2017-2-24 11:45
御风软件 发表于 2017-2-24 11:36
我现在用net4,还是要兼顾xp的用户,坑啊。何况,我之前就是XP党。

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

win7及以上系统好象是系统默认自带.net3.5是么,3.5的类库是不是会更少,影响大不大呢
作者: 御风软件    时间: 2017-2-24 13:17
精易客服 发表于 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以上的版本目前是无缝升级的
作者: 御风软件    时间: 2017-2-24 13:23
精易客服 发表于 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版本






作者: defrt3    时间: 2017-4-12 11:04
大R的帖子一定要来顶下
作者: alalalal    时间: 2017-4-12 15:29
看看好用么!
作者: hanhualangzi    时间: 2017-5-29 11:14
支持一下.支持一下.




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4