|
发表于 2017-2-23 23:04:50
|
显示全部楼层
|阅读模式
新疆维吾尔自治区巴音郭楞蒙古自治州
本帖最后由 君临 于 2017-2-23 23:12 编辑
【开源类库,定期维护】
类库采用TcpLister,TcpClient高度封装,
采用NetworkStream进行异步模式读取数据.
采用Semaphore来进行并发控制,
类库中还有一个没有加入工程的asynchelper,这个类库是纯异步实现.
当前处理方式: 异步+同步 ,海量数据并发不是靠异步就能解决的问题!
在对学习Socket和想快速使用Socket的朋友来说,同步才是最好的选择.
可同时接受5000+连接同时访问,而CPU消耗完全忽略不计..
本着代码简洁,简单.通俗易懂的原则,进行过度代码封装,不像其他通信框架写很多各式各样的接口.对新手朋友和刚接触通信程序的朋友带来很大的困扰.
更新日志
- 修正缓冲区大小为1024
- 新增服务端重载,可监听所有网卡
- 修正若干小bug.
- 增加服务端Demo多次开启判断.
- 增加ErrorCode中的ConnectSuccess状态(用于推送连接状态)
- 修正一写无用/冗余代码
- 增加客户DuanDemo状态推送扩展
ErrorCode可以自行扩展为StatusCode,用来区分不同的状态.
- 修改原发送sendData 方法为SendToClient 允许直接发送byte数组
- 增加 SendToClient 重载 【 直接发送byte 】
- /// <summary>
- /// 向某一位客户Duan发送信息
- /// </summary>
- /// <param name="ip">客户DuanIP+端口地址</param>
- /// <param name="SendData">发送的数据包</param>
- public void SendToClient(IPEndPoint ip, byte[] SendDataBuffer)
复制代码
- 增加掉线重连(自动复活) 方法名 : RestartInit()
- 增加几个异常推送的枚举 ErrorCode
- /// <summary>
- /// 具体错误类型
- /// </summary>
- public enum ErrorCodes
- {
- /// <summary>
- /// 对象为null
- /// </summary>
- objectNull,
- /// <summary>
- /// 连接时发生错误
- /// </summary>
- ConnectError,
- /// <summary>
- /// 尝试发送失败异常
- /// </summary>
- TrySendData,
- }
复制代码
下面我和大家一起来分享这个类库的使用方式.
服务端的调用
先来看下服务端的界面
第一个列表框用来获取服务端状态信息.
第二个列表框用来获取客户Duan发来的消息.
一个下来列表框来记录客户Duan上线.边上的0来记录当前连接数
界面非常简洁,咱们来看类库的使用方式.
第一步,引入命名空间
当引用xuanjiSocket类库以后,请添加
添加服务端类.如果没有引入命名空间,那么可以将鼠标光标置于类变量中,按快捷键 Shift + Alt + F10 自动引入类库命名空间
- SocketHelper.TcpServer server;
复制代码
在窗体加载事件中,完成对server变量的初始化.
SocketHelper.pushSockets = new SocketHelper.PushSockets(Rec);
这是本类非常重要的委托变量.
它的作用就是推送所有信息.!请在Start前对其初始化.!
- private void Rec(SocketHelper.Sockets sks)
- {
- }
复制代码
这是处理推送器消息的方法.!
SocketHelper.Sockets
大家可以看下这个自定义对象
- /// <summary>
- /// 自定义Socket对象
- /// </summary>
- public class Sockets
- {
- /// <summary>
- /// 接收缓冲区
- /// </summary>
- public byte[] RecBuffer = new byte[8 * 1024];
- /// <summary>
- /// 发送缓冲区
- /// </summary>
- public byte[] SendBuffer = new byte[8 * 1024];
- /// <summary>
- /// 异步接收后包的大小
- /// </summary>
- public int Offset { get; set; }
- /// <summary>
- /// 空构造
- /// </summary>
- public Sockets() { }
- /// <summary>
- /// 创建Sockets对象
- /// </summary>
- /// <param name="ip">Ip地址</param>
- /// <param name="client">TcpClient</param>
- /// <param name="ns">承载客户DuanSocket的网络流</param>
- public Sockets(IPEndPoint ip, TcpClient client, NetworkStream ns)
- {
- Ip = ip;
- Client = client;
- nStream = ns;
- }
- /// <summary>
- /// 当前IP地址,端口号
- /// </summary>
- public IPEndPoint Ip { get; set; }
- /// <summary>
- /// 客户Duan主通信程序
- /// </summary>
- public TcpClient Client { get; set; }
- /// <summary>
- /// 承载客户DuanSocket的网络流
- /// </summary>
- public NetworkStream nStream { get; set; }
- /// <summary>
- /// 发生异常时不为null.
- /// </summary>
- public Exception ex { get; set; }
- /// <summary>
- /// 新客户Duan标识.如果推送器发现此标识为true,那么认为是新的连接
- /// </summary>
- public bool NewClientFlag { get; set; }
- }
复制代码
每个属性都有注释,来解释这个属性的作用..具体处理细节.请下载demo阅读
上面那些信息绝非无用,而是整个类的重中之重以及消息处理方式.
启动类库,并开始监听
- erver.InitSocket(IPAddress.Any, 9527);//监听所有地址,监听端口为9527
- server.Start();//启动服务端
复制代码
之前在窗体加载时已经初始化过变量,现在直接使用它的InitSocket来配置服务端.使用Start方法启动监听.!
默认调用后便认为监听成功.!
如若其他情况,例如异常时: 会推送监听失败消息至服务端Rev方法中.具体参阅源码.
停止服务端
直接调用Stop方法即可停止服务端.Stop方法调用后,可继续启动服务端.!
至此,服务端的描述就介绍完了,使用非常简单,
你要做的就下面几件事:
1 、 声明服务端变量。
2 、 初始化推送器。
3 、 配置服务端。
4 、 启动服务端
服务端发送信息
服务端有两个自带方法
- server.SendToAll("服务端消息:msdn5.com 随机消息:"+Guid.NewGuid().ToString());//直接发送字符串
复制代码
该方法将会对所有连接至服务端的客户Duan发送消息.如果在发送中客户Duan下线或发生异常,服务端将维护客户Duan集合 ClientList
ClientList 会在客户Duan接入时添加.如果发生异常等情况会自动删除
- SendToClient(IPEndPoint ip, string SendData);
复制代码
像单独某位客户发起数据.
当客户Duan连接时,除去ClientList会自动维护列表外,也会将客户Duan推送至UI界面,供大家组合自己想要的客户Duan列表.详细请阅读demo
客户Duan介绍
客户Duan与服务端一样,需要先声明客户Duan变量
- SocketHelper.TcpClients client; //声明客户Duan变量 与服务端一样在窗体加载时初始化.
复制代码
配置客户Duan,启动客户Duan.
- client.InitSocket(ip, int.Parse(port)); //IP地址支持字符串类型
- client.Start();
复制代码
客户Duan发送方法,与服务端一致.调用Send方法.调用Start方法来连接服务器,调用Stop方法断开连接.支持断开后重新连接服务端
最后来一张运行时的截图吧
Demo + 类库下载地址:
XuanJiSocketDemo_2.6.4.zip
(164.76 KB, 下载次数: 36)
|
|