IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> WebSocket的简单入门使用 -> 正文阅读

[网络协议]WebSocket的简单入门使用

WebSocket介绍

1)什么是WebSocket?

WebSocket 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助 HTTP请求完成。

WebSocket是真正实现了全双工通信的服务器向客户端推的互联网技术。 它是一种在单个TCP连 接上进行全双工通讯协议。

Websocket通信协议与2011年倍IETF定为标准RFC 6455,Websocket API被W3C定为标准。

2)全双工和单工的区别?

全双工(Full Duplex)是通讯传输的一个术语。通信允许数据在两个方向上同时传输,它在能力上相当 于两个单工通信方式的结合。

全双工指可以同时(瞬时)进行信号的双向传输(A→B且B→A)。指 A→B的同时B→A,是瞬时同步的。

单工、半双工(Half Duplex),所谓半双工就是指一个时间段内只有一个动作发生。

举个简单例子, 一条窄窄的马路,同时只能有一辆车通过,当目前有两辆车对开,这种情况下就只能一辆先过,等到头儿后另一辆再开,这个例子就形象的说明了半双工的原理。

早期的对讲机、以及早期集线器等设备都是 基于半双工的产品。随着技术的不断进步,半双工会逐渐退出历史舞台。

3)http与websocket的区别

http协议是短连接,因为请求之后,都会关闭连接,下次重新请求数据,需要再次打开链接。
在这里插入图片描述

WebSocket协议是一种长链接,只需要通过一次请求来初始化链接,然后所有的请求和响应都是通过这个TCP链接 进行通讯。
在这里插入图片描述

Java整合WebSocket

1)准备工作

引入依赖

<dependency> 
	<groupId>javax</groupId>
	 <artifactId>javaee-api</artifactId> 
	 <version>7.0</version>
  	<scope>provided</scope>
</dependency>

配置Tomcat插件

<!-- 配置Tomcat插件 --> 
<plugin> 
	<groupId>org.apache.tomcat.maven</groupId> 
	<artifactId>tomcat7-maven-plugin</artifactId> 
	<version>2.2</version>
	 <configuration>
	 	 <port>8082</port> 
 		<path>/</path>
	</configuration> 
</plugin>

2)websocket的相关注解说明

@ServerEndpoint("/websocket/{uid}") 

申明这是一个websocket服务需要指定访问该服务的地址,在地址中可以指定参数,需要通过{}进行占位 。

@OnOpen

用法:

public void onOpen(Session session, 
@PathParam("uid") String uid) throws IOException{}

该方法将在建立连接后执行,会传入session对象,就是客户端与服务端建立的长连接通道 通过@PathParam获取url申明中的参数。

@OnClose

用法:public void onClose() {} 该方法是在连接关闭后执行。

@OnMessage 

用法:

public void onMessage(String message, Session session)
throws IOException {}

该方法用于接收客户端发来的消息
message:发来的消息数据
session:会话对象(也是通道)
发送消息到客户端 用法:

   session.getBasicRemote().sendText("你好"); 

通过session进行发送。

3)测试代码

@ServerEndpoint("/websocket/{uid}")
public class MyWebSocket {
    @OnOpen
    public void onOpen(Session session, @PathParam("uid") String uid) throws IOException { 
         // 连接成功
         session.getBasicRemote().sendText(uid + ",你好,欢迎连接WebSocket!");
    }

    @OnClose
    public void onClose() {
        System.out.println(this + "关闭连接");
    }

    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        System.out.println("接收到消息:" + message);
        session.getBasicRemote().sendText("消息已收到.");
    }

    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println("发生错误");
        error.printStackTrace();
    }
}

百度一个websocket测试工具进行测试
在这里插入图片描述

SpringBoot整合WebSocket

1)引入依赖

<parent> 
	<groupId>org.springframework.boot</groupId> 
	<artifactId>spring-boot-starter-parent</artifactId> 
	<version>2.3.7.RELEASE</version>
</parent>

<dependency> 
	<groupId>org.springframework.boot</groupId> 
	<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

2)编写WebSocketHandler

在Spring中,处理消息的具体业务逻辑需要实现WebSocketHandler接口。

@Component
public class MessageHandler extends TextWebSocketHandler {

    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message)
            throws IOException {
        System.out.println("获取到消息 >> " + message.getPayload());
        session.sendMessage(new TextMessage("消息已收到"));
        if (message.getPayload().equals("10")) {
            for (int i = 0; i < 10; i++) {
                session.sendMessage(new TextMessage("消息 -> " + i));
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws
            Exception {
        session.sendMessage(new TextMessage("欢迎连接到ws服务"));
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status)
            throws Exception {
        System.out.println("断开连接!");
    }
}

3)配置拦截器

@Component
public class MessageHandlerInterceptor implements HandshakeInterceptor {
    /**
     * 握手之前,若返回false,则不建立链接 * * @param request * @param response * @param wsHandler * @param attributes * @return * @throws Exception
     */
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse
            response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { //将用户id放入socket处理器的会话(WebSocketSession)中 attributes.put("uid", 1001); System.out.println("开始握手。。。。。。。"); return true;
    }

    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse
            response, WebSocketHandler wsHandler, Exception exception) {
        System.out.println("握手成功啦。。。。。。");
    }
}

4)编写配置类

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Autowired
    private MessageHandler messageHandler;
    @Autowired
    private MessageHandlerInterceptor messageHandlerInterceptor;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(this.messageHandler, "/ws/{uid}")
                .setAllowedOrigins("*")
                .addInterceptors(this.messageHandlerInterceptor);
    }
}
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-22 12:42:59  更:2021-11-22 12:44:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:27:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码