C# SocketHelper 源码
玄机论坛Socket类库源码+Demo
本类库采用C# TcpLister,TcpClient高度封装,
采用C# NetworkStream进行异步模式读取数据.
采用C# Semaphore来进行并发控制,
我使用的是同步方式连接,海量数据并发不是靠异步就能解决的问题,在对学习Socket和想快速使用Socket的朋友来说,同步是很好的选择.
使用IOCP的Socket类正在测试阶段,稳定,排除BUG后一样会分享给大家.
可同时接受5000+连接同时访问,而CPU消耗完全忽略不计..
本着代码简洁,简单.通俗易懂的原则,进行代码封装,不像其他通信框架写很多各式各样的接口.对新手朋友和刚接触通信程序的朋友带来很大的困扰.
本代码完全开源,但请保留署名,以示尊重.!
下面我和大家一起来分享这个类库的使用方式.
服务端的调用
先来看下服务端的界面
<ignore_js_op>
第一个列表框用来获取服务端状态信息.
第二个列表框用来获取客户端发来的消息.
一个下来列表框来记录客户端上线.边上的0来记录当前连接数
界面非常简洁,咱们来看类库的使用方式.
第一步,引入命名空间
当引用xuanjiSocket类库以后,请添加
1
|
using XuanJiSocket; |
添加服务端类.如果没有引入命名空间,那么可以将鼠标光标置于类变量中,按快捷键 Shift + Alt + F10 自动引入类库命名空间
1
|
SocketHelper.TcpServer server; |
1
2
3
4
5
|
private void ServerDemo_Load( object sender, EventArgs e) { server = new SocketHelper.TcpServer(); //初始化变量 } |
在窗体加载事件中,完成对server变量的初始化.
SocketHelper.pushSockets = new SocketHelper.PushSockets(Rec);
这是本类非常重要的委托变量.
它的作用就是推送所有信息.!请在Start前对其初始化.!
1
2
3
|
private void Rec(SocketHelper.Sockets sks) { } |
这是处理推送器消息的方法.!
SocketHelper.Sockets
大家可以看下这个自定义对象
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
/// <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阅读
上面那些信息绝非无用,而是整个类的重中之重以及消息处理方式.
启动类库,并开始监听
1
2
|
server.InitSocket(IPAddress.Any, 9527); //监听所有地址,监听端口为9527 server.Start(); //启动服务端 |
之前在窗体加载时已经初始化过变量,现在直接使用它的InitSocket来配置服务端.使用Start方法启动监听.!
默认调用后便认为监听成功.!
如若其他情况,例如异常时: 会推送监听失败消息至服务端Rev方法中.具体参阅源码.
停止服务端
直接调用Stop方法即可停止服务端.Stop方法调用后,可继续启动服务端.!
至此,服务端的描述就介绍完了,使用非常简单,
你要做的就下面几件事:
1 、 声明服务端变量。
2 、 初始化推送器。
3 、 配置服务端。
4 、 启动服务端
服务端发送信息
服务端有两个自带方法
1
|
server.SendToAll( "服务端消息:[url=http://www.msdn5.com]www.msdn5.com[/url] 随机消息:" +Guid.NewGuid().ToString());//直接发送字符串 |
该方法将会对所有连接至服务端的客户端发送消息.如果在发送中客户端下线或发生异常,服务端将维护客户端集合 ClientList
ClientList 会在客户端接入时添加.如果发生异常等情况会自动删除
1
|
SendToClient(IPEndPoint ip, string SendData); |
像单独某位客户发起数据.
当客户端连接时,除去ClientList会自动维护列表外,也会将客户端推送至UI界面,供大家组合自己想要的客户端列表.详细请阅读demo
客户端介绍
<ignore_js_op>
客户端与服务端一样,需要先声明客户端变量,
1
|
SocketHelper.TcpClients client; //声明客户端变量 与服务端一样在窗体加载时初始化. |
接着初始化推送器,
1
|
SocketHelper.pushSockets = new SocketHelper.PushSockets(Rec); //在窗体加载时初始化推送器 |
配置客户端,启动客户端.
1
2
|
client.InitSocket ( ip , int.Parse ( port ) ) ; / / IP地址支持字符串类型 client.Start ( ) ; |
客户端发送方法,与服务端一致.调用Send方法.调用Start方法来连接服务器,调用Stop方法断开连接.支持断开后重新连接服务端
最后来一张运行时的截图吧
<ignore_js_op>
运行截图.jpg (250.42 KB, 下载次数: 6)
Demo + 类库下载地址:
玄机论坛Socket类库源码 当前版本 2.6.3 更新日期:10-09/2015
http://bbs.msdn5.com/thread-27-1-1.html
(出处: C#论坛-玄机论坛-C#论坛-玄机宝盒-玄机类库-C#)
C# SocketHelper 源码的更多相关文章
- 玄机论坛Socket类库源码 当前版本 2.6.3 更新日期:10-09/2015 z
http://bbs.msdn5.com/thread-27-1-1.html 本类库采用TcpLister,TcpClient高度封装, 采用NetworkStream进行异步模式读取数据. 采用S ...
- netty集成ssl完整参考指南(含完整源码)
虽然我们在内部rpc通信中使用的是基于认证和报文头加密的方式实现安全性,但是有些时候仍然需要使用SSL加密,可能是因为对接的三方系统需要,也可能是由于open的考虑.中午特地测了下netty下集成ss ...
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- C# ini文件操作【源码下载】
介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 从源码看Azkaban作业流下发过程
上一篇零散地罗列了看源码时记录的一些类的信息,这篇完整介绍一个作业流在Azkaban中的执行过程,希望可以帮助刚刚接手Azkaban相关工作的开发.测试. 一.Azkaban简介 Azkaban作为开 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例
前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...
随机推荐
- UserAgentStringLibrary
It is at WebWorkContext.CurrentCustomer's part. //check whether request is made by a search engine / ...
- Linux下php安装phpredis
说明:php安装目录:/usr/local/php5php.ini配置文件路径:/usr/local/php5/etc/php.iniNginx安装目录:/usr/local/nginxNginx网站 ...
- QT Creator 代码自动补全快捷键设置
在QT Creater界面点Tools再进Options...(找到environment->Keyboard)在里面找到FakeVim目录下的,发现默认快捷键就是CTRL+SPACE,把它删除 ...
- hive-初看hive
网上搜了一下找了很多介绍hive的资料,不是官方翻译就是含糊描述,对于刚接触的很难直观认识 我从一本介绍hadoop的书里找到了一些hive的资料,没太多废话.可以看看 http://pan.baid ...
- 炼数成金hadoop视频干货03
视频地址:http://pan.baidu.com/s/1dDEgKwD 着重介绍了HDFS 运行了示例程序wordcount,自己也试了一遍(用的伪分布式) 1.建立数据(和讲师的操作有些不一样,不 ...
- isa-swizzling 是什么鬼?
刚看到这个名字估计很多人有点熟悉,Method Swizzling对不对,不熟悉也没关系,去看看之前的一篇文章黑魔法之Method Swizzling吧.不过也可以根据名称猜测出来所谓的isa-swi ...
- MYSQL基础笔记(一)
关系型数据库概念: 1.什么是关系型数据库? 关系型数据库:是一种建立在关系模型(数学模型)上的数据库 关系模型:一种所谓建立在关系上的模型. 关系模型包含三个方面: 1.数据结构:数据存储的问题,二 ...
- Java 8: Lambdas和新的集合Stream API
Lambda是Java8的主要特色,Java 8: Lambdas & Java Collections | zeroturnaround.com一文介绍了使用Lambda集合处理大量数据的方 ...
- ES各种错误解决
_update API 执行报错 错误信息: { "error": { "root_cause": [ { "type": "re ...
- 给jdk写注释系列之jdk1.6容器(6)-HashSet源码解析&Map迭代器
今天的主角是HashSet,Set是什么东东,当然也是一种java容器了. 现在再看到Hash心底里有没有会心一笑呢,这里不再赘述hash的概念原理等一大堆东西了(不懂得需要先回去看下Has ...