前些天在弄一个远程指令控制传感设备的程序,大体思路是这样的:用webservice作为中间服务程序,各平台作为客户端。客户端点击开启按钮调用webservice,webservice向传感设备发送开启指令,webservice和设备之间为TCP连接,分别为socketcliet和socketserver。二者会保持10秒的连接时间,传感设备数据会保存在webservice数据库中,10秒之后把数据封装成list传给平台客户端。如下图所示:
相关技术:
webService:axis2框架,该框架相关部署不在赘述了
数据库:mysql数据库
采用线程池和NIO保证数据非阻塞
当平台发送一条指令时会开启一个线程,该线程作为socket客户端与传感设备的路由(socketserver端)进行通信。线程都通过线程池进行管理,当与设备通信超时后(这里为10秒)会关闭该线程 重新放回池中。
为防止socketclient端阻塞,socket采用NIO流进行传输,以防止阻塞的发生。
webservice向平台返回数据采用list方式,将查询结果封装成model对象 再将model放到list,采用这种方式更利于表结构数据传输而且提高传输效率。下面是平台调用webservice的代码:
public class test {
public static void main(String[] args) throws Exception{
List<HashMap<String, Object>> returns = new ArrayList<HashMap<String, Object>>();
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
EndpointReference targetEPR = new EndpointReference("http://192.168.1.100:8080/XML/services/HelloWorld");
options.setTo(targetEPR);
QName opAddEntry = new QName("http://jdbc.mysql.com", "getList2");
Object[] so = serviceClient.invokeBlocking(opAddEntry, new Object[] {"美女"},
new Class[] {Object[].class });
if (so.length > 0) {
if (so[0] instanceof Object[]) {
Object[] elements &#