4.3.5更新说明:
修复各种BUG。 重写了一份 protobuf-net 有什么用呢,不需要添加 protobuf标签了。
值得注意的是 加了标签的类 里面的属性 都需要加,不加标签的 什么标签都不要加
注意已经删除了 Poienter 类 默认使用 默认使用 protobuf-net 格式化
CSDN:http://luyikk.download.csdn.net/
github:https://github.com/luyikk/ZYSOCKET
NUGET DLL:PM> Install-Package ZYSOCKETDLL
NUGET Soruce:PM> Install-Package ZYSOCKETSource
byluyikk@126.com
BLOG:http://blog.csdn.net/luyikk
QQ:547386448
4.3更新说明:
使用了 ZYNetRingBufferPool 代替 ZYNetBufferReadStream
使用了 ZYNetRingBufferPoolV2 代替了 ZYNetBufferReadStreamV2
这2个类是 线程安全的,测试代码 里面有。这2个类基于环形数据缓冲的,你懂的。不懂百度吧~
ZySocketSuper 添加了 public BinaryInputOffsetHandler BinaryOffsetInput { get; set; }
你现在可以 使用偏移量 来把数据包输入到 缓冲池了。 对了 别忘了 把 IsOffsetInput 设置成true 详细看例1
这样做的好处是可以 少一次copy
ZYSocket.share.ReadBytes and ZYSocket.share.ReadBytesV2 添加了 直接读取函数 比如 int i=read.readInt32() 为了方便嘛
UDPService 嘛 目前测试阶段用的比较少。大家有空可以帮忙测测
对了 所有例子 我都改成了 RingBufferPool.
CSDN:http://luyikk.download.csdn.net/
github:https://github.com/luyikk/ZYSOCKET
NUGET DLL:PM> Install-Package ZYSOCKETDLL
NUGET Soruce:PM> Install-Package ZYSOCKETSource
byluyikk@126.com
BLOG:http://blog.csdn.net/luyikk
QQ:547386448
4.2.3更新说明:
添加了.NET 4版本的 ZYSOCKETShare
.NET 4版本的 集成了 MsgPack 以及 Protobuf
例子请看 例子 7 例子8
.NET 4版本添加了 Socket RPC
例子请看 例子 9
更相信的双工例子 请看 例子9- RPC 聊天室 双工
添加了 CmdToCallManager 用于处理 服务器多Cmd 自动指向函数 来代替 switch
详细请看 例子10 CmdToCall
CSDN:http://luyikk.download.csdn.net/
NUGET:PM> Install-Package ZYSOCKETSourceAndExample
byluyikk@126.com
BLOG:http://blog.csdn.net/luyikk
QQ:547386448
4.2.2 已经出了 修复了一些问题.
完全支持MONO 平台.
提供了安卓平台的MONO 版本 提供了 TCP P2P 安卓例子~
服务器项目使用.NET 4了.其他的不变,比如CLIENTB 还是.NET 2.0 为了向下兼容嘛
请大家到
CSDN:http://luyikk.download.csdn.net/ (安卓需独立下载)
NUGET: 搜索 ZYSOCKET (有安卓版本) CMD:PM> Install-Package ZYSOCKETSourceAndExample
byluyikk@126.com
BLOG:http://blog.csdn.net/luyikk
QQ:547386448
//------------------------4.2.1-------------------------
1更新了点小BUG. 包括组包下 特别小的包的错误问题
2添加了 ZYSocketSSLClient 可以对 SSL 服务器的 访问
3例5
4MONO Server
5添加了 ZYSocketSSLClient 访问工行网站例子
ZYSOCKET 4.2(v2) 下载地址:http://luyikk.download.csdn.net/
注意:如果服务时间长了发现 Handler 不下降 到达几万的时候服务器无法服务了。 那么
在服务器端这里加上这句话就可以了。
socketAsync.AcceptSocket.Close();
socketAsync.AccpetSocket.Dispose();
如果你发现你无法调用 Socket.Dispose() 那么 请使用 .NET 4.0
小知识:
那么Handler出现泄漏是怎么样的呢,一般在任务管理器看到 Handler出现上万了,导致服务器无法服务就是 Handler泄漏了那源代码 例1说吧一般服务需要 400多个 Handler,然后一个用户一个 socket对象 需要1个 Handler 如果 Handler数=用户连接数+450 左右 那么就是正常的,如果Handler数>用户连接数+450 已经出现了翻倍现象,那么就是不正常了
北风之神SOCKET框架组4.2(V2)发布:
//-------------------------4.2-------------------------
更新了一个 TCPP2P 框架 详细看说明 ZYSocketFrame2TCPP2P说明.txt
说明.txt:
P2PCLIENT 基本 DLL
P2PSERVER P2P服务器,一般不需要咋改
P2PFileINFO 用次框架实现的 一款文件共享系统 一个测试程序
TestClientConsole 教你如何在你的项目中 使用 P2PCLIENT 一个测试程序
此P2P是基于 TCP的,能穿透大多数路由器
原理: C 同时连接 对方的 连接出的端口号 S 用于同步 C
可做项目: 想的到就做的到,比如能做个 在家就能直接访问公司电脑的一款程序,服务器文件同步程序等
P2PSERVER P2P服务器 架设方法:
首先在服务器上 部署 P2PSERVER. Config 文件基本不用修改 当然你也根据需要修改
MServerPort 为主服务端口
RegServerPort 为副端口
MaxConCount 为连接最大数
ServerIP 为服务IP
P2PFileINFO 架设方法:
修改Config文件
ServerIP 为P2P服务器IP
ServerPort 为服务器端口 对于上面的 MServerPort
ServerRegPort 为服务器符端口 对于上面的 RegServerPort
MinPort 和 MaxPort 为端口号范围 一般不用改
ResCount 为 连接次数
ConnentKey 为访问密码
SharePath 为 共享目录
TestClientConsole CONFIG:
ServerIP 为P2P服务器IP
ServerPort 为服务器端口 对于上面的 MServerPort
ServerRegPort 为服务器符端口 对于上面的 RegServerPort
MinPort 和 MaxPort 为端口号范围 一般不用改
ResCount 为 连接次数
byluyikk@126.com
BLOG:http://blog.csdn.net/luyikk
QQ:547386448
ZYSOCKET 4.2(v2) 下载地址:http://luyikk.download.csdn.net/
北风之神SOCKET框架组4.1(V2)发布:
1.使用sharpSerializerSolution 序列化,反序列化,提高了性能,(感谢麦上飞提供)
注意此组件只能序列化有 无参构造函数的类。所以多使用自定义类!!像DataSet DataTable会失败,如果你想序列化这些,请把序列化代码改回去吧。它们在 BufferFormat.cs 和 ReadBytes.cs 里面 很容易找到
2.修复了一些已知的BUG。
byluyikk@126.com
BLOG:http://blog.csdn.net/luyikk
QQ:547386448
ZYSOCKET 4.1(v2) 下载地址: http://luyikk.download.csdn.net/
第2次修复一个BUG:
ZYSocketFrame2北风之神SOCKET框架(ZYSocket)YSocketShareshareYNetBufferReadStream.cs
请将Flush方法修改为:
- publicoverridevoidFlush()
- {
- _capacity=MaxSize;
- Datas=newbyte[_capacity];
- _length=0;
- _canRead=true;
- _canWrile=true;
- _headlengt=-1;
- _position=0;
- _pw=0;
- }
修复一个小问题:
请将.YSocketFrame2北风之神SOCKET框架(ZYSocket)YSocketShareshareYNetBufferReadStreamV2.cs CheckHeadLengt()方法修改为:
- protectedoverridevoidCheckHeadLengt()
- {
- if(_headlengt==-1)
- {
- //intnum=(_length-_pw);
- //if(HeadBit>num)
- //{
- //return;
- //}
- re:
- while(Datas[_pw]!=0xFF)
- {
- if(_pw<_length-1)
- _pw++;
- else
- return;
- }
- _pw++;
- if(_pw>=_position-1)
- return;
- bytelengt;
- uintres;
- if(!ReadUInt32(outres,outlengt))
- return;
- if(res>0)
- {
- if(res>MaxSize)
- {
- this._headlengt=-1;
- RestPostion();
- return;
- }
- this._headlengt=(int)res;
- }
- else
- {
- _pw+=lengt;
- gotore;
- }
- }
- }
北风之神SOCKET框架组4.0(V2)发布:
1.添加了一组新的数据包处理类
ZYSocketShare.share.ZYNetBufferReadStream //此类可代替 ZYSocketShare.share.BuffList
ZYSocketShare.share.ZYNetBufferReadStreamV2 //此类是 ZYSocketShare.share.ZYNetBufferReadStream 的改进版,优化了int存储方式,数据包容错率等
ZYSocketShare.share.BufferFormatV2 //此类是 ZYSocketShare.share.BufferFormat 的改进版,优化了int存储方式等
ZYSocketShare.share.ReadBytesV2 //此类是 ZYSocketShare.share.ReadBytes 的改进版,优化了int存储方式等
注意 如果需要更换为V2数据包处理框架,那么请确保 使用ZYNetBufferReadStreamV2 BufferFormatV2 ReadBytesV2 保持一致的应用。
添加了案例
1. 例1(V2) 例1的V2例子
2. 例4(FileIO) 一款使用 V2 数据包处理架构 制作的一个远程文件系统管理程序 注意:初学者请勿轻易修改任何代码,否则可能会影响测试效果
byluyikk@126.com
BLOG:http://blog.csdn.net/luyikk
QQ:547386448
ZYSOCKET4.0(v2) 下载地址: http://luyikk.download.csdn.net/
北风之神SOCKET框架组3.2发布:
修改了 ReadObject方法,经过测试.出于性能的考虑和使用的方便 内部采用了DataContractSerializer 序列化.
bool ReadObject(out object obj) 变成了bool ReadObject<T>(out T obj);
继承与FormatClassAttibutes的数据包类不需要[Serializable]标签了.
修改了服务器端 ZYSocketSuper 类.
ZYSocketSuper 的构造方法 里面传入IP地址和端口,一直存在错误.我最近才发觉.抱歉各位
删除了 例4 代码. 因为我觉得 这简直就是误导人.
代码在数据包缓存还不是很完美,特别是处理大型连续分段数据包上.还有待改进.简单的改进理论是使用NetWorkStream 来代替现有的数据包缓冲区.由于没时间,这部分交给大家自己研究吧,但是如果不传文件.那已经基本上都够用了.更何况传文件还有其他的方法.
本打算写一份基于OOP概念的框架模型.但是时间太紧了.最近一直在搞C++ 一直没如愿以偿.
感谢 麦上飞 提供技术支持. Sorry!!
byluyikk@126.com
BLOG:http://blog.csdn.net/luyikk
QQ:547386448
ZYSOCKET 3.2 下载地址:http://luyikk.download.csdn.net/
//----------------------------------以下3.1更新内容-----------------------------------
感谢大家对北风之神SOCKET框架的支持。鼓励。下面是北风之神 3.1的更新内容:
修正BUG:
1.ZYSocketSuper 读取 配置文件的最大连接数 读错问题。
2.ZYSocketSuper 无法断开客户端的问题。
3.BuffList 数据包解析丢失问题。
4.例1,例2.客户端断开忘记释放调用SOCKET.CLOSE()的问题
新增功能
1.添加了一个ReadBytes 构造函数,此函数实现了在数据包在读取前需要回调的方法传入。(可以用来解密,解压缩 等功能)
2.添加了一个BufferFormat 类的构造,此函数实现了在数据包在生成前需要回调的方法传入。(可以用来加密,压缩 等功能)
3.添加了BufferFormat.FormatFCA(object o,FDataExtraHandle dataExtra)静态方法。可以用来在类格式化成数据包的时候进行加
密压缩等功能
4.添加了ZYSocket.Security 命名空间,里面有传统的AES,DES算法的加解密类
5.添加了ZYSocket.Compression命名空间,里面有通过Deflate算法压缩类
6.开发了ReadBytes.Data属性,为ReadBytes里面的BYTE[]对象。值得注意的是 ReadBytes.Length为数据包原始长度,如果要得到解压缩后的数据包长度,请访问ReadByte.Data.length
新增代码
加解密实例测试 项目:演示了 AES DES 以及Deflate 的使用方法。
例3 - 例2的加密版 项目:就是讲例2通过DES 加密进行通讯的例子
连接测试工具 项目:很多朋友问我要连接数量测试工具。我一起的真的丢了。找不到了。所以重新写了一个
例4 项目:好多人让我写一个发送文件的例子,现在能如愿以偿了
byluyikk@126.com
BLOG:http://blog.csdn.net/luyikk
QQ:547386448
ZYSOCKET 3.1 下载地址:http://luyikk.download.csdn.net/
//-----------------------------------------以下为3.0发布内容--------------------------------
北风之神SOCKET框架组3.0说明:
北风之神框架(ZYSOCKETSUPTER) 从1.0开始 就以超强的性能 得到了大家的支持;
北风之神 主要更新以下内容:
1. 一个基于 SocketAsyncEventArgs 的客户端 (ZYSocketClientA.dll)ZYSocket.ClientA.SocketClient
它支持.net 3.0以上版本,还适用于silverlight
性能非常优异,代码量小;
2. 一个数据包缓冲类 ZYSocketShare.dll (ZYSocket.share.BuffList)
BuffList是个性能优秀,线程安全的,数据包缓冲类。而且使用起来实在太方便了。
3.一个数据包格式化类 ZYSocketShare.dll (ZYSocket.share.BufferFormat)
BufferFormat 是个性能优异 功能强大的类,主要功能是讲各种.NET数据结构的数据转换为数据包。
支持对自定义类对象转换。
4.一个.net数据结构格式化类 ZYSocketShare.dll (ZYSocket.share.ReadBytes)
它和BufferFormat 是对应关系,通过这个类你可以轻易将数据包转换成.NET 数据结构,性能优越,功能强大,并可以直接讲数据包转换为对象。
5.FormatClassAttibutes标签。ZYSocketShare.dll(ZYSocket.share.FormatClassAttibutes)
凡是打了此标签的类,并打了Serializable,就刻个通过上面的2个类直接讲对象转换成数据包通过SOCKET发送。FormatClassAttibutes的功能就是用来设置此类的数据包命令的
6.ZySocketSupter 更新:
优化了代码,并更新了对域名支持,以及从配置文件中读取服务配置
本包中包含2个例子
2个例子都有代码注释 总实现代码不超过 100行
第一个是 讲解 控制台程序 使用本框架
第二个是 讲解 WINFROM程序 使用本框架
一下是面向对象数据包的部分代码
- //定义通讯的数据包类
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Text;
- usingZYSocket.share;
- namespaceBuffLibrary
- {
- ///<summary>
- ///用于发送消息
- ///</summary>
- [Serializable]
- [FormatClassAttibutes(500)]
- publicclassMessage
- {
- ///<summary>
- ///消息类型,1登入失败,2登入成功..其他未定义
- ///</summary>
- publicintType{get;set;}
- ///<summary>
- ///消息字符串
- ///</summary>
- publicstringMessageStr{get;set;}
- }
- ///<summary>
- ///登入数据包
- ///</summary>
- [Serializable]
- [FormatClassAttibutes(1000)]
- publicclassLogin
- {
- ///<summary>
- ///用户名
- ///</summary>
- publicstringUserName{get;set;}
- ///<summary>
- ///密码
- ///</summary>
- publicstringPassWord{get;set;}
- }
- ///<summary>
- ///PING数据包
- ///</summary>
- [Serializable]
- [FormatClassAttibutes(800)]
- publicclassPing
- {
- ///<summary>
- ///发送的时候记录的时间
- ///</summary>
- publicDateTimeUserSendTime{get;set;}
- ///<summary>
- ///服务器接受记录的时间
- ///</summary>
- publicDateTimeServerReviceTime{get;set;}
- }
- ///<summary>
- ///读取DATASET请求
- ///</summary>
- [Serializable]
- [FormatClassAttibutes(1002)]
- publicclassReadDataSet
- {
- publicstringTableName{get;set;}
- publicSystem.Data.DataSetData{get;set;}
- }
- }
- //使用自己定义的数据包类通讯
- voidclient_DataOn(byte[]Data)
- {
- ReadBytesread=newReadBytes(Data);
- intlength;
- intcmd;
- if(read.ReadInt32(outlength)&&read.ReadInt32(outcmd)&&length==read.Length)
- {
- switch(cmd)
- {
- case800://PING命令
- {
- objectpingo;
- if(read.ReadObject(outpingo))
- {
- Pingp=pingoasPing;
- if(p!=null)
- this.BeginInvoke(newEventHandler((o,x)=>
- {
- Pingnn=oasPing;
- if(nn!=null)
- {
- toolStripStatusLabel1.Text=string.Format("Ping:{0}({1})",//计算并显示PING
- (DateTime.Now-nn.UserSendTime).Milliseconds,
- (DateTime.Now-nn.ServerReviceTime).Milliseconds);
- }
- }),p);
- }
- }
- break;
- case1002:
- objectdataseto;
- if(read.ReadObject(outdataseto))//获取服务器发送过来的DATASET
- {
- ReadDataSetdox=datasetoasReadDataSet;
- if(dox!=null)
- {
- this.BeginInvoke(newEventHandler((o,x)=>
- {
- ReadDataSetnn=oasReadDataSet;
- if(nn!=null)
- {
- this.dataGridView1.DataSource=nn.Data.Tables[nn.TableName];//绑定到视图
- this.dataGridView1.Update();
- }
- }),dox);
- }
- }
- break;
- }
- }
- }
这2段代码只是部分代码,
3.0 下载地址
http://download.csdn.net/source/2939736
至于为什么要叫北风之神呢?
因为 最近特别冷,温度突然降低16度,冻死我了。北风吹的我都块痉挛了。 我对着天空喊 北风之神 刮慢点吧。
正因为这个代码这这样的环境下写的,所以 叫做北风之神
#region 补丁:
修正 BuffList类丢失数据包问题!
- /*
- *北风之神SOCKET框架(ZYSocket)
- *BoreySocketFrame(ZYSocket)
- *byluyikk@126.com
- *Updated2011-1-20
- */
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Text;
- usingSystem.Threading;
- usingSystem.IO;
- namespaceZYSocket.share
- {
- ///<summary>
- ///数据包组合类
- ///功能描述:保持数据包完整性。
- ///(通过互联网发送数据包,实际上是将一个较大的包拆分成诺干小包,此类的功能就是讲诺干小包重新组合成完整的数据包)
- ///此类是线程安全的
- ///</summary>
- publicclassBuffList
- {
- publicobjectlocklist=newobject();
- ///<summary>
- ///数据包列表
- ///</summary>
- publicList<byte>ByteList{get;set;}
- privateintcurrent;
- privateintlengt;
- privateintVlent;
- ///<summary>
- ///数据包有可能出现的最大长度。如果不想服务器被人攻击到内存崩溃请按实际情况设置
- ///</summary>
- publicintMaxSize{get;set;}
- ///<summary>
- ///数据包组合类
- ///</summary>
- ///<paramname="maxSize">数据包有可能出现的最大长度。如果不想服务器被人攻击到内存崩溃请按实际情况设置</param>
- publicBuffList(intmaxSize)
- {
- MaxSize=maxSize;
- lengt=-1;
- Vlent=0;
- ByteList=newList<byte>();
- }
- publicvoidReset()
- {
- Interlocked.Exchange(reflengt,-1);
- Interlocked.Exchange(refVlent,0);
- Interlocked.Exchange(refcurrent,0);
- ByteList.Clear();
- }
- publicboolInsertByteArray(byte[]Data,intml,outList<byte[]>datax)
- {
- lock(locklist)
- {
- datax=newList<byte[]>();
- ByteList.AddRange(Data);
- Interlocked.Add(refVlent,Data.Length);
- if(lengt==-1&&Vlent>ml)
- {
- intres=0;
- for(inti=0;i<ml;i++)
- {
- inttemp=((int)ByteList[current+i])&0xff;
- temp<<=i*8;
- res=temp+res;
- }
- if(res>MaxSize)
- {
- Reset();
- thrownewException("数据包大于预设长度,如果你传入的数据比较大,请设置重新maxSize值");
- }
- if(res<=0)
- {
- Reset();
- returnfalse;
- }
- Interlocked.Exchange(reflengt,res);
- }
- if((Vlent-current)>=lengt)
- {
- intlengx=lengt;
- Interlocked.Exchange(reflengt,-1);
- byte[]data=newbyte[lengx];
- ByteList.CopyTo(current,data,0,lengx);
- datax.Add(data);
- Interlocked.Add(refcurrent,lengx);
- recopy:
- if(current==ByteList.Count)
- {
- Reset();
- returntrue;
- }
- if(ByteList.Count-current>ml)
- {
- intres=0;
- for(inti=0;i<ml;i++)
- {
- inttemp=((int)ByteList[current+i])&0xff;
- temp<<=i*8;
- res=temp+res;
- }
- if(res>MaxSize)
- {
- Reset();
- thrownewException("数据包大于预设长度,如果你传入的数据比较大,请设置重新maxSize值");
- }
- if(res<=0)
- {
- Reset();
- returntrue;
- }
- if(ByteList.Count-current<res)
- {
- returntrue;
- }
- data=newbyte[res];
- ByteList.CopyTo(current,data,0,res);
- datax.Add(data);
- Interlocked.Add(refcurrent,res);
- gotorecopy;
- }
- returntrue;
- }
- else
- {
- returnfalse;
- }
- }
- }
- }
- }
修正后的 BuffList类 所需的调用修改:
- //BuffList数据包组合类如果不想丢数据就用这个类吧
- BuffListbuff=socketAsync.UserTokenasBuffList;
- List<byte[]>datax;
- if(buff.InsertByteArray(data,4,outdatax))//强力插入数据包,如果数据包组合成功返回TURE并输出数据包
- {
- if(datax!=null)
- {
- foreach(byte[]pindatax)
- {
- DataOn(p,socketAsync);
- }
- }
- }
#endregion
http://blog.csdn.net/luyikk/article/details/6099337