C#论坛-玄机论坛-C#论坛-玄机宝盒-玄机类库-C#

 找回密码
 关闭注册

QQ登录

只需一步,快速开始

查看: 94846|回复: 204

[XJSocket] 玄机论坛Socket类库源码 当前版本 2.6.3 更新日期:10-09/2015

  [复制链接]
君临 发表于 2014-10-11 22:15:25 | 显示全部楼层 |阅读模式

玄机论坛-专业的C#交流论坛 交流QQ群: 16885911
如有疑问,请加入官方群询问

您需要 登录 才可以下载或查看,没有帐号?关闭注册

x

本类库采用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 】
[mw_shl_code=csharp,true] /// <summary>
            /// 向某一位客户端发送信息
            /// </summary>
            /// <param name="ip">客户端IP+端口地址</param>
            /// <param name="SendData">发送的数据包</param>
            public void SendToClient(IPEndPoint ip, byte[] SendDataBuffer)[/mw_shl_code]

  • 增加掉线重连(自动复活)   方法名 : RestartInit()
  • 增加几个异常推送的枚举  ErrorCode
[mw_shl_code=csharp,true] /// <summary>
            /// 具体错误类型
            /// </summary>
            public enum ErrorCodes
            {
                /// <summary>
                /// 对象为null
                /// </summary>
                objectNull,
                /// <summary>
                /// 连接时发生错误
                /// </summary>
                ConnectError,
                /// <summary>
                /// 尝试发送失败异常
                /// </summary>
                TrySendData,
            }[/mw_shl_code]
下面我和大家一起来分享这个类库的使用方式.
服务端的调用

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

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

当引用xuanjiSocket类库以后,请添加
[mw_shl_code=csharp,true]using XuanJiSocket;[/mw_shl_code]
添加服务端类.如果没有引入命名空间,那么可以将鼠标光标置于类变量中,按快捷键 Shift + Alt + F10 自动引入类库命名空间
[mw_shl_code=csharp,true] SocketHelper.TcpServer server; [/mw_shl_code]
[mw_shl_code=csharp,true]  private void ServerDemo_Load(object sender, EventArgs e)
        {
            server = new SocketHelper.TcpServer();//初始化变量
           
        }[/mw_shl_code]
在窗体加载事件中,完成对server变量的初始化.
SocketHelper.pushSockets = new SocketHelper.PushSockets(Rec);

这是本类非常重要的委托变量.
它的作用就是推送所有信息.!请在Start前对其初始化.!
[mw_shl_code=csharp,true]private void Rec(SocketHelper.Sockets sks)
        {
        }[/mw_shl_code]
这是处理推送器消息的方法.!

SocketHelper.Sockets

大家可以看下这个自定义对象
[mw_shl_code=csharp,true] /// <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; }
        }[/mw_shl_code]

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

启动类库,并开始监听

[mw_shl_code=csharp,true]server.InitSocket(IPAddress.Any, 9527);//监听所有地址,监听端口为9527
                server.Start();//启动服务端
[/mw_shl_code]
之前在窗体加载时已经初始化过变量,现在直接使用它的InitSocket来配置服务端.使用Start方法启动监听.!
默认调用后便认为监听成功.!
如若其他情况,例如异常时: 会推送监听失败消息至服务端Rev方法中.具体参阅源码.
停止服务端

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

服务端有两个自带方法
                    [mw_shl_code=csharp,true]  server.SendToAll("服务端消息:www.xuanjics.com 随机消息:"+Guid.NewGuid().ToString());//直接发送字符串[/mw_shl_code]
该方法将会对所有连接至服务端的客户端发送消息.如果在发送中客户端下线或发生异常,服务端将维护客户端集合 ClientList
ClientList  会在客户端接入时添加.如果发生异常等情况会自动删除
[mw_shl_code=csharp,true]SendToClient(IPEndPoint ip, string SendData);[/mw_shl_code]
像单独某位客户发起数据.
当客户端连接时,除去ClientList会自动维护列表外,也会将客户端推送至UI界面,供大家组合自己想要的客户端列表.详细请阅读demo
客户端介绍

客户端界面.jpg
客户端与服务端一样,需要先声明客户端变量,
[mw_shl_code=csharp,true]SocketHelper.TcpClients client; //声明客户端变量 与服务端一样在窗体加载时初始化.
[/mw_shl_code]
接着初始化推送器,
[mw_shl_code=csharp,true]SocketHelper.pushSockets = new SocketHelper.PushSockets(Rec);//在窗体加载时初始化推送器[/mw_shl_code]
配置客户端,启动客户端.
[mw_shl_code=csharp,true]client.InitSocket(ip, int.Parse(port)); //IP地址支持字符串类型
                client.Start();[/mw_shl_code]
客户端发送方法,与服务端一致.调用Send方法.调用Start方法来连接服务器,调用Stop方法断开连接.支持断开后重新连接服务端


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

Demo + 类库下载地址:

XuanJiSocketDemo_2.6.4.zip (164.76 KB, 下载次数: 16367)
玄机论坛-专业的C#交流论坛 交流QQ群: 16885911
帖子内网盘失效后请使用下面地址

http://bbs.msdn5.com/forum.php?mod=viewthread&tid=1218
如果失效请联系站长重新分享
回复

使用道具 举报

 楼主| 君临 发表于 2014-10-11 22:25:12 | 显示全部楼层
我们使用最简单,最通俗易懂的代码,给你更高效,更舒心的体验.
玄机论坛-专业的C#交流论坛 交流QQ群: 16885911
帖子内网盘失效后请使用下面地址

http://bbs.msdn5.com/forum.php?mod=viewthread&tid=1218
如果失效请联系站长重新分享
回复 支持 反对

使用道具 举报

 楼主| 君临 发表于 2014-10-13 16:59:41 | 显示全部楼层
ofnhkb1 发表于 2014-10-13 15:31
楼主,我想问一下,如何用socket发送一个自定义对象呢,比如Model

将对象序列化成byte数组发送
玄机论坛-专业的C#交流论坛 交流QQ群: 16885911
帖子内网盘失效后请使用下面地址

http://bbs.msdn5.com/forum.php?mod=viewthread&tid=1218
如果失效请联系站长重新分享
回复 支持 反对

使用道具 举报

 楼主| 君临 发表于 2014-10-21 11:03:36 | 显示全部楼层
997553110 发表于 2014-10-21 10:47
新手有问题

1、客户端链接服务器端,如果正式开发的软件,有人恶意连接怎么办?就像demo一样一次连接很多 ...

正式开发中需要自己拟定协议来判断哪些是非法连接的.比如我的协议是上报一条论坛地址,如果是论坛地址的话,那么我服务端在新连接事件中允许加入集合.如果不是那么就移除集合.
当然不一定是非要在这里进行判断,当第一次连接时,上报一条数据来验证是不是自己的协议最好不过.
玄机论坛-专业的C#交流论坛 交流QQ群: 16885911
帖子内网盘失效后请使用下面地址

http://bbs.msdn5.com/forum.php?mod=viewthread&tid=1218
如果失效请联系站长重新分享
回复 支持 反对

使用道具 举报

 楼主| 君临 发表于 2014-10-21 12:50:52 | 显示全部楼层
997553110 发表于 2014-10-21 11:21
好的  谢谢

我正在网上找,也找到和你说的类似的   谢谢了

请等待视频教程的番外篇,番外篇着重讲多线程,委托,异步,Socket.届时请关注.!
玄机论坛-专业的C#交流论坛 交流QQ群: 16885911
帖子内网盘失效后请使用下面地址

http://bbs.msdn5.com/forum.php?mod=viewthread&tid=1218
如果失效请联系站长重新分享
回复 支持 反对

使用道具 举报

 楼主| 君临 发表于 2014-10-23 14:09:21 | 显示全部楼层

就这两天!
玄机论坛-专业的C#交流论坛 交流QQ群: 16885911
帖子内网盘失效后请使用下面地址

http://bbs.msdn5.com/forum.php?mod=viewthread&tid=1218
如果失效请联系站长重新分享
回复 支持 反对

使用道具 举报

 楼主| 君临 发表于 2014-10-29 21:42:14 | 显示全部楼层
smarteam.cc 发表于 2014-10-29 21:08
盼星星盼月亮,天上掉福利了。顶你!!!

  论坛以后会有更多的福利
玄机论坛-专业的C#交流论坛 交流QQ群: 16885911
帖子内网盘失效后请使用下面地址

http://bbs.msdn5.com/forum.php?mod=viewthread&tid=1218
如果失效请联系站长重新分享
回复 支持 反对

使用道具 举报

 楼主| 君临 发表于 2014-10-29 21:42:21 | 显示全部楼层
smarteam.cc 发表于 2014-10-29 21:08
盼星星盼月亮,天上掉福利了。顶你!!!

  论坛以后会有更多的福利
玄机论坛-专业的C#交流论坛 交流QQ群: 16885911
帖子内网盘失效后请使用下面地址

http://bbs.msdn5.com/forum.php?mod=viewthread&tid=1218
如果失效请联系站长重新分享
回复 支持 反对

使用道具 举报

 楼主| 君临 发表于 2015-3-8 13:11:19 | 显示全部楼层
tan133 发表于 2015-3-8 10:01
这是一个未完成的类库
测试发现,众多bug,
无故挂掉

使用的异步库?
玄机论坛-专业的C#交流论坛 交流QQ群: 16885911
帖子内网盘失效后请使用下面地址

http://bbs.msdn5.com/forum.php?mod=viewthread&tid=1218
如果失效请联系站长重新分享
回复 支持 反对

使用道具 举报

 楼主| 君临 发表于 2015-3-8 13:12:57 | 显示全部楼层
tan133 发表于 2015-3-8 10:01
这是一个未完成的类库
测试发现,众多bug,
无故挂掉

本类库已有很多人用在实际项目中,并未出现你所描述的任何状态.
玄机论坛-专业的C#交流论坛 交流QQ群: 16885911
帖子内网盘失效后请使用下面地址

http://bbs.msdn5.com/forum.php?mod=viewthread&tid=1218
如果失效请联系站长重新分享
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /2 下一条

QQ|玄机论坛

GMT+8, 2024-3-29 15:16 , Processed in 0.214356 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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