概述
环境配置
vs2015
windows7 64位
hp-socket 5.0
安装hp-socket
新建控制台项目TelnetServer,打开Nuget管理工具,搜索hp-socket:
安装成功后,会是如下的目录结构:
HP-SOCKET是使用c++开发的,所以针对不同的平台生成不同dll。
使用HP-SOCKET
在我们的main函数中,输入如下代码,大多数对于socket的封装都差不多,需要实现以下事件,这里也就直接声明使用了。
在这篇博客中,也只使用到了其中的三个。在实际项目中使用的时候,可按实际情况进行处理。
处理分包、粘包数据
使用socket进行通信,我们还需要跟调用方(客户端,我这里是智能硬件设备)协商好数据协议,也就是发送的数据包格式。比如一个完整数据包
{#version#<123456789>}rn // 结束符以回车换行为一个完整的包123456789>
所谓的分包,就是我们的服务器接收到数据不是一次性到达的,比如先接收到整个包前面一部分:
{#version#<12>
然后再接收到后面这部分数据:
3456789>}rn
同理,所谓的粘包,就是服务器接收到的数据是这样的:
{#version#<123456789>}rn{#version#
关键代码
1 private staticHPSocketCS.HandleResult Server_OnAccept(IntPtr connId, IntPtr pClient)2 {3 Console.WriteLine("New connection come in" +connId);4 var obj = server.GetExtra(connId);5 if (obj == null)//判断当前链接是否
6 {7 //存储分包对象信息
8 server.SetExtra(connId, newClientSocketInfo9 {10 connId =connId11 });12 }13 returnHandleResult.Ok;14 }
Server_OnAccept
private static HPSocketCS.HandleResult Server_OnReceive(IntPtr connId, byte[] bytes)
{
Console.WriteLine("总数 {0}", count);var obj = server.GetExtra(connId);try{var msg =System.Text.Encoding.Default.GetString(bytes);//按完整包结束符rn 获取数据
var Arr = msg.Split(new string[] { "rn" }, StringSplitOptions.RemoveEmptyEntries).Where(d => !string.IsNullOrEmpty(d)).ToList();foreach (var item inArr)
{
Console.WriteLine("Item data {0}", item);if (!item.Contains(">}"))//不包含>}说明是分包数据,存储到pack中
{
obj.pack+=item;
Console.WriteLine("obj.pack {0}", obj.pack);
}else{//如果包含>}并且pack不为空,说明是上个分包数据的结束数据
if (!string.IsNullOrEmpty(obj.pack))
{var fullPack = obj.pack +item;
Console.WriteLine("FullPack {0}", fullPack);//解析一个完整包后,清空当前句柄的分包数据
obj.pack = null;
Interlocked.Increment(refpack_count);
Console.WriteLine("Clear Pack");
}else{
Interlocked.Increment(refcount);//完整的包
Console.WriteLine("总数 {0}", count);
Console.WriteLine("分包_总数 {0}", pack_count);var bCount =System.Text.Encoding.Default.GetBytes(count.ToString());
server.Send(connId, bCount, bCount.Length);
Console.WriteLine("A Full package!");
Console.WriteLine("解析数据");
}
}
}
}catch(Exception ex)
{
Console.WriteLine(ex.Message);returnHandleResult.Error;
}returnHandleResult.Ok;
}
Server_OnReceive
希望这篇文章能帮助到大家。
密码 iuw8
123456789>12>最后
以上就是多情蜡烛为你收集整理的socket Php 粘包,HP-Socket快速入门:分包、粘包解析的全部内容,希望文章能够帮你解决socket Php 粘包,HP-Socket快速入门:分包、粘包解析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复