MiniSocket 采用socket tcp方式通讯,自动处理分包合并,性能高,使用简单,非常容易进行二次开发服务端使用:打开vs2017 新建.net core(2.1版本以上) 控制台应用,nuget搜索MiniSocket 下载代码: static void Main(string[] args)
{
// 实际化服务端对象
Network server = new Network();
// 设置ip地址
server.Ip = "127.0.0.1";
// 设置端口号
server.Port = 9123;
// 设置客户端最大连接数
server.ClientMaxCnt = 10;
// 设置接收超时
server.ReceiveTimeout = 1000 * 100;
// 设置发送超时
server.SendTimeout = 1000 * 100;
// 设置接收缓冲区大小
server.RecvBufferSize = 1024;
// 设置工作线程数
server.WorkThreadCnt = 20;
// 设置客户端超时时间(秒)
server.TimeOver = 30;
// 设置接收完成事件
server.RecvCompleted += RecvEventData;
// 初始化
bool bl = server.Init();
while(true)
{
Thread.Sleep(1000);
}
} /// <summary>
/// 接收完成事件
/// </summary>
/// <param name="e"></param>
/// <param name="sockArgs"></param>
private static void RecvEventData(Network e,SocketParas sockArgs)
{ try
{
string str_head = Encoding.UTF8.GetString(sockArgs.HeadByt);
string str_body = Encoding.UTF8.GetString(sockArgs.BodyByt); e.Send(sockArgs, Encoding.UTF8.GetBytes("this is header"), Encoding.UTF8.GetBytes("this is body"));
}
catch(Exception ex)
{
Print("RecvEventData "+ex.Message);
}
}客户端使用:打开vs2017 新建.net framework(4.0版本以上) 控制台应用,nuget搜索MiniSocketClient 下载代码: static void Main(string[] args)
{
// 实例化客户端对象
Network client = new Network();
// 设置ip地址
client.Ip = "127.0.0.1";
// 设置端口号
client.Port = 9123;
// 设置接收超时
client.ReceiveTimeout = 1000 * 30;
// 设置发送超时
client.SendTimeout = 1000 * 30;
// 设置接收缓冲区大小
client.ReceiveBufferSize = 1024;
// 接收完成事件
client.RecvCompleted += RecvComplete;
// 退出事件
client.ExitCompleted += ExitCompleted;
// 初始化
client.Init();
// 发送第一包数据
client.Send(Encoding.UTF8.GetBytes("hello china"), Encoding.UTF8.GetBytes("hello world")); while (true)
{
Thread.Sleep(10);
} }/// <summary>
/// 接收完成事件
/// </summary>
/// <param name="e"></param>
/// <param name="sockArgs"></param>
private static void RecvComplete(Network e, SocketParas sockArgs)
{
try
{ Console.WriteLine(Encoding.UTF8.GetString(sockArgs.HeadByt) + Encoding.UTF8.GetString(sockArgs.BodyByt));
e.Send(Encoding.UTF8.GetBytes("hello world"), Encoding.UTF8.GetBytes("hello MiniSocket"));
}
catch (Exception ex)
{
Print("RecvComplete " + ex.Message);
}
} /// <summary>
/// 发送完成事件
/// </summary>
/// <param name="e"></param>
/// <param name="sock"></param>
private static void SendComplete(Network e, SocketParas sock)
{ } /// <summary>
/// 退出事件
/// </summary>
/// <param name="state"></param>
/// <param name="msg"></param>
private static void ExitCompleted(int state, string msg)
{
switch (state)
{
case 0: // 正常
break;
case 1: // 连接异常
break;
case 2: // 发送异常
break;
case 3: // 接收异常
break;
case 4: // 手动强制退出
break;
}
}
{
// 实际化服务端对象
Network server = new Network();
// 设置ip地址
server.Ip = "127.0.0.1";
// 设置端口号
server.Port = 9123;
// 设置客户端最大连接数
server.ClientMaxCnt = 10;
// 设置接收超时
server.ReceiveTimeout = 1000 * 100;
// 设置发送超时
server.SendTimeout = 1000 * 100;
// 设置接收缓冲区大小
server.RecvBufferSize = 1024;
// 设置工作线程数
server.WorkThreadCnt = 20;
// 设置客户端超时时间(秒)
server.TimeOver = 30;
// 设置接收完成事件
server.RecvCompleted += RecvEventData;
// 初始化
bool bl = server.Init();
while(true)
{
Thread.Sleep(1000);
}
} /// <summary>
/// 接收完成事件
/// </summary>
/// <param name="e"></param>
/// <param name="sockArgs"></param>
private static void RecvEventData(Network e,SocketParas sockArgs)
{ try
{
string str_head = Encoding.UTF8.GetString(sockArgs.HeadByt);
string str_body = Encoding.UTF8.GetString(sockArgs.BodyByt); e.Send(sockArgs, Encoding.UTF8.GetBytes("this is header"), Encoding.UTF8.GetBytes("this is body"));
}
catch(Exception ex)
{
Print("RecvEventData "+ex.Message);
}
}客户端使用:打开vs2017 新建.net framework(4.0版本以上) 控制台应用,nuget搜索MiniSocketClient 下载代码: static void Main(string[] args)
{
// 实例化客户端对象
Network client = new Network();
// 设置ip地址
client.Ip = "127.0.0.1";
// 设置端口号
client.Port = 9123;
// 设置接收超时
client.ReceiveTimeout = 1000 * 30;
// 设置发送超时
client.SendTimeout = 1000 * 30;
// 设置接收缓冲区大小
client.ReceiveBufferSize = 1024;
// 接收完成事件
client.RecvCompleted += RecvComplete;
// 退出事件
client.ExitCompleted += ExitCompleted;
// 初始化
client.Init();
// 发送第一包数据
client.Send(Encoding.UTF8.GetBytes("hello china"), Encoding.UTF8.GetBytes("hello world")); while (true)
{
Thread.Sleep(10);
} }/// <summary>
/// 接收完成事件
/// </summary>
/// <param name="e"></param>
/// <param name="sockArgs"></param>
private static void RecvComplete(Network e, SocketParas sockArgs)
{
try
{ Console.WriteLine(Encoding.UTF8.GetString(sockArgs.HeadByt) + Encoding.UTF8.GetString(sockArgs.BodyByt));
e.Send(Encoding.UTF8.GetBytes("hello world"), Encoding.UTF8.GetBytes("hello MiniSocket"));
}
catch (Exception ex)
{
Print("RecvComplete " + ex.Message);
}
} /// <summary>
/// 发送完成事件
/// </summary>
/// <param name="e"></param>
/// <param name="sock"></param>
private static void SendComplete(Network e, SocketParas sock)
{ } /// <summary>
/// 退出事件
/// </summary>
/// <param name="state"></param>
/// <param name="msg"></param>
private static void ExitCompleted(int state, string msg)
{
switch (state)
{
case 0: // 正常
break;
case 1: // 连接异常
break;
case 2: // 发送异常
break;
case 3: // 接收异常
break;
case 4: // 手动强制退出
break;
}
}
oncon(socket client)onmessage(socket client ,byte[] data)onclose(socket client)
你这好像只有第二个..另外你的退出,也没有客户端信息啊..最起码 我也得从List<socket> clientlist里移除吧...而且你描述的
我也没看到"规则".没有规则你如何合并数据?比如一个数据有头有尾有长度有校验..你是如何"动态"合并的呢?
/// <summary>
/// 退出事件
/// </summary>
/// <param name="state"></param>
/// <param name="msg"></param>
private static void ExitCompleted(int state, string msg)
{
switch (state)
{
case 0: // 正常
break;
case 1: // 连接异常
break;
case 2: // 发送异常
break;
case 3: // 接收异常
break;
case 4: // 手动强制退出
break;
}
}
只有头尾不行啊. 我以前接触过一个wifi模块 5A开头 A5结束..但是里面的数据 也有5A A5 你还得去根据其他各种规则才能去校验一个完整的包..所以 问题就是在这里.如果头尾就能验证的话.那我也没必要问这么多了 你说是不?
这不是信任的问题..比如某个wifi模块发送一组tcp数据到服务端 11.22.33.44.55那么服务端可能收到2或者多次onmessage事件第一次收到11.22 第二次收到33 44 55.也可能11.22 33.44 55如果连续发送2次包. 那么你可能收到的是11.22 33.44 55.11.22 33 44.55 所以你得从这些数据中.提取出来你想要的,并且合法的数据..想到得到这些数据..就得需要头尾长度以及数据校验 才能知道..
只有头尾不行啊. 我以前接触过一个wifi模块 5A开头 A5结束..但是里面的数据 也有5A A5 你还得去根据其他各种规则才能去校验一个完整的包..所以 问题就是在这里.如果头尾就能验证的话.那我也没必要问这么多了 你说是不?
确实这样,包头包尾只能解决一大部分问题,一般还有检验位。
不过一个成熟的通讯协议中间出现与包头包尾相同的字符的时候会对其转义。
硬件上来这一组数据...可能分了3次上来的
实际上,这算是 自己定义的协议,MiniSocket中,发送的数据,在内部会自动 处理成 类http协议的,取md5码来进行校验,什么开头与什么结尾,实际上 可以定义 一个包头与包体,包头中保存的是 序号,大小,校验码 等,包体中就是数据实体,MiniSocket的Send函数对所发送的HeaderByt 与BodyByt实际上是指 应用层面的 发送,内部自动处理了 它们的校验