我与之合作的开发团队的一部分面临着编写服务器以与我们的产品集成的挑战.我们有一些提供C SDK的低级传感器设备,我们希望通过网络共享它们以供收集数据的人使用.听起来很简单吧?有人会将传感器设备连接到建筑物的一部分中的机器并运行我们的服务器,从而与网络的其余部分共享设备.然后,客户端将通过我们的应用程序连接到该服务器,并从设备收集传感器读数.
我创建了一个简单的,与语言无关的网络协议,以及Java中的参考实现.问题是创建一个实现,它将与我们的设备一起使用,这些设备仅提供用C编写的SDK.我们正在考虑执行以下操作:
创建轮询线程,收集并存储每个连接设备的最新读数.
使用多线程服务器将每个传入连接分离到工作线程.
当工作线程收到传感器读取请求时,轮询线程收集的最新值将被发送回客户端.
这是很多线程,特别是在C中.因此,要审查,一般要求是:
在Windows XP/Vista,Linux和OS X计算机上运行
用C或C++编写,与我们拥有的C SDK进行交互
接受可变数量的同时连接(工作线程)
必须使用线程,而不是分叉(不想处理另一层IPC)
谁能建议一个库,最好是一些示例代码才能开始使用?
我已经使用Boost.Thread和Boost.Asio在Windows和Linux系统上构建了一个多线程服务器.这些教程使其易于入门.
写这样的服务器,最好的办法是不要写一个,并重新构建你的系统所以它是没有必要的,和/或重新使用已经存在的组件.因为:
有人会将传感器设备连接到建筑物的一部分中的机器并运行我们的服务器,从而与网络的其余部分共享设备.
这也有与网络的其他成员共享整个机器的潜力,如果你的代码中有一个漏洞(它有可能会如你在C++从头开始编写,并发明了一种新的协议).
所以,反过来做.在具有传感器硬件的计算机上安装一个简单的客户端,然后一直或定期运行它,并将结果推送(发布)到中央服务器.中央服务器甚至可以是标准的Web服务器.或者它可以是一个数据库.(请注意,这两个都已经写好了 - 不需要重新发明轮子;-)
然后,您的应用程序的工作方式与您现在的工作方式相同,但它会从数据库而不是传感器收集数据.与传感器在机器上运行的部分,但是,已经从多线程客户服务器恶梦收缩,到一个不错的小单线程命令行客户机仅使得传出连接,并且可以从cron运行(或等同物上的窗口).
即使您需要实时数据收集(并且从您的描述中听起来就像您没有这样),传感器收集器仍然可能更好是客户端而不是服务器.让它打开与中央收集器(或其中一组)的长期连接,并等待提供其数据的指令.
编辑:ceretullis和pukku的答案建议使用多播这是一个很好的变化 - 请参阅此答案和评论
Douglas Schmidt的ACE(自适应通信环境)是一个成熟的, 高度可移植的开源框架,用于构建高性能多线程服务器.它主要针对电信应用,但已被用于各种项目.它还带有一个名为TAO的对象请求代理(如果你进入CORBA)
One claim to fame of the framework is that it supports many threading models (thread pool, thread per request, asynchronous + threads etc.), so you can use its thread management in a way that's optimal for your application. This is actually the most interesting feature of the system - the server framework functionality comes out of the box. Most of the other libraries I've seen suggested here would still require you to implement much of this functionality yourself.
有相当多的电子文档,还有几本关于它的书籍.它不是最温暖和蓬松的系统,它真的是为速度而不是舒适而构建 - 但我们使用的是C++.您可能会发现,与ACE相比,尝试重建功能并调试所有同步的工作要少得多.
哦,顺便说一下,它在演讲中是免费的 - 就像在啤酒中一样.如果您想要商业路线,还有一个顾问生态系统,将为其提供支持和指导服务.可以在此处找到包含一些代码片段的教程.