WebSocket详解

WebSocket可提供一个在

单一TCP连接全双工双向通信协议。全双工意味着客户端和服务器可以独立发送信息给

对方。双向意味着客户端可以向服务器发送信息,

反之亦然。

WebSocket是定义于IETF RFC 6455协议和W3C

JavaScript API。该协议在TCP层定义了一个开放的握手和基本的讯息。该API允许Web页使用WebSocket协议双向

与远程主机通信。

不同于HTTP,它不需要创建一个新的TCP连接就能发送一个消息,可以持久不断地用于客户端和服务器之间的每一个交换。一旦最初通过HTTP

握手),客户端

和服务器可以独立互相发送信息。

客户端和服务器之间的通信是对称的,但有两个

差异:

客户端发起连接到服务器,是监听一个WebSocket请求。

客户端使用URI连接到一个服务器。一个服务器可以监听同一个URI多个客户端。

客户端和服务器来回传输数据的单位称消息。消息可以是文本或二进制数据。

还携带用于协议级的信令数据。

Java API定义了WebSocket应用的标准API

,支持:

使用注释和接口创造一个WebSocket客户端和服务器端点

生产和消费WebSocket的文本,二进制,和控制消息

发起和拦截WebSocket的生命周期事件

WebSocket会话配置和管理,如超时,重试等

WebSocket应用如何在Java EE 安全模型上工作

注释服务器端点

可以将一个普通Java对象(POJO)使用@serverendpoint作为WebSocket服务器的端点

。这个端点也被称为注释的终点:

@ServerEndpoint("/chat")

public class ChatServer {

@OnMessage

public String receiveMessage(String message) {

//. . .

}

}

注释的类必须有一个公共的

无参数构造函数。

@onMessage注解的Java方法用于接收传入的WebSocket信息。

这个信息可以是文本,二进制。

接受字符串信息:

public void receiveMessage(String s) {

//. . .

}

接受Java原始类型信息:

public void receiveMessage(int i) {

//. . .

}

接受一个大文本,如果接收到最后一部分是布尔参数为真,否则为假。

public void receiveBigText(String message, boolean last) {

//. . .

}

使用一个Reader接收整个文本消息阻塞流:

@OnMessage

public void processReader(Reader reader) {

//. . .

}

使用字节[ ]或字节缓冲区接收整个二进制消息:

public void receiveMessage(ByteBuffer b) {

//. . .

}

使用字节[ ]和字节缓冲接受大的二进制,如果接收到的最后一部分是布尔参数为真:

public void receiveBigBinary(ByteBuffer buf, boolean last) {

//. . .

}

使用InputStream得到完整的二进制消息作为阻塞流:

public void processStream(InputStream stream) {

//. . .

}

使用pongmessage接受pong消息:

public void processPong(PongMessage pong) {

//. . .

}

使用了Java的字符串:

@ServerEndpoint("/chat/{room}")

public class MyEndpoint {

@OnMessage

public void receiveMessage(String message,

@PathParam("room")String room) {

//. . .

}

}

“pathparam用于标注方法参数,获取在服务器端点URI/chat/{room}的room参数值

public void receiveMessage(String message, Session session) {

//. . .

}

Session表明两个WebSocket端点对话

连接的另一端。在这种情况下,响应到客户端可能

返回:

public void receiveMessage(String message, Session session) {

session.getBasicRemote().sendText(...);

}

参数可以以任何顺序列出。该方法可以有一个void返回类型。这一消息是消耗在终点

没有返回响应。

MaxMessageSize属性可以被用来定义

消息字节最大大小:

@Message(maxMessageSize=6)

public void receiveMessage(String s) {

//. . .

}

在这个程序中,如果超过6个字节的信息被接收,就报告错误

和连接关闭。 使用@OnClose生命周期回调拦截,你还可以得到精确的错误代码和消息的。默认值为1指示

没有最大值。

MaxMessageSize属性不适用使用流

或reader获取的传入消息。

高级定制

@OnOpen

public void open(Session s) {

//. . .

}

@OnClose

public void close(CloseReason c) {

//. . .

}

@OnError

public void error(Throwable t) {

//. . .

}

OnOpen在这个端点一个新的连接建立时被调用。

参数提供了连接的另一端的更多细节。

OnClose在连接被终止时被调用,。参数c

提供更多细节,为什么一个WebSocket连接关闭。

在Java EE平台部署端点,符合CDI规范描述支持完全依赖注入,

。可在所有的WebSocket端点类实现字段,方法和构造器注入。

@ServerEndpoint("/chat")

public class ChatServer {

@Inject User user;

//. . .

}

端点类继承:

@ServerEndpoint("/chat")

public class ChatServer {

}

public class CustomChatServer extends ChatServer {

//. . .

}

在这段代码中,该chatserver类被确定为一个WebSocket端点;然而,

customchatserver不是。如果它需要被公认为一个WebSocket端点,然后

必须明确标有@serverendpoint注释。

websocket java详解_WebSocket详解相关推荐

  1. Java单元测试之JUnit4详解

    2019独角兽企业重金招聘Python工程师标准>>> Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @B ...

  2. java -jar 和 -cp详解

    java -jar 和 -cp详解 命令行执行程序 假如我们有一个程序,把它打包成Test.jar,如何运行才能成功输出Hello World package com.test; public cla ...

  3. java访问修饰符详解——学java,零基础不怕,不只要理论,更要实践+项目,a href=http://www.bjweixin.com太原维信科技提供 /a...

    java访问修饰符详解--学java,零基础不怕,不只要理论,更要实践+项目 <a href=http://www.bjweixin.com>太原维信科技提供 </a> pub ...

  4. Java编程配置思路详解

    Java编程配置思路详解 SpringBoot虽然提供了很多优秀的starter帮助我们快速开发,可实际生产环境的特殊性,我们依然需要对默认整合配置做自定义操作,提高程序的可控性,虽然你配的不一定比官 ...

  5. Java 8 Stream API详解--转

    原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java 8引入 ...

  6. 你真的弄明白了吗?Java并发之AQS详解

    你真的弄明白了吗?Java并发之AQS详解 带着问题阅读 1.什么是AQS,它有什么作用,核心思想是什么 2.AQS中的独占锁和共享锁原理是什么,AQS提供的锁机制是公平锁还是非公平锁 3.AQS在J ...

  7. java定时任务框架elasticjob详解

    这篇文章主要介绍了java定时任务框架elasticjob详解,Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.该项目基于成熟的开源产品Quartz和Zo ...

  8. Java RMI远程方法调用详解

    Java RMI远程方法调用详解     [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51992182 一.Java R ...

  9. Java之toString()方法详解

    Java之toString()方法详解 Java中 toString()方法在Object类中和Intent类中都有定义,作用类似,但显示形式有点区别 一.Object类中toString()方法 t ...

最新文章

  1. 中国移动OnetNet云平台 使用以太网传输数据流步骤
  2. Serializable在C#中的作用及其优点
  3. 单位银行结算账户如何变更
  4. python 指针_python的指针
  5. 算法题-大数相乘问题
  6. 没有Kubernets,学习Docker还有用吗?
  7. 测试部门工作周报模板
  8. java合并两个excel文件内容_java实现多个excel文件合并成一个excel文件
  9. C# 001 Windows7 WiFi共享大师 共享精灵 自制无广告精简版本
  10. sqlplus登录缓慢的解决
  11. Boxplot(盒图)
  12. 如何俘获一个 IT 男的心,让他成为男友然后变成老公
  13. carte执行job任务时出现中文乱码
  14. 车联网也需要“走对路”,用户需求“导航”小度车载OS持续领先
  15. u盘忘在计算机房,基于MFC的防U盘等移动存储器的遗忘提醒系统
  16. Pytorch 学习(2):神经网络及训练一个分类器(cifar10_tutorial的网络结构图)
  17. 真无线蓝牙耳机推荐:2021最受欢迎的TWS耳机品牌
  18. 从零编写基于MATLAB的GNSS_SDR程序(GNSS软件接收机)——学习记录(2)
  19. PC客户端软件的安装和卸载测试知识点
  20. unity 使用姿态传感器制作互动项目--太极平衡桩

热门文章

  1. twitter_如何阻止所有Twitter烦人的电子邮件
  2. mapbox中文地图_vue 地图可视化(2)mapbox篇
  3. exchange服务器保留邮件,Exchange服务器之Exchange备份单个用户邮件及清理邮箱数据...
  4. 怎么把游戏(魔兽世界)转移到另一个电脑上
  5. PLC数据通过无线远程传输到电脑上。也支持力控组态王远程读取,也支持云组态
  6. 相关sql语句的练习
  7. QT字间距和行间距设置
  8. 一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物。输入一行,一个正整数a (a < 32768)。
  9. 下划线与驼峰互转(数据库字段转驼峰式命名)
  10. ijidea搭建springMVC入门程序,配置TomCat