前些天在弄一个远程指令控制传感设备的程序,大体思路是这样的:用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 = (Object[]) so[0]; for (Object o : elements) { HashMap<String, Object> maps = new HashMap<String, Object>(); OMElementImpl ome = (OMElementImpl) o; maps.put(ome.getLocalName(), ome.getText()); while (ome.getNextOMSibling() != null) { ome = (OMElementImpl) ome.getNextOMSibling(); maps.put(ome.getLocalName(), ome.getText()); } returns.add(maps); } } else { Object ob = so[0]; if (ob instanceof OMElementImpl == false) { HashMap<String, Object> maps = new HashMap<String, Object>(); maps.put("simple", ob); returns.add(maps); } else { OMElementImpl ome = (OMElementImpl) so[0]; HashMap<String, Object> maps = new HashMap<String, Object>(); maps.put(ome.getLocalName(), ome.getText()); returns.add(maps); } } println(returns); } else { println(returns);; } } public static void println(List<HashMap<String, Object>> list) { for (HashMap<String, Object> maps : list) { System.out.println("------------------"); Set<String> set = maps.keySet(); Iterator<String> it = set.iterator(); while (it.hasNext()) { String key = it.next(); Object value = maps.get(key); System.out.print(key + ":" + value + "\t"); } System.out.println(); } } }
客户端所用jar包见下方。
webservice服务端方法如下:
public List<Model> getList2(String mac) throws Exception{ List<Model> list = new ArrayList<Model>(); if(connect(1,mac)){ String sql="相应的sql"; Connection con = getConn(); Statement sta = con.createStatement(); ResultSet rs = sta.executeQuery(sql); while(rs.next()){ Model m = new Model(); m.setTfShuL(rs.getInt("tfShuL")); m.setTfMingC(rs.getString("tfMingC")); m.setTfGuiG(rs.getString("tfGuiG")); m.setTfPinM(rs.getString("tfPinM")); m.setTfDaL(rs.getString("tfDaL")); m.setTfZhuDW(rs.getString("tfZhuDW")); list.add(m); } } return list; }
开启线程的connect方法如下:
public boolean connect(int machid,String mac) throws Exception{ try{ oz oz = new oz(); oz.initClient("192.168.1.110", 8899,machid,mac); Thread td = new Thread(oz); pool.submit(td); //线程池 Thread.sleep(8000); }catch(Exception e){ System.out.println(e.getLocalizedMessage()); return false; } return true; }
oz是一个自己实现的线程对象,里面也实现了一个NIO的socket客户端,可与传感设备组成的网络进行通信。文件放在附件中。
以上就是一个简单地通过webservice实现平台和硬件设备的通信实例,使用webservice可以适应多种平台 便于更新扩展同时便于数据的集中处理,其他好处想必大家日后会慢慢发现。。NIO可防止阻塞提高传输效率。
还有很多问题有待解决,比如数据的排队问题、线程和socket的优化等等。欢迎大家多多指正
相关推荐
WebService技术的核心是使用网络上的标准协议和格式,进行远程过程调用(RPC)和通信。.NET平台提供了强大的工具和库来开发和实现WebService,本文将着重分析.NET下三种分布式开发技术:WebService、Remoting和MSMQ...
通过WebService与Android实现通信是跨平台开发中常见的一种方式,特别是在使用C#作为后端语言进行服务端开发,而Android应用作为前端时。本文将基于提供的文件信息,深入解析这一技术实现的关键步骤与原理。 ### ...
在WebService中使用List,可以方便地传输一组相关数据。例如,服务端可以返回一个包含多个用户信息的List,每个用户信息都是一个包含姓名、年龄等字段的对象。 创建返回String的WebService: 1. 首先定义一个Java...
【标题】:在Java EE环境中,使用Apache CXF与Spring框架整合实现Web服务,返回List、Bean、String、JSON及XML的完整项目实例 【描述】:本项目旨在展示如何在Java企业级应用(Java EE)中,通过Apache CXF框架创建...
本示例主要围绕Android如何利用Web Service(通常为SOAP或RESTful服务)来实现这一功能。标题提到的“Android配合WebService例子”意味着我们将探讨如何在Android应用中集成并使用Web Service。 首先,我们要了解...
3. 数据格式转换:Flex可以处理XML、JSON等多种数据格式,WebService返回的数据通常为XML,Flex中的XMLList和XML类提供了方便的解析和操作接口。 四、实例分析 在“flexandwebServicetest”项目中,我们可以看到一...
在Android开发中,Web服务通常用于实现客户端应用与远程服务器之间的通信,以便获取或发送数据。本篇文章将深入探讨如何在Android应用中使用Web服务,特别是通过WebService获取相关信息。 一、Web服务的原理与类型 ...
##### 使用POJO实现0配置的WebService 以Axis2为例,创建一个不需要任何配置的WebService,首先需要下载并安装Axis2。下载地址为:[http://ws.apache.org/axis2/](http://ws.apache.org/axis2/),推荐使用最新版本...
在Android开发中,有时我们需要与远程服务器进行交互,获取或发送数据。Web Service是一种常见的通信方式,而Axis2是Apache组织提供的一款强大的Web Service框架,它支持SOAP和RESTful服务。本文将详细介绍如何在...
- **WebService**:一种更为复杂的远程调用技术,基于 SOAP 协议,可以实现跨平台、跨语言的服务调用。 #### 三、WebServer 的搭建 为了实现 Android 客户端与远程数据库之间的数据交换,我们需要先搭建一个 Web...
首先,理解WebService的核心概念:它是一种基于SOAP(Simple Object Access Protocol)协议的远程调用标准,允许不同操作系统、编程语言和应用之间的数据交换。在OPhone或Android系统中,由于原生SDK并未提供调用...
RPC(远程过程调用)是Web服务的一种实现方式,它使调用者感觉就像在本地调用函数一样调用远程服务。在Axis2中,RPC风格的服务使得Java方法可以直接暴露为Web服务操作。在这个示例中,我们看到RPC方式被用来处理数据...
1. **即时发布JWS (Java Web Service)**:JWS是Java实现的Web服务模型,通过简单的注解如`@WebService`,开发者可以直接将Java类暴露为Web服务。发布JWS通常包括编写业务逻辑,添加注解,然后使用Java SE的`wsimport...
这种方式不仅能够帮助开发者实现跨平台的远程服务调用,还能够在资源受限的移动设备上提供高效的数据交换能力。在实际应用开发过程中,可以根据具体需求调整上述代码示例,以更好地满足项目需求。
在Android平台上,调用Web服务通常涉及到与服务器端进行数据交换,而由于Android SDK并未内置对...通过理解并熟练掌握KSOAP2的基本用法,开发者能够轻松地集成和通信远程Web服务,从而实现跨平台的数据交换和功能扩展。
此外,Axis还支持传递包含内部类的自定义对象以及通过RMI方式实现远程调用。 ### 抛出异常和传递文件 在开发WebService时,服务可能会遇到错误或异常。Axis提供了一种机制,允许开发者在服务中抛出异常,并通过...
使用 WebService,我们可以将服务器端的方法暴露给客户端,使得客户端可以远程调用服务器端的方法,从而实现数据交互。 在 Android 中,我们可以使用 KSOAP 库来调用 WebService。KSOAP 库是一个基于 SOAP 协议的...
- 手动创建WebService代理:这是一种底层方法,需要手动编写代码来实现与WebService的通信,包括生成SOAP请求和解析SOAP响应。 - 利用工具自动生成代理:Visual Studio等IDE提供了工具,可以自动从WSDL文件生成代理...