采用list传输格式的webservice实现控制远程设备

前些天在弄一个远程指令控制传感设备的程序,大体思路是这样的:用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的代码:

 

Java代码   收藏代码
  1. public class test {  
  2.     public static void main(String[] args) throws Exception{  
  3.         List<HashMap<String, Object>> returns = new ArrayList<HashMap<String, Object>>();  
  4.         RPCServiceClient serviceClient = new RPCServiceClient();  
  5.         Options options = serviceClient.getOptions();  
  6.         EndpointReference targetEPR = new EndpointReference("http://192.168.1.100:8080/XML/services/HelloWorld");  
  7.         options.setTo(targetEPR);  
  8.         QName opAddEntry = new QName("http://jdbc.mysql.com""getList2");  
  9.         Object[] so = serviceClient.invokeBlocking(opAddEntry, new Object[] {"美女"},  
  10.                 new Class[] {Object[].class });  
  11.         if (so.length > 0) {  
  12.             if (so[0instanceof Object[]) {  
  13.                 Object[] elements = (Object[]) so[0];  
  14.                 for (Object o : elements) {  
  15.                     HashMap<String, Object> maps = new HashMap<String, Object>();  
  16.                     OMElementImpl ome = (OMElementImpl) o;  
  17.                     maps.put(ome.getLocalName(), ome.getText());  
  18.                     while (ome.getNextOMSibling() != null) {  
  19.                         ome = (OMElementImpl) ome.getNextOMSibling();  
  20.                         maps.put(ome.getLocalName(), ome.getText());  
  21.                     }  
  22.                     returns.add(maps);  
  23.                 }  
  24.             } else {  
  25.                 Object ob = so[0];  
  26.                 if (ob instanceof OMElementImpl == false) {  
  27.                     HashMap<String, Object> maps = new HashMap<String, Object>();  
  28.                     maps.put("simple", ob);  
  29.                     returns.add(maps);  
  30.   
  31.                 } else {  
  32.                     OMElementImpl ome = (OMElementImpl) so[0];  
  33.                     HashMap<String, Object> maps = new HashMap<String, Object>();  
  34.                     maps.put(ome.getLocalName(), ome.getText());  
  35.                     returns.add(maps);  
  36.                 }  
  37.   
  38.             }  
  39.             println(returns);  
  40.         } else {  
  41.             println(returns);;  
  42.         }  
  43.     }  
  44.       
  45.     public static void println(List<HashMap<String, Object>> list) {  
  46.         for (HashMap<String, Object> maps : list) {  
  47.             System.out.println("------------------");  
  48.             Set<String> set = maps.keySet();  
  49.             Iterator<String> it = set.iterator();  
  50.             while (it.hasNext()) {  
  51.                 String key = it.next();  
  52.                 Object value = maps.get(key);  
  53.                 System.out.print(key + ":" + value + "\t");  
  54.             }  
  55.             System.out.println();  
  56.         }  
  57.     }  
  58.   
  59. }  

 客户端所用jar包见下方。

webservice服务端方法如下:

Java代码   收藏代码
  1. public List<Model> getList2(String mac) throws Exception{  
  2.     List<Model> list = new ArrayList<Model>();  
  3.     if(connect(1,mac)){  
  4.         String sql="相应的sql";  
  5.         Connection con = getConn();  
  6.         Statement sta = con.createStatement();  
  7.         ResultSet rs = sta.executeQuery(sql);  
  8.         while(rs.next()){  
  9.             Model m = new Model();  
  10.             m.setTfShuL(rs.getInt("tfShuL"));  
  11.             m.setTfMingC(rs.getString("tfMingC"));  
  12.             m.setTfGuiG(rs.getString("tfGuiG"));  
  13.             m.setTfPinM(rs.getString("tfPinM"));  
  14.             m.setTfDaL(rs.getString("tfDaL"));  
  15.             m.setTfZhuDW(rs.getString("tfZhuDW"));  
  16.             list.add(m);  
  17.         }  
  18.     }  
  19.     return list;  
  20. }  

 

  开启线程的connect方法如下:

Java代码   收藏代码
  1. public boolean connect(int machid,String mac) throws Exception{  
  2.         try{  
  3.             oz oz = new oz();  
  4.             oz.initClient("192.168.1.110"8899,machid,mac);  
  5.             Thread td = new Thread(oz);  
  6.             pool.submit(td);             //线程池  
  7.             Thread.sleep(8000);                
  8.               
  9.         }catch(Exception e){  
  10.             System.out.println(e.getLocalizedMessage());  
  11.             return false;  
  12.         }  
  13.         return true;  
  14.           
  15.     }  

 

        oz是一个自己实现的线程对象,里面也实现了一个NIO的socket客户端,可与传感设备组成的网络进行通信。文件放在附件中。

         以上就是一个简单地通过webservice实现平台和硬件设备的通信实例,使用webservice可以适应多种平台 便于更新扩展同时便于数据的集中处理,其他好处想必大家日后会慢慢发现。。NIO可防止阻塞提高传输效率。

        还有很多问题有待解决,比如数据的排队问题、线程和socket的优化等等。欢迎大家多多指正

        本文由上海java培训机构推荐阅读,更多精彩请浏览上海it培训官网。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的纺织品企业财务管理系统,源码+数据库+毕业论文+视频演示 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对纺织品企业财务信息管理的提升,也为了对纺织品企业财务信息进行更好的维护,纺织品企业财务管理系统的出现就变得水到渠成不可缺少。通过对纺织品企业财务管理系统的开发,不仅仅可以学以致用,让学到的知识变成成果出现,也强化了知识记忆,扩大了知识储备,是提升自我的一种很好的方法。通过具体的开发,对整个软件开发的过程熟练掌握,不论是前期的设计,还是后续的编码测试,都有了很深刻的认知。 纺织品企业财务管理系统通过MySQL数据库与Spring Boot框架进行开发,纺织品企业财务管理系统能够实现对财务人员,员工,收费信息,支出信息,薪资信息,留言信息,报销信息等信息的管理。 通过纺织品企业财务管理系统对相关信息的处理,让信息处理变的更加的系统,更加的规范,这是一个必然的结果。已经处理好的信息,不管是用来查找,还是分析,在效率上都会成倍的提高,让计算机变得更加符合生产需要,变成人们不可缺少的一种信息处理工具,实现了绿色办公,节省社会资源,为环境保护也做了力所能及的贡献。 关键字:纺织品企业财务管理系统,薪资信息,报销信息;SpringBoot
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值