SocketHelper类说明

本类库采用TcpLister,TcpClient高度封装,
采用NetworkStream进行异步模式读取数据.
采用Semaphore来进行并发控制,
放弃异步的最大原因还是在对于新手朋友来说难以理解异步的处理方式,在本类库中还有一个没有加入工程的asynchelper,这个类库是纯异步实现.
当前处理方式:  异步+同步 ,海量数据并发不是靠异步就能解决的问题,在对学习Socket和想快速使用Socket的朋友来说,同步是很好的选择.
可同时接受5000+连接同时访问,而CPU消耗完全忽略不计..
本着代码简洁,简单.通俗易懂的原则,进行代码封装,不像其他通信框架写很多各式各样的接口.对新手朋友和刚接触通信程序的朋友带来很大的困扰.
本代码完全开源,但请保留署名,以示尊重.!

感谢 tan133 对本类库的支持,几乎几个更新的bug/不人性化 都是他找出来的.很给力..

更新日志


  • 2.6.3

  • 修正缓冲区大小为1024

  • 新增服务端重载,可监听所有网卡

  • 修正若干小bug.



  • 2.6.2修正部分

  • 增加服务端Demo多次开启判断.

  • 增加ErrorCode中的ConnectSuccess状态(用于推送连接状态)

  • 修正一写无用/冗余代码

  • 增加客户端Demo状态推送扩展


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




  • 修改原发送sendData 方法为SendToClient  允许直接发送byte数组

  • 增加 SendToClient 重载  【 直接发送byte 】

/// <summary>
           /// 向某一位客户端发送信息
           /// </summary>
           /// <param name="ip">客户端IP+端口地址</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,
           }

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

服务端的调用


先来看下服务端的界面

image.png

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

界面非常简洁,咱们来看类库的使用方式.

第一步,引入命名空间


当引用xuanjiSocket类库以后,请添加

using XuanJiSocket;

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

SocketHelper.TcpServer server;
private void ServerDemo_Load(object sender, EventArgs e)
      { 
          server = new SocketHelper.TcpServer();//初始化变量
          
      }

在窗体加载事件中,完成对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">承载客户端Socket的网络流</param>
           public Sockets(IPEndPoint ip, TcpClient client, NetworkStream ns)
           {
               Ip = ip;
               Client = client;
               nStream = ns;
           }
           /// <summary>
           /// 当前IP地址,端口号
           /// </summary>
           public IPEndPoint Ip { get; set; }
           /// <summary>
           /// 客户端主通信程序
           /// </summary>
           public TcpClient Client { get; set; }
           /// <summary>
           /// 承载客户端Socket的网络流
           /// </summary>
           public NetworkStream nStream { get; set; }
           /// <summary>
           /// 发生异常时不为null.
           /// </summary>
           public Exception ex { get; set; }
           /// <summary>
           /// 新客户端标识.如果推送器发现此标识为true,那么认为是新的连接
           /// </summary>
           public bool NewClientFlag { get; set; }
       }

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

启动类库,并开始监听
server.InitSocket(IPAddress.Any, 9527);//监听所有地址,监听端口为9527
                server.Start();//启动服务端

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

停止服务端


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

服务端发送信息


服务端有两个自带方法

server.SendToAll("服务端消息:[url=http://www.xuanjics.com]www.xuanjics.com[/url] 随机消息:"+Guid.NewGuid().ToString());//直接发送字符串

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

[C#] 纯文本查看 复制代码
1
SendToClient(IPEndPoint ip, string SendData);


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

客户端介绍

image.png

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

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

接着初始化推送器,

SocketHelper.pushSockets = new SocketHelper.PushSockets(Rec);//在窗体加载时初始化推送器

配置客户端,启动客户端.

client.InitSocket(ip, int.Parse(port)); //IP地址支持字符串类型
                client.Start();

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


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

image.png



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
  • 评论列表:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864