.jdeveloper_在JDeveloper 12.1.3中为WebSocket使用Java API
.jdeveloper
介绍
最新版本的JDeveloper 12c(12.1.3.0)和WebLogic Server 12.1.3一起提供了一些新的Java EE 7功能。 其中之一是对用于WebSocket的JSR 356 Java API的支持。 实际上,从12.1.2.0版本开始就支持WebSocket协议(RFC 6455),但是它基于WebSocket API的WebLogic特定实现。 现在,此专有的WebLogic Server WebSocket API已被弃用。 但是,仍支持向后兼容。
在本文中,我将展示一个在简单的ADF应用程序中为WebSocket使用JSR 356 Java API的示例。 该用例是关于在塔斯曼海发生的一些帆船赛。 有三艘船参加帆船赛,它们将穿越塔斯曼海,从澳大利亚航行至新西兰海岸。 该示例应用程序的目标是监视帆船赛并向用户通报其进行情况,并在地图上显示船只的位置。
我们将在应用程序中声明一个WebSocket服务器端点,当用户打开页面时,Java脚本函数将打开一个新的WebSocket连接。 该应用程序使用计划的服务,该服务每秒钟更新一次船的坐标,并向所有活动的WebSocket客户端发送一条包含新船位置的消息。 在客户端,Java脚本功能接收消息并根据GPS坐标将标记添加到Google地图。 因此,对帆船赛感兴趣的每个用户都将看到代表比赛当前状态的相同更新图片。
WebSocket服务器端点
让我们从声明一个WebSocket服务器端点开始。 当前实现中有一个小问题,将来的发行版中可能会解决。 WebSocket端点不能与ADF页面混合使用,应将它们部署在单独的WAR文件中。 最简单的方法是在应用程序中创建一个单独的WebSocket项目,并在此项目中声明所有必需的端点:
这对于为项目设置可读的Java EE Web上下文根也很重要:
下一步是创建一个Java类,它将成为WebSocket端点。 因此,这是一个普通的类,在开始时带有特殊的注释:
@ServerEndpoint(value = "/message")
public class MessageEndPoint {public MessageEndPoint() {super();}
}
注意,JDeveloper用红色标记注释。 我们将通过让JDeveloper为Web Socket配置项目来解决此问题。
完成此操作后,JDeveloper将把该项目转换为一个Web项目,添加Web.xml文件并添加必要的库:
此外,端点类变得可运行,我们可以运行它来检查其实际工作方式:
作为响应,JDeveloper生成以下URL,在该URL上WebSocket端点可用。 注意,URL包含项目上下文根( WebSocket )和批注的value属性( / message )。 如果一切正常,那么在单击URL时,将获得“已成功连接”信息窗口:
顺便说一句,消息中有一个错字。
现在让我们向WebSocket终结点类添加一些实现。 根据规范,将为每个WebSocket连接创建一个MessageEndPoin t类的新实例。 为了容纳所有活动的WebSocket会话,我们将使用静态队列:
public class MessageEndPoint {//A new instance of the MessageEndPoint class //is going to be created for each WebSocket connection//This queue contains all active WebSocket sessionsfinal static Queue<Session> queue = new ConcurrentLinkedQueue<>(); @OnOpenpublic void open(Session session) {queue.add(session); } @OnClosepublic void closedConnection(Session session) {queue.remove(session);}@OnErrorpublic void error(Session session, Throwable t) {queue.remove(session);t.printStackTrace();}
建立新连接,关闭新连接以及发生错误时 ,将分别调用带注释的方法open , closedConnection和error 。 完成此操作后,我们可以使用一些静态方法向所有客户端广播文本消息:
public static void broadCastTex(String message) {for (Session session : queue) {try {session.getBasicRemote().sendText(message);} catch (IOException e) {e.printStackTrace();}}}
在我们的用例中,我们必须用新的GPS坐标通知用户,因此我们应该能够通过WebSockets发送一些比短信更复杂的信息。
发送对象
基本上,示例应用程序的业务模型由两个简单的Java类Boat表示 :
public class Boat {private final String country;private final double startLongitude;private final double startLatitude;private double longitude;private double latitude;public String getCountry() {return country;}public double getLongitude() {return longitude;}public double getLatitude() {return latitude;}public Boat(String country, double longitude, double latitude) {this.country = country;this.startLongitude = longitude;this.startLatitude = latitude;}
...
和帆船赛 :
public class Regatta {private final Boat[] participants = new Boat[] {new Boat("us", 151.644, -33.86),new Boat("ca", 151.344, -34.36),new Boat("nz", 151.044, -34.86)};public Boat[] getParticipants() {return participants;}
...
对于我们的用例,我们将向WebSocket客户端发送Regatta类的实例。 赛 船会包含以Boat类实例表示的所有赛船会参与者,其中包含更新的GPS坐标( 经度和纬度 )。
这可以通过创建Encoder.Text <Regatta>接口的自定义实现来完成,或者换句话说,我们将创建一个编码器,该编码器可以将Regatta实例转换为文本并指定该编码器供WebSocket使用端点,同时发送Regatta实例。
public class RegattaTextEncoder implements Encoder.Text<Regatta> {@Overridepublic void init(EndpointConfig ec) { }@Overridepublic void destroy() { }private JsonObject encodeBoat(Boat boat) throws EncodeException {JsonObject jsonBoat = Json.createObjectBuilder().add("country", boat.getCountry()).add("longitude", boat.getLongitude()).add("latitude" , boat.getLatitude()).build();return jsonBoat;}@Overridepublic String encode(Regatta regatta) throws EncodeException {JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); for (Boat boat : regatta.getParticipants()) {arrayBuilder.add(encodeBoat(boat));}return arrayBuilder.build().toString(); }}
@ServerEndpoint(value = "/message",encoders = {RegattaTextEncoder.class })
完成之后,我们可以将对象发送给我们的客户:
public static void sendRegatta(Regatta regatta) {for (Session session : queue) {try {session.getBasicRemote().sendObject(regatta);} catch (EncodeException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}
RegattaTextEncoder使用Json表示法将Regatta对象表示为船的列表,因此将如下所示:
[{"country":"us","longitude":151.67,"latitude":-33.84},{"country":"ca", ...},{"country":"nz", ...}]
接收讯息
在客户端,我们使用Java脚本函数来打开新的WebSocket连接:
//Open a new WebSocket connection
//Invoked on page load
function connectSocket() { websocket = new WebSocket(getWSUri()); websocket.onmessage = onMessage;
}
当消息到达时,我们将遍历一系列船只,并为每条船只在地图上添加一个标记:
function onMessage(evt) {var boats = JSON.parse(evt.data);for (i=0; i<boats.length; i++) {markBoat(boats[i]); }
}function markBoat(boat) {var image = '../resources/images/'+boat.country+'.png';var latLng = new google.maps.LatLng(boat.latitude,boat.longitude); mark = new google.maps.Marker({position: latLng,map: map,title: boat.country,icon: image});
}
您可以在此处了解如何将Google地图集成到您的应用程序中。
运行帆船赛
为了模拟现场表演,我们使用ScheduledExecutorService 。 我们将每秒更新一次GPS坐标,并将更新广播给所有用户:
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
private ScheduledFuture<?> runHandle;//Schedule a new regatta on Start button click
public void startRegatta(ActionEvent actionEvent) {//Cancel the previous regattaif (runHandle != null) {runHandle.cancel(false); } runHandle = scheduler.scheduleAtFixedRate(new RegattaRun(), 1, 1, TimeUnit.SECONDS);
}public class RegattaRun implements Runnable {private final static double FINISH_LONGITUDE = 18;private final Regatta regatta = new Regatta();//Every second update GPS coordinates and broadcast//new positions of the boatspublic void run() { regatta.move();MessageEndPoint.sendRegatta(regatta); if (regatta.getLongitude() >= FINISH_LONGITUDE) {runHandle.cancel(true); }}
}
赌你的船
最后,我们的工作结果如下所示:
本文的示例应用程序需要JDeveloper 12.1.3。 玩得开心!
而已!
翻译自: https://www.javacodegeeks.com/2014/10/using-java-api-for-websockets-in-jdeveloper-12-1-3.html
.jdeveloper
.jdeveloper_在JDeveloper 12.1.3中为WebSocket使用Java API相关推荐
- jdeveloper_在JDeveloper 12.1.3中为WebSocket使用Java API
jdeveloper 介绍 最新版本的JDeveloper 12c(12.1.3.0)和WebLogic Server 12.1.3一起提供了一些新的Java EE 7功能. 其中之一是对用于WebS ...
- 【剑指offer】面试题12:矩阵中的路径(Java)
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该路径不能再 ...
- Linux中xtp文件上传不了,xtp_api_java: 中泰证券xtp java api for win\linux\mac https://xtp.zts.com.cn...
4)编译jni部分2个plugin动态库,在工程根目录下的mkdir cpp/build 如果是linux或mac: 进入到cpp/build目录执行cmake .. 则继续执行 make&& ...
- java邮件中添加excel_使用java api 创建excel内容并发送邮件
https://github.com/auguszero/javaToolRepsitory 利用java api 创建excel 内容并发送邮件 主要实现功能: 1.通过配置文件设置发送邮件发送方, ...
- 在JDeveloper 12.1.3中将Java API用于WebSockets
介绍 最新版本的JDeveloper 12c(12.1.3.0)和WebLogic Server 12.1.3一起提供了一些新的Java EE 7功能. 其中之一是对用于WebSocket的JSR 3 ...
- 《Python和Pygame游戏开发指南》——1.12 图书中的文本折行
本节书摘来自异步社区<Python和Pygame游戏开发指南>一书中的第1章,第1.12节,作者[美]Al Sweigart(斯维加特), 李强 译,更多章节内容可以访问云栖社区" ...
- 软件测试作业2:在敏捷宣言遵循的12条原则中挑选1条你感兴趣的原则进行风险评估
作业2 1.在敏捷宣言遵循的12条原则中挑选1条你感兴趣的原则进行风险评估. "原则"参见Lec 6, slide 8-11; "风险"参见Lec 3, sli ...
- VMware 12虚拟机win7中添加摄像头
vmware 12虚拟机win7中添加摄像头 第一步: 右键设置settings; 2.第二步: 选择USB 然后后面的√都勾上,如果是灰色的勾不上,先关掉虚拟机里的系统再勾上: 当然勾完记得点下面的 ...
- 中国医科大学2021年12月《中医护理学基础》作业考核试题
中国医科大学2021年12月<中医护理学基础>作业考核试题 试卷总分:100 得分:100 一.单选题 (共 20 道试题,共 20 分) 1.根据地理环境的不同,来确定治疗.护理的原则的 ...
最新文章
- VMware安装Centos7桌面版超详细图文过程
- 黑客把你家网线作“天线”,读取电磁信号就能偷走数据
- 腾讯机智在GTC 2019
- python 天气预报地图_在树莓派上用 python 做一个炫酷的天气预报
- iOS学习之UItableView
- SpringBoot使用Mybatis-PageHelper
- android ListView中CheckBox错位的解决
- 实用分享-Visual Studio图像查看插件(Image Watch)
- 快速了解Linux ps命令
- OpenCV使能CUDA加速
- 基坑监测日报模板_基坑水平监测日报表
- Unity for易接sdk接入文档
- 解决win7远程桌面连接时发生身份验证错误的方法
- 第十四周项目一 平衡二叉树
- Python练习 02
- JAVA Exception Handing
- 前端学习第八弹:制作一个精美书签
- JAVA企业邮箱发送
- 超声检查腕骨间关节有助于最大程度地发现RA腕骨间滑膜炎
- Gym 103117 Problem - Spicy Restaurant
热门文章
- jzoj3919-志愿者【换根法,线段树,树形dp】
- 和某ZYC巨佬的随机挑战1总结
- jzoj3511-cza的蛋糕【状态压缩dp,dfs】
- 2018/7/8-纪中某C组题【jzoj1619,jzoj1620,jzoj1621,jzoj1622】
- ssl初一组周六模拟赛【2018.5.19】
- 29、jdbc操作数据库(6)
- cookie、session、sessionid 与jsessionid
- Maven精选系列--过滤不同环境配置文件
- System.gc()调用 - 适用的场景
- 从0部署一个动态网站