教你怎么使用Java实现WebSocket

这篇具有很好参考价值的文章主要介绍了教你怎么使用Java实现WebSocket。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、WebSocket简介
WebSocket协议通过在客户端和服务端之间提供全双工通信来进行Web和服务器的交互功能。

在WebSocket应用程序中,服务器发布WebSocket端点,客户端使用url连接到服务器。建立连接后,服务器和客户端就可以互相发送消息。客户端通常连接到一台服务器,服务器接受多个客户端的连接。

1.1 WebSocket协议
WebSocket协议有两个部分:握手和传输。客户端通过向服务端URL发送握手请求来建立连接。握手与现有的基于HTTP的基础结构相兼容。Web服务器将其解释为升级版的HTTP连接请求。

一个客户端建立连接的握手请求:

GET /path/to/websocket/endpoint HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin: http://localhost
Sec-WebSocket-Version: 13

一个服务端响应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=

从上面的请求和响应中可以看出来,一个WebSocket连接的建立,需要客户端和服务端维护一个Key来作为该连接的连接凭证。
客户端向服务端发送WebSocketKey,服务器根据WebSocketKey生成WebSocketAccept返回给客户端,客户端对WebSocketKey的值再进行相同的操作,如果与服务器返回的Accept的值相匹配,就表示握手成功。握手之后客户端与服务端就互相发送消息。
java websocket服务器,java,websocket,网络
1.2 WebSocket支持的消息类型
WebSocket支持文本消息(UTF-8编码)和二进制消息。WebSocket的控制消息由Close、Ping、Pong组成。ping和pong也有可能包含应用程序信息。
webSocket端点具有如下的URI形式表示:

ws://host:port/path?query
wss://host:port/path?query

ws代表未加密的连接,默认端口是80
wss代表加密的连接,默认端口是443
path:表示服务器内端点的位置
query:路径参数信息

二、创建一个WebSocket程序
创建和部署WebSocket端点的过程如下:
1、创建一个端点类
2、实现端点的生命周期方法
3、将业务逻辑添加到端点
4、将端点部署到Web应用程序中

**注意:**与Servlet相反,WebSocket端点类会被实例化多次,容器针对与其部署的URI的每个连接都创建一个实例。每个实例都与一个连接相关联。因为在任何时间都只有一个线程执行端点实例的代码,所以有助于保持每个连接的用户状态简化开发。

2.1 生命周期方法
EndPoint类中定义了三个生命周期方法:onOpen、onClose、onError
使用注解方式创建服务类

@ServerEndpoint("/echo")
public class EchoEndpoint {
   @OnMessage
   public void onMessage(Session session, String msg) {
      try {
         session.getBasicRemote().sendText(msg);
      } catch (IOException e) { ... }
   }
}

2.2 业务逻辑方法

@ServerEndpoint("/receive")
public class ReceiveEndpoint {
   @OnMessage
   public void textMessage(Session session, String msg) {
      System.out.println("Text message: " + msg);
   }
   @OnMessage
   public void binaryMessage(Session session, ByteBuffer msg) {
      System.out.println("Binary message: " + msg.toString());
   }
   @OnMessage
   public void pongMessage(Session session, PongMessage msg) {
      System.out.println("Pong message: " + 
                          msg.getApplicationData().toString());
   }
}

注意:一个服务类最多可以有三个OnMessage注解,每个消息类型分别使用一种方法:Text、Binary、Pong

2.3 维护客户状态
有时在程序中我们可能需要在连接中维护一些用户参数,WebSocket也提供了这样的服务
Session.getUserProperties获取用户参数信息
如果要存储所有连接的客户端共有的信息,可以使用静态变量,但是需要用户保证对数据的线程安全访问。

@ServerEndpoint("/delayedecho")
public class DelayedEchoEndpoint {
   @OnOpen
   public void open(Session session) {
      session.getUserProperties().put("previousMsg", " ");
   }
   @OnMessage
   public void message(Session session, String msg) {
      String prev = (String) session.getUserProperties()
                                    .get("previousMsg");
      session.getUserProperties().put("previousMsg", msg);
      try {
         session.getBasicRemote().sendText(prev);
      } catch (IOException e) { ... }
   }
}

2.4 数据格式的编码与解码
由于客户端和服务端交互可能涉及数据格式的转换,所以提供了Decoder和Encoder的方式解决。
同时由于WebSocket的@Message注解只能有一个用来传输Text信息或Binary信息,所以要进行最常用的Json->entity转换解析就需要该方法
Encoder

Encoder.Text 用于文本消息Encoder.Binary 用于二进制消息

使用方法:

1、创建编解码类

public class MessageATextEncoder implements Encoder.Text<MessageA> {
   @Override
   public void init(EndpointConfig ec) { }
   @Override
   public void destroy() { }
   @Override
   public String encode(MessageA msgA) throws EncodeException {
      // Access msgA's properties and convert to JSON text...
      return msgAJsonString;
   }
}

2、在端点类注解中添加该Encoder

@ServerEndpoint(
   value = "/myendpoint",
   encoders = { MessageATextEncoder.class, MessageBTextEncoder.class }
)
public class EncEndpoint { ... }

3、这时候就可以发送MessageA和MessageB两种类型的Text数据

MessageA msgA = new MessageA(...);
MessageB msgB = new MessageB(...);
session.getBasicRemote.sendObject(msgA);
session.getBasicRemote.sendObject(msgB);

注意:webSocket会自动寻找使用哪种编码器,所以发送数据统一使用sendObject即可

Decoder

实现Decoder以将WebSocket消息转换为Java对象

Decoder.Text 用于文本消息
Decoder.Binary 用于二进制消息
使用方法

与Encoder类似

注意:与Encoder不同,Decoder最多可以指定一个Binary和一个Text类型的Decoder,如果有两种以上的Java类型作为文本消息进行发送和接收需要进行定义处理。可以使多个消息继承一个公共的消息父类

1、编写Decoder类,对收到消息类型的不同进行不同的解码

public class MessageTextDecoder implements Decoder.Text<Message> {
   @Override
   public void init(EndpointConfig ec) { }
   @Override
   public void destroy() { }
   @Override
   public Message decode(String string) throws DecodeException {
      // Read message...
      if ( /* message is an A message */ )
         return new MessageA(...);
      else if ( /* message is a B message */ )
         return new MessageB(...);
   }
   @Override
   public boolean willDecode(String string) {
      // Determine if the message can be converted into either a
      // MessageA object or a MessageB object...
      return canDecode;
   }
}

2、在端点类中添加decoders={MessageDecoder.class}

@ServerEndpoint(
   value = "/myendpoint",
   encoders = { MessageATextEncoder.class, MessageBTextEncoder.class },
   decoders = { MessageTextDecoder.class }
)
public class EncDecEndpoint { ... }

3、在@OnMessage方法中使用文章来源地址https://www.toymoban.com/news/detail-796941.html

@OnMessage
public void message(Session session, Message msg) {
   if (msg instanceof MessageA) {
      // We received a MessageA object...
   } else if (msg instanceof MessageB) {
      // We received a MessageB object...
   }
}

到了这里,关于教你怎么使用Java实现WebSocket的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 构建websocket客户端,构建wss客户端,使用wss连接,并发送数据到服务器端,接收服务器端消息

    Java 构建websocket客户端,构建wss客户端,使用wss连接,并发送数据到服务器端,接收服务器端消息 回调函数处理

    2024年02月13日
    浏览(56)
  • Java 实现使用 Websocket 发送消息

    需求背景:之前做了个楼栋房间数量出租了多少,需要在数据大屏上实时展示 解决方案:以切面拦截出租接口,当有房间出租时重新查询相关数据,封装好用websocket实时传送前端展示 提示:以下是本篇文章正文内容,下面案例可供参考 WebSocket 是一种在单个TCP连接上进行全双

    2024年03月27日
    浏览(42)
  • Java使用websocket实现消息实时通知

    博客仅做学习记录使用。 做项目中遇到这样一个实时通知需求,因为第一次接触这个,期间查了很多资料,看了很多博客,最后实现功能,查询的博客太多,就不一一放出来了,感谢各位大佬。 websocket方式主要代码来源于这个大佬的博客: https://blog.csdn.net/moshowgame/article/d

    2024年02月08日
    浏览(60)
  • java使用WebSocket实现一对一实时对话

    最近的项目中有实时对话的需求。这里也是查阅了很多的资料。使用webSocket实现一对一对话是最多的。 链接: https://pan.baidu.com/s/1Vn1e1qw7nRnU1_4R-4fcGg 提取码: qwer  逻辑讲解: 现在我们要给张三丰发一个你好,我们要解决下面两个问题 ·  这个你好怎么展示在我的窗口 ·   这个

    2023年04月09日
    浏览(47)
  • JAVA使用WebSocket实现多客户端请求

    工作前提:两个服务之间实现聊天通讯,因为介于两个服务,两个客户端 方案1:多个服务端,多个客户端,使用redis把用户数据ip进行存储,交互拿到redis数据进行推送 方案2: 一个服务端,多个客户端,拿到客户端的id和需要推送的id进行拼接存储 此文章使用的是方案2 1. 引

    2024年02月11日
    浏览(46)
  • 如何使用Java Websocket实现实时数据监控功能?

    随着互联网应用的不断发展,实时数据监控功能成为了许多应用的必备功能之一。本文将介绍如何使用Java WebSocket实现实时数据监控功能,并提供具体的代码示例。 :Java WebSocket、实时数据监控、代码示例 一、什么是WebSocket? WebSocket是一种网络协议,可以在实现了We

    2024年02月03日
    浏览(42)
  • 一小时教你用SpringBoot+WebSocket+WebRTC实现视频通话

    1. 运行结果 SpringBoot+WebSocket+WebRTC实现视频通话 上述运行结果中是有声音(比较小而已)及动的画面的(画面不是静止的)。 网上关于webrtc的文档(文章)和视频也挺多的,但是用SpringBoot结合WebRTC的却屈指可数,前一段时间小编我学习了一下WebRTC的相关知识,于是用SpringBoot+WebRTC实现

    2024年02月10日
    浏览(50)
  • uniapp:实现手机端APP登录强制更新,从本地服务器下载新的apk更新,并使用WebSocket,实时强制在线用户更新

    实现登录即更新,或实时监听更新 本文介绍的是在 App打开启动 的时候调用更新,点击下方链接,查看使用 WebSocket 实现 实时 通知 在线用户 更新。 uniapp:全局消息是推送,实现app在线更新,WebSocket,apk上传: 背景 :内部手持机app开发功能,需要更新的到车间各个手持机上。

    2024年02月03日
    浏览(37)
  • 幻兽帕鲁4人以上联机怎么办?教你一键搭建幻兽帕鲁服务器

    幻兽帕鲁4人以上联机怎么办?教你一键搭建幻兽帕鲁服务器。《Palworld(幻兽帕鲁》大热,同时在线峰值达到 203 万。官方服务器问题时目前存在较多问题,即便官方维护和优化不断进行,但仍有大量玩家反馈频繁遇到联机失败、无法加入官方服务器等问题。较多玩家更倾向

    2024年02月20日
    浏览(43)
  • 从零开始,手把手教你实现基于 Websocket 的微服务

    Websocket 协议是为了解决 HTTP 协议缺陷而产生的一种通信协议,它能够在客户端和服务器之间建立持久性的连接,并且允许双向通信。 HTTP 协议的请求与响应模式,其实并不适合实时通信的场景。比如聊天室、在线游戏等应用,都需要实时地推送消息到客户端,而 HTTP 协议则需

    2024年02月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包