使用NewLife网络库构建可靠的自动售货机Socket服务端(一)
最近有个基于tcp socket 协议和设备交互需求,想到了新生命团队的各种组件,所以决定用NewLife网络库作为服务端来完成一系列的信息交互.
第一,首先说一下我们需要实现的功能需求吧
1,首先客户有一堆自动售货机的设备,设备连接socket服务端后 定时发送设备实时状态作为心跳信息,并且服务端需要下发信息予以确认。
2,需要知道设备的实时在线状态
3,设备需要实现微信,支付宝扫码支付需求,当客户买东西的时候选择扫码支付时,设备上报产品价格信息,支付方式,服务器下发微信或者支付宝的当面付二维码。
4,当客户扫码支付后,服务器需要下发支付结果。
5,设备上报出货成功或失败信息,服务器予以回复确认
6,设备上报现金收款的收款或者退款信息,服务器保存并且下发回复确认。
7,服务器后台需要能够主动的向设备推送广告信息,并且能够实现掉线设备的广告推送
第二,我们来分析这个可靠的服务器的大致结构是如何的(仅包含设备实时状态和支付交互)
1,想要服务稳定可靠,那么首先考虑的是程序的运行方式,当然是以一个windows服务为宿主的方式来运行最为可靠,那么我们可以使用TopShelf来构建这样一个服务宿主
2,实现设备的在线状态实时可知,我们需要定时的去判断这个设备是否在定时给服务器发送心跳信息,这个项目中我们以超时未发送心跳信息为标准来衡量他是否在线。
3,设备数据上报涉及到粘包的处理,设备上报的数据是怎么样一个协议,如何来解决粘包的问题,这里我们借助Newlife网络库的管道模式来处理粘包
4,微信支付宝的扫码支付如何及时知道客户付款状态,并且及时的下发给设备。
第三,我们需要用到的第三方类库有哪些
1,首先使用的网络库是Newlife 新生命团队的网络库
2,构建windows服务使用的是TopShelf
3,状态的信息保存使用Redis,这里我们使用CSRedisCore 这个类库
4,微信支付宝本次使用的是PaySharp这个库,二维码生成使用QrCoder库
第四,开始构建的基本的Socket服务吧
1,首先创建一个windows服务,引入Topshelf后
static void Main(string[] args)
{
var rc = HostFactory.Run(x => //
{
x.Service<DianSocketMain>(s => //
{
s.ConstructUsing(name =>new DianSocketMain()); //
s.WhenStarted(tc => tc.Start()); //
s.WhenStopped(tc => tc.Stop()); //
});
x.RunAsLocalSystem(); // x.SetDescription("售货机socket服务端"); //
x.SetDisplayName("Vending machine socket"); //
x.SetServiceName("Vendingmachinesocket"); //
x.OnException(s =>
{
LogerHelper.WriteErroLog("test",s.Message);
});
}); //
}
DianSocketMain类就是具体的Socket服务端,来看下是如何启动一个基本的socket服务端
public class DianSocketMain
{
/// <summary>
///网络库服务端 20181225
/// </summary>
private NetServer _newLifeServer;
/// <summary>
///
/// </summary>
public void Start()
{
try
{
try
{ //redis初始化
string redisHost = CoomHelper.GetAppSettings("RedisHost", "127.0.0.1:6379");
string redisPwd = CoomHelper.GetAppSettings("RedisPwd", "");
string prefix = "{device_server}:";
string redisConn = $"{redisHost},password={redisPwd},defaultDatabase=0,poolsize=50,ssl=false,writeBuffer=10240,prefix={prefix}"; var csredis = new CSRedis.CSRedisClient(redisConn); RedisHelper.Initialization(csredis);
}
catch (Exception e)
{
XTrace.WriteLine(e.Message);
} //启动客户端
StartNewLifeListenClient();
}
catch (Exception e)
{
XTrace.WriteException(e);
} }
/// <summary>
/// 停止win服务
/// </summary>
public void Stop()
{
try
{
if (_newLifeServer != null)
{
_newLifeServer.Dispose();
}
}
catch (Exception e)
{
XTrace.WriteException(e);
}
} /// <summary>
/// 监听客户端
/// </summary>
private void StartNewLifeListenClient()
{
try
{
XTrace.WriteLine("当前tcp端口号为:" + );
//创建监听地址和端口
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
var svr = new NetServer(ipAddress, , NetType.Tcp)
{
Log = XTrace.Log,
SessionTimeout =
};
svr.Add<ReciveFilter>();//粘包处理管道
svr.Received += new EventHandler<ReceivedEventArgs>(NewlifeRecive);//数据接收
//svr.Error += new EventHandler<ExceptionEventArgs>(NewlifeError);//错误处理
//svr.OnDisposed+=new EventHandler();
svr.Start();
_newLifeServer = svr;
//XTrace.WriteLine("会话超时时间为:"+svr.SessionTimeout);
}
catch (Exception ex)
{
XTrace.WriteLine(ex.Message);
} } /// <summary>
/// 数据接收
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void NewlifeRecive(object sender, ReceivedEventArgs e)
{
INetSession session = (INetSession)sender;
var pk = e.Message as Packet;
if (pk.Count == )
{
XTrace.WriteLine("数据包解析错误");
return; }
}
}
这里包含的一个有redis的初始化,粘包处理,数据接收的一个基本服务端,下面我们再讲如何解决粘包的问题。
使用NewLife网络库构建可靠的自动售货机Socket服务端(一)的更多相关文章
- 使用Newlife网络库管道模式解决数据粘包(二)
上一篇我们讲了 如何创建一个基本的Newlife网络服务端 这边我们来讲一下如何解决粘包的问题 在上一篇总我们注册了Newlife的管道处理器 ,我们来看看他是如何实现粘包处理的 svr.Add< ...
- 玩转华为物联网IoTDA服务系列三-自动售货机销售分析场景示例
场景简介 通过收集自动售货机系统的销售数据,EI数据分析售货销量状况. 该场景主要描述的是设备可以通过MQTT协议与物联网平台进行交互,应用侧可以到物联网平台订阅设备侧变化的通知,用户可以在控制台或通 ...
- YTU 2598: 编程题B-小平智斗自动售货机
2598: 编程题B-小平智斗自动售货机 时间限制: 1 Sec 内存限制: 128 MB 提交: 268 解决: 69 题目描述 LYH自动售货机在销售商品时,具有自动找钱功能.但是找零的最小单 ...
- 开发实践丨用小熊派STM32开发板模拟自动售货机
摘要:本文内容是讲述用小熊派开发板模拟自动售货机,基于论坛提供的工程代码,通过云端开发和设备终端开发,实现终端数据在的华为云平台显示. 本文内容是讲述用小熊派开发板模拟自动售货机,基于论坛提供的工程代 ...
- 09自动售货机综设实验(含按键消抖,led和状态机)
一设计功能 1.上次状态机的练习 2这次自动售货机综设 (一)对比两次的售货机 上次售货机的关键是画出状态转移图.明确输入分几种,输出是啥,有哪些状态.如下图所示 (二)系统或综合设计的经验: 既然这 ...
- C#骏鹏自动售货机接口
MachineJP类: 第1部分:串口初始化,串口数据读写 using System; using System.Collections.Generic; using System.IO.Ports; ...
- [Swift通天遁地]四、网络和线程-(14)创建一个Socket服务端
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Qt 访问网络的 HttpClient(封装QNetworkAccessManager,且有服务端)
Qt 使用 QNetworkAccessManager 访问网络,这里对其进行了简单的封装,访问网络的代码可以简化为: 1 2 3 HttpClient("http://localhost: ...
- FSM自动售货机 verilog 实现及 code 细节讲解
1.题目: 饮料1.5 元, 可投入硬币1 元 0.5 元,输出饮料 零钱 2. 画出状态机. 3.仿真结果:coin=1 --> 0.5 元 coin=2-->1元 4.关键代码分析: ...
随机推荐
- 【转载】视频CDN技术原理与流程说明
视频CDN专为移动互联网视频内容分发量身定做的一套自主研发的分布式平台,该平台以深圳为中心,分布在全国各地BGP机房的服务器为边缘节点,汇聚中国电信.中国联通.中国移动.中国教育网等运营商网络资源,构 ...
- 一个java版本的简单邮箱小爬虫
//趁着有空回头复习了一把正则表达式/* 以下代码以百度某个贴吧的 URL 作为源,实现了读取 EmailAddress 并写入文件保存起来的两个功能,如果要爬取其它信息,可以改写正则实现相应功能 要 ...
- pandas 实现通达信里的MFI
pandas 实现通达信里的MFI 算法里的关键点: combine()和rolling().sum()方法 combine -- 综合运算, rolling().sum() -- 滚动求和 利用pd ...
- BAT及各大互联网公司2014前端笔试面试题--JavaScript篇(昨天某个群友表示写的简单了点,然后我无情的把他的抄了一遍)
(某个群友)http://www.cnblogs.com/coco1s/ 很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习js更是大 ...
- getopts 用法
getopts是linux系统中的一个内置变量,一般用在循环中.每当执行循环是,getopts都会检查下一个命令选项,如果这些选项出现在option中,则表示是合法选项,否则不是合法选项.并将这些合法 ...
- RabbitMq简单应用
服务端: <?php //配置信息 $conn_args = array( 'host' => '127.0.0.1', 'port' => '5672', 'login' => ...
- HDU 1251 统计难题 字符匹配
题目描述:先说明此题只有一个测试实例,然后输入一系列的单词,以一个回车为结束符,然后输入一个字符串,要你查找以这个字符串为前缀的单词的个数,处理到文件结束. 解题报告:一开始看到这题,竟然直接用暴力去 ...
- 修改input placeholder样式
<style> /* 通用 */ ::-webkit-input-placeholder { color: rgb(235, 126, 107); } ::-moz-placeholder ...
- Linux awk工具简单学习记录
awk是一个文本分析工具,它把文件逐行读入,以特定符号将每行切分(默认空格为分隔符),切开的部分再进行各种分析处理. awk其名称得自于它的创始人Alfred Aho .Peter Weinberge ...
- 搭建RabbitMQ集群(通用)
RabbitMQ在Erlang node(节点)上 Erlang天生具有集群特性,非常好搭建集群,每一个节点(node)上具有一个叫erlang.Cookie的东西,也是一个标识符,可以互认. 1). ...