Java WebSocket 基础 建立端点
WebSocket协议的核心是使得两个对等节点间能够进行消息通信。
有两种Java WebSocket端点:注解式端点 和 编程式端点
<dependency><groupId>javax.websocket</groupId><artifactId>javax.websocket-api</artifactId><version>1.1</version><scope>provided</scope>
</dependency>
注解式:
@ServerEndpoint("/echo")
public class EchoServer {@OnMessagepublic String echo(String incomingMessage) {return "I got this (" + incomingMessage + ") so I an sending it back.";}
}
@ServerEndpoint
注册类为WebSocket端点@OnMessge
编程式:
继承Endpoint,实现onOpen方法
public class ProgrammaticEchoServer extends Endpoint {@Overridepublic void onOpen(Session session, EndpointConfig endpointConfig) {final Session mySession = session;mySession.addMessageHandler(new MessageHandler.Whole<String>() {@Overridepublic void onMessage(String incomingMessage) {try {mySession.getBasicRemote().sendText("I got this (" + incomingMessage + ") so I am sending it back.");} catch (IOException e) {System.out.println("something went wrong:" + e.getMessage());}}});}
}
Session
session对象给了开发人员关于打开WebSocket连接的视图,它拥有一些方法用于调整连接属性,它为端点提供了一个方式来获取对RemoteEndpoint对象的访问,RemoteEndpoint表示对话的另一端EndpointConfig
EndpointConfig接口表示WebSocket实现用来配置端点的一些信息- onOpen方法做的第一件事是为会话添加一个MessageHandler对象,MessageHandler接口定义了编程式端点接收入站消息时的所有方式。例如开发人员可以使用MessageHandler接口来选择是接收文本消息还是二进制消息,也可以选择接受整个消息或是当消息到达时接收较小的片段,
MessageHanler.Whole<String>
接口接受整体文本消息,要求实现onMessage
方法,在每次客户端的WebSocket文本消息抵达时被WebSocket调用 - 当要传递文本消息时,可以通过调用Session对象的
getBasicRemote
方法获得RemoteEndpoint的一个引用,通过它可以马上返回一个消息给客户端- 存在两种类型的RemoteEndpoint
- RemoteEndpoint.Basic 提供一系列方法同步发送消息
- RemoteEndpoint.Async 提供一系列方法异步发送消息
为了给编程式端点分派路径,需要提供ServerApplicationConfig接口的实现:
public class ProgrammaticEchoServerAppConfig implements ServerApplicationConfig {@Overridepublic Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> set) {Set<ServerEndpointConfig> configSet = new HashSet<>();ServerEndpointConfig serverEndpointConfig = ServerEndpointConfig.Builder.create(ProgrammaticEchoServer.class, "/pecho").build();configSet.add(serverEndpointConfig);return configSet;}@Overridepublic Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> set) {return set;}
}
- 在部署时被WebSocket调用
getAnnotatedEndpointClasses
传入参数是包含所有通过@ServerEndPoint注解的Java类的集合getEndpointConfigs
传入参数是应用中继承了Endpoing的所有类的集合
如果getAnnotatedEndpointClasses
方法返回空集合,则所有注解的端点不会生效。
1
JS客户端:
var wsUri = "ws://127.0.0.1:8080/websocket/echo";
echo_webscoket = new WebSocket(wsUri);echo_webscoket.onopen = function(evt) {writeToScreen("Connected!");echo_webscoket.send("...");;
}
echo_webscoket.onmessage = function(evt) {writeToScreen("Received message:" + evt.data);echo_webscoket.close();
}
echo_webscoket.onerror = function(evt) {writeToScreen("<span style='color: red'>ERROR:" + evt.data + "</span>");echo_webscoket.close();
}
.onopen()
.onMessage()
.onerror()
.send()
.close()
p20 ↩︎
Java WebSocket 基础 建立端点相关推荐
- WildFly上具有AngularJS的Java EE 7和Java WebSocket API(JSR 356)
这篇博客文章描述了用于WebSocket协议的Java API(JSR 356) (这是Java EE 7平台的四个最新JSR之一),并提供了部署在WildFly 8上并可以在OpenShift上在线 ...
- java websocket 生存期_Java WebSocket生命周期
本章将讲述WebSocket端点的生命周期.WebSocket端点的生命周期为开发人员提供了一个框架来管理端点所需要的资源,也提供了一个框架来拦截消息.我们将仔细探讨其生命周期的顺序和语义,以及Jav ...
- Java WebSocket生命周期
为什么80%的码农都做不了架构师?>>> 本章将讲述WebSocket端点的生命周期.WebSocket端点的生命周期为开发人员提供了一个框架来管理端点所需要的资源,也提供了一 ...
- Java WebSocket编程与网页简易聊天室
在webSocket还未引入前,许多开发人员通过各种非正规手段来完成更新网站的最新信息和到所有当前访问者的任务,其中一种手段就是通过浏览器向服务器轮询更新,但这种手段的网络延迟比较明显,其用户体验比较 ...
- java se 基础
写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java语言代码把思路体现出来. 学习新技 ...
- Java 语言基础(异常机制和File类,IO流,多线程,网络编程,反射机制)
原文:Java 语言基础(异常机制和File类,IO流,多线程,网络编程,反射机制) 异常机制和File类 异常机制 基本概念 异常就是"不正常"的含义,在 Java 语言中主要指 ...
- Java Websocket实例【服务端与客户端实现全双工通讯】
Java Websocket实例[服务端与客户端实现全双工通讯] 现很多网站为了实现即时通讯,所用的技术都是轮询(polling).轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP ...
- java websocket 上传大文件,使用java websocket API和Javascript上传文件
我正在学习websocket并且已经使用websocket / json完成了聊天程序.但我坚持上传ATM的文件.任何建议&回答会很感激. 服务器端: package websocket; i ...
- java面试基础_Java面试基础
1.面向对象和面向过程的区别? 面向过程:面向过程性能比面向对象高 面向对象:面向对象易维护.易复用.易扩展 2.Java 语言有哪些特点? 简单易学.面向对象(封装,继承,多态).平台无关性( Ja ...
最新文章
- linux运维实战练习及linux shell脚本、awk、sed工具命令学习总结
- kettle 的表输出 table output
- asp.net webapi 自定义身份验证
- 如何使Mac Docker支持SQL on Linux容器Volume特性
- 《计算机小常识》一不小心把windows资源管理器给结束任务了,电脑黑屏了怎么办?
- Android心电数据分析,基于Android系统的心电信号采集与分析系统设计
- 模拟银行转账(java+mysql+tomcat +JDBC+ druid连接池 + Servlet + Ajax)
- 我们写的程序就像我们的孩子
- 倍福控制电机耦合运动
- sparksql语法,读json
- 什么才算是“好的”测试用例?
- access身份证号掩码_Access输入掩码说明
- 治疗狗狗常见疾病药品备忘
- 河南省第十届ACM赛题
- 怎么复原老照片?原来有这3个方法
- 基于Qt的二维码生成器
- Matlab的BP汉字识别GU(写字板功能)
- 解决“只能通过Chrome网上应用商店安装该程序”的方法
- 所谓情商高,就是会说话
- php数组转换对象方法
热门文章
- 电路——判断电压源和电流源是发出还是吸收功率
- 入网许可证_入网许可证查询
- 哈尔滨工业大学深圳计算机学院院长,哈工大计算机学院院长徐晓飞来访我院
- 2C领域最后一个资本宠儿,快看成“超新Z世代”娱乐平台
- 复杂网络分析库NetworkX学习笔记(4):统计指标计算
- 微信小程序---365笔记第48天---上一题,下一题
- java重写的目的是什么_什么是重写?重写的作用?
- html怎么随机设置颜色,设置随机颜色值
- 云宏金融云及虚拟化解决方案精彩亮相第十一届中国城市商业银行信息化发展创新座谈会
- AT2565 Chocolate Bar 洛谷