当前位置: 代码网 > it编程>编程语言>Java > JavaWeb-WebSocket浏览器服务器双向通信方式

JavaWeb-WebSocket浏览器服务器双向通信方式

2025年02月13日 Java 我要评论
一、概述websocket是基于tcp的一种新的网络协议。它实现了浏览器与服务器全双工通信—浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。http传

一、概述

websocket是基于tcp的一种新的网络协议。它实现了浏览器与服务器 全双工通信 —浏览器和服务器只需要完成一次握手,两者之间就可以创建 持久性 的连接,并进行双向数据传输。

  • http传输

  • websocket传输

http协议和websocket协议的对比:

  • http是短连接,websocket是长连接
  • http通信是单向的,基于请求响应模式,websocket支持双向通信。
  • http和websocket底层都是tcp连接

websocket应用场景:

  • 视频弹幕
  • 网页聊天
  • 体育实况更新
  • 股票基金报价实时更新

二、入门

2.1 pom依赖

<dependency>
	<groupid>org.springframework.boot</groupid>
	<artifactid>spring-boot-starter-websocket</artifactid>
</dependency>

2.2 编写配置类

import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import org.springframework.web.socket.server.standard.serverendpointexporter;

/**
 * websocket配置类,用于注册websocket的bean
 */
@configuration
public class websocketconfiguration {

    @bean
    public serverendpointexporter serverendpointexporter() {
        return new serverendpointexporter();
    }

}

2.3 编写websocket服务

import org.springframework.stereotype.component;

import javax.websocket.onclose;
import javax.websocket.onmessage;
import javax.websocket.onopen;
import javax.websocket.session;
import javax.websocket.server.pathparam;
import javax.websocket.server.serverendpoint;
import java.util.collection;
import java.util.hashmap;
import java.util.map;

/**
 * websocket服务
 */
@component
@serverendpoint("/ws/{sid}")
public class websocketserver {

    //存放会话对象
    private static map<string, session> sessionmap = new hashmap();

    /**
     * 连接建立成功调用的方法
     */
    @onopen
    public void onopen(session session, @pathparam("sid") string sid) {
        system.out.println("客户端:" + sid + "建立连接");
        sessionmap.put(sid, session);
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @onmessage
    public void onmessage(string message, @pathparam("sid") string sid) {
        system.out.println("收到来自客户端:" + sid + "的信息:" + message);
    }

    /**
     * 连接关闭调用的方法
     *
     * @param sid
     */
    @onclose
    public void onclose(@pathparam("sid") string sid) {
        system.out.println("连接断开:" + sid);
        sessionmap.remove(sid);
    }

    /**
     * 群发
     *
     * @param message
     */
    public void sendtoallclient(string message) {
        collection<session> sessions = sessionmap.values();
        for (session session : sessions) {
            try {
                //服务器向客户端发送消息
                session.getbasicremote().sendtext(message);
            } catch (exception e) {
                e.printstacktrace();
            }
        }
    }

}

2.4 浏览器页面

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>websocket demo</title>
</head>
<body>
    <input id="text" type="text" />
    <button onclick="send()">发送消息</button>
    <button onclick="closewebsocket()">关闭连接</button>
    <div id="message">
    </div>
</body>
<script type="text/javascript">
    var websocket = null;
    var clientid = math.random().tostring(36).substr(2);

    //判断当前浏览器是否支持websocket
    if('websocket' in window){
        //连接websocket节点
        websocket = new websocket("ws://localhost:8080/ws/"+clientid);
    }
    else{
        alert('not support websocket')
    }

    //连接发生错误的回调方法
    websocket.onerror = function(){
        setmessageinnerhtml("error");
    };

    //连接成功建立的回调方法
    websocket.onopen = function(){
        setmessageinnerhtml("连接成功");
    }

    //接收到消息的回调方法
    websocket.onmessage = function(event){
        setmessageinnerhtml(event.data);
    }

    //连接关闭的回调方法
    websocket.onclose = function(){
        setmessageinnerhtml("close");
    }

    //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
    window.onbeforeunload = function(){
        websocket.close();
    }

    //将消息显示在网页上
    function setmessageinnerhtml(innerhtml){
        document.getelementbyid('message').innerhtml += innerhtml + '<br/>';
    }

    //发送消息
    function send(){
        var message = document.getelementbyid('text').value;
        websocket.send(message);
    }
	
	//关闭连接
    function closewebsocket() {
        websocket.close();
    }
</script>
</html>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com