我们发送数据的时候,内容部分肯定是按照一定协议规则串联起来的数据,那么我们就需要把实体转化为发送的数据格式。综上所述,我们通过实体类,必须实现数据的发送和读取的转换。
///<summary>
///测试数据的实体类信息
///</summary>
publicclassTestDataRequest
{
#regionMyRegion
///<summary>
///请求序列
///</summary>
publicstringseq;
///<summary>
///用户帐号
///</summary>
publicstringuserid;
///<summary>
///用户密码
///</summary>
publicstringpsw;
#endregion
publicTestDataRequest(stringseq,stringuserid,stringpsw)
{
this.seq=seq;
this.userid=userid;
this.psw=psw;
}
publicTestDataRequest()
{
}
///<summary>
///转换Socket接收到的信息为对象信息
///</summary>
///<paramname="data">Socket接收到的信息</param>
publicTestDataRequest(stringdata)
{
string[]dataArray=null;
dataArray=NetStringUtil.UnPack(data);
if(dataArray!=null&&dataArray.Length>0)
{
TestDataRequestnewAnswerData=newTestDataRequest();
inti=0;
this.seq=dataArray[i++];
this.userid=dataArray[i++];
this.psw=dataArray[i++];
}
}
///<summary>
///转换对象为Socket发送格式的字符串
///</summary>
///<returns></returns>
publicoverridestringToString()
{
stringdata="";
data=this.seq+"|"+this.userid+"|"+this.psw.ToString();
data=NetStringUtil.PackSend(DataTypeKey.TestDataRequest,data);
returndata;
}
以上把数据的处理放在了实体类中进行封包和拆包,是一种比较好的做法,但是由于数据的封包拆包是一个繁琐的过程,代码重复性比较多,而且也容易出错。
这里设计了一个基类,来改进这种方式的数据处理,我们把所有对数据的拆包和封包,利用反射机制,减少我们的代码量,提高代码的优雅性。
publicclassBaseEntity
{
protectedstringHeaderKey;
publicBaseEntity()
{
}
///<summary>
///转换Socket接收到的信息为对象信息
///</summary>
///<paramname="data">Socket接收到的信息</param>
publicBaseEntity(stringdata)
{
string[]dataArray=null;
dataArray=NetStringUtil.UnPack(data);
if(dataArray!=null&&dataArray.Length>0)
{
inti=0;
FieldInfo[]fieldArray=ReflectionUtil.GetFields(this);
if(fieldArray==null||dataArray.Length!=fieldArray.Length)
{
thrownewArgumentException("收到的信息和字段信息不一致");
}
if(fieldArray!=null)
{
foreach(FieldInfoinfoinfieldArray)
{
stringstrValue=dataArray[i++];
ReflectionUtil.SetField(this,info.Name,strValue);
}
}
}
}
///<summary>
///转换对象为Socket发送格式的字符串
///</summary>
///<returns></returns>
publicoverridestringToString()
{
stringdata="";
FieldInfo[]fieldArray=ReflectionUtil.GetFields(this);
StringBuildersb=newStringBuilder();
if(fieldArray!=null)
{
foreach(FieldInfoinfoinfieldArray)
{
sb.Append(ReflectionUtil.GetField(this,info.Name));
sb.Append("|");
}
}
data=sb.ToString().Trim('|');
if(string.IsNullOrEmpty(HeaderKey))
{
thrownewArgumentNullException("DataTypeKey","实体类未指定协议类型");
}
data=NetStringUtil.PackSend(HeaderKey,data);
returndata;
}
}
以上的是实体类的基类,它封装了数据的拆包和封包过程,只需要在子类代码中指定协议头就可以了。子类的代码如下所示。
下面的代码是收到数据包,利用实体类构造函数,解析为实体类的操作,以及构造实体类,通过ToString()方式把实体类信息转化为可以发送的数据包的操作。
privatevoidTestDataHandle(PreDatadata)
{
TestDataRequestrequest=newTestDataRequest(data.Content);
Log.WriteInfo(string.Format("############{0}",request.ToString()));
TestDataAnswerDataanswerData=newTestDataAnswerData(request.Seq,request.UserId,request.Password);
ShopClientManager.This.AddSend(data.UserId,answerData.ToString(),true);
}
我编写的测试例子中,实体类的继承图如下所示。
分享到:
相关推荐
Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-...
socket.io,socket.io-client 用于java或android连接nodejs websocket
socket.io-client-0.5.0.jar包,在使用socket开发websocket的时候,用到的包。 socket.io-client-0.5.0.jar包,在使用socket开发websocket的时候,用到的包。
socket.io-events, 用类似事件路由的express实现你的socket.io 应用程序 使用 express express,如 event 路由,为你的 socket.io 应用程序提供强大的支持。$ npm install socket.io-eventsvar io = require('sock
HP-Socket-TCP-&-UDP-通信框架开发指南-(v4.2-20170420)
linux centos7的perl-IO-Socket-IP-0.21-5.el7.noarch.rpm包
计算机网络实验SOCKET编程----WEB服务器[C#版本].rar计算机网络实验SOCKET编程----WEB服务器[C#版本].rar
微信小程序socket.io客户端, 支持微信小程序、支付宝小程序socket.io-mp-client-master.zip
仿映客直播app(最新)原版礼物...云计算与大数据:包括云计算平台、大数据分析、人工智能、机器学习等,云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。
socket.io-client-master 陈老师最新作品
linux-socket-select-异步聊天 linux-socket-select-异步聊天 linux-socket-select-异步聊天
socket.io 的c++实现,基于websocketcpp 可以和socket.io 官方提供的 socket.io-client 实现对接
Socket.IO 可以提供实时、双向的基于事件的通信,这是 Socket.IO 官方出品的客户端,可以用在 iOS 和 macOS 上
socket.io-cpp-client-sample Socket.IO C++ 客户端示例。 该程序将本机客户端外壳上的命令结果提供给 Web 浏览器。 这个程序在有解释。 如何使用。 编译本机客户端。 $ git clone ...
Socket.IO-客户端-Unity3D 产品特点 Unity3D的Socket.IO客户端,与Socket.IO v1.0及更高版本兼容。 (当前不支持Socket.IO V2。) Socket.io是开源实时应用... 预发布和构建元数据的其他标签可作为MAJOR.MINOR.PATCH格
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
计算机网络实验SOCKET编程----WEB服务器
根据HPSocketCS.TcpPackServer server = new HPSocketCS.TcpPackServer();的封包规则进行mina拆包,解决断包,粘包问题。亲测,30ms一次数据,无丢包现象,20MB,300人使用网络,
通过socket通讯实现服务器与客户端的连接。首先服务器利用udp广播发送自己的ip地址,客户端在收到广播后通过此ip以tcp连接的方式连接服务器来通讯。
C# SuperSocket框架 ---客户端源程序,源程序包里有一个TCP测试工具,可以方便你进行测试,同时还附有测试成功的截图。