WebSocket下的聊天室

WebSocket 入门:简易聊天室 大家好,我是前端西瓜哥,今天我们用 WebSocket 来实现一个简单的聊天室。WebSocket 是一个应用层协议,有点类似 HTTP。但和 HTTP 不一样的是,它支持真正的全双工,即不仅客户端可以主动发消息给服务端,服务端也可以主动发消息给客户端。尤其是后者,让我们不用再基于 HTTP 长轮询或短轮询的低效方式来实现服务端通知。相比 HTTP,WebSocket 的服务端推送更轻量,并能减少服务端的压力。 阅读详情

       websocket是解决客户端与服务器端实时通信而产生的技术。

       websocket协议允许在客户端和服务端之间建立一条双向传递信息的通道,它是建立在TCP协议之上的,首先通过”握手“来确认和建立通道,之后客户端和服务端可以通过这个通道传递信息,而不需要再次发起请求,而且客户端和服务端都可以主动的发送消息。这种技术不依赖于HTTP连接(比如XMLHttpRequest,iframe),可以实现实时消息传递。

与Socket区别:

       Socket其实并不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口。Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。当两台主机通信时,必须通过Socket连接,Socket则利用TCP/IP协议建立TCP连接。TCP连接则更依靠于底层的IP协议,IP协议的连接则依赖于链路层等更低层次。

       WebSocket则是一个典型的应用层协议。

       Socket是传输控制层协议,WebSocket是应用层协议。

WebSocket 客户端 API :

//创建websocket对象

var ws = new WebSocket(“ws://echo.websocket.org”);

//建立连接

ws.onopen = function(){ws.send(“Test!”); };

//收到服务器消息,提取

ws.onmessage = function(evt){console.log(evt.data);ws.close();};

//关闭连接

ws.onclose = function(evt){console.log(“WebSocketClosed!”);};

//产生异常

ws.onerror = function(evt){console.log(“WebSocketError!”);};

  WebSocket 服务端 API :

我们将使用到websocket-api,这个JAR包则在Tomcat的lib下面。

//WebSocket 服务端运行在 ws://[Server 端 IP 或域名]:[Server 端口]/websockets 的访问端点,客户端浏览器已经可以对 WebSocket 客户端 API 发起 HTTP 长连接了。
@ServerEndpoint("/websocket")
 public class EchoEndpoint {

//一个新的连接建立时被调用
//Session 表明两个 WebSocket 端点对话连接的另一端,可以理解为类似 HTTPSession 的概念
 @OnOpen
 public void onOpen(Session session) throws IOException {
 //以下代码省略...
 }
 
//收到消息触发事件
//用于接收传入的 WebSocket 信息,这个信息可以是文本格式,也可以是二进制格式。
 @OnMessage
 public String onMessage(String message) {
 //以下代码省略...
 }

//MaxMessageSize 属性可以被用来定义消息字节最大限制,如果超过 6 个字节的信息被接收,就报告错误和连接关闭。
 @Message(maxMessageSize=6)
 public void receiveMessage(String s) {
 //以下代码省略...
 } 

//传输消息错误触发事件
 @OnError
 public void onError(Throwable t) {
 //以下代码省略...
 }
 
//OnClose 在连接被终止时调用。参数 closeReason 可封装更多细节,如为什么一个 WebSocket 连接关闭。
 @OnClose
 public void onClose(Session session, CloseReason reason) {
 //以下代码省略...
 } 
 
 }

聊天室:

服务器端:

package com.research.WebSocketChatRoom;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;

import com.google.gson.Gson;
//用于创建和配置服务端点
@ServerEndpoint("/websocket")
public class Socket {
    public static Map<String, Session> sessionMap = new HashMap<String, Session>();

    //与某个客户端的连接会话,需要通过它来给客户端发送数据
    private Session session;

    // 一个新的连接建立时被调用
    @OnOpen
    public void startSocket(Session session) {
        this.session = session;
        System.out.println("链接成功");
        if (sessionMap.size() == 0) {
            return;
        }
        Set userIds = sessionMap.keySet();
        StringBuffer sBuffer = new StringBuffer();
        for (Object str : userIds) {
            sBuffer.append(str.toString() + ":");
        }
        Gson gson = new Gson();
        try {
            Message message = new Message();
            message.setFrom("系统");
            message.setMsg(sBuffer.toString());
            session.getBasicRemote().sendText(gson.toJson(message), true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 收到消息触发事件
    @OnMessage
    public void getMessgae(Session session, String str, boolean last) {
        if (session.isOpen()) {
            try {
                System.out.println(str);
                Gson gson = new Gson();
                Message msg = gson.fromJson(str, Message.class);
                Message toMessage = msg;
                toMessage.setFrom(msg.getId());
                toMessage.setTo(msg.getTo());

                if (msg.getMsg().equals("newUser")) {
                    if (sessionMap.containsKey(msg.getId())) {
                        sessionMap.remove(msg.getId());
                    }
                    sessionMap.put(msg.getId(), session);
                } else {
                    Session toSession = sessionMap.get(msg.getTo());
                    if (toSession != null && toSession.isOpen()) {
                        toSession.getBasicRemote().sendText(gson.toJson(toMessage).toString(), last);
                    } else {
                        toMessage.setMsg("用户不存在");
                        toMessage.setFrom("系统");
                        session.getBasicRemote().sendText(gson.toJson(toMessage).toString(), last);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        } else {
            System.out.println("session is closed");
        }
    }

    // 关闭连接触发事件
    @OnClose
    public void onClose(Session session, CloseReason closeReason) {
        System.out.println(session.getId() + "关闭连接");
    }

    // 传输消息错误触发事件
    @OnError
    public void onError(Throwable error) {
        System.out.println(error);
    }
}

 

客户端:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>Test WebSocket</title>
    <script type="text/javascript" src="/resource/js/jquery-3.2.1.min.js"></script>
    <script type="text/javascript">
        $(function () {
            //服务器地址
            var url = "ws://localhost:8080/websocket";
            var ws = "";
            var message = {"id": "", "msg": "", "form": "", "to": ""};

            function connection() {
                //创建WebSocket对象
                ws = new WebSocket(url);
                console.log("connection.......");
                //收到服务器消息,e.data提取
                ws.onmessage = function (e) {
                    var json = eval('(' + e.data.toString() + ')');
                    showMessage(json.from + ":" + json.msg);
                }
                //已经关闭连接
                ws.onclose = function () {
                    showMessage("close");
                }
                //产生异常
                ws.onerror = function (e) {
                    showMessage("error");
                }
                //已经建立连接
                ws.onopen = function () {
                    showMessage("链接成功")
                    message.id = $(".identity").val();
                    message.msg = "newUser";
                    console.log(JSON.stringify(message));
                    //向服务器发送消息
                    ws.send(JSON.stringify(message));
                    message.msg = "";
                }
                //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
                window.onbeforeunload = function(){
                    ws.close();
                }

            }


            $(".start-conn-btn").click(function () {
                connection();
            });
            $(".send-btn").click(function () {//send message
                message.to = $(".to-user").val();
                message.msg = $(".msg-context").val();
                $(".msg-context").val("");
                ws.send(JSON.stringify(message));
                showMessage("我:" + message.msg);
                message.msg = "";

            });

            function showMessage(msg) {
                $(".show-message").append(msg + "<br/>");

            }


        });

    </script>
</head>
<body>
<div class="container">
    <div calss="item">
        <span>ID:</span>
        <input type="text" class="identity">
        <button class="start-conn-btn">链接</button>
        <span>toUser:</span>
        <input type="text" class="to-user">
    </div>
    <div class="show-message">

    </div>
    <div calss="item">
        <span>内容:</span>
        <textarea class="msg-context"></textarea>
    </div>
    <div>
        <button class="send-btn">send</button>
    </div>
</div>
</body>

</html>

 

启动:

/*
 * 文 件 名:  ChanatRoom.java
 * 版    权:  
 * 描    述:  <描述>
 * 修 改 人:   sun
 * 修改时间:  2018年7月18日
 */
package com.home.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * <一句话功能简述>
 * <功能详细描述>
 * 
 * @author   sun
 * @version  [版本号, 2018年7月18日]
 */
@Controller
@RequestMapping("/chanat-room")
public class ChanatRoom
{
    @RequestMapping("/start")
    public String start()
    {
        return "/chatRoom/chat";
    }
    
}

 

基于websocket的简易聊天室的实现 用java实现基于websocket的简易聊天室    WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成。 阅读详情

相关推荐

Workerman + WebSocket 开发聊天室教程

Workerman 是一个高性能的 PHP Socket 服务器框架,支持 TCP、UDP、Unix Socket 以及 HTTP、WebSocket 等协议。WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,非常适合实时应用,如聊天室、在线游戏等。本教程将指导你如何使用 Workerman 和 WebSocket 开发一个简单的聊天室。通过本教程,你已经学会了如何使用 Workerman 和 WebSocket 开发一个简单的聊天室。

duckom的博客 1972

websocket存储session(适合聊天,转发,广播,服务器主动发送消息)

此篇文章主要分享的是websocket存储session信息,在网上经常看到有websocket的例子,此篇文章只是将websocket中的session提取并存储起来,便于用户之间的互动与查找,其实就是解耦合此实现采用的是springboot的spring封装的websocket框架,原有的tomcat其实也可以完成首先,spring框架封装的websocket有几种对应onopen对应afte...

zero_rui.zhang的博客 3万+

【WebSocket】java使用WebSocket搭建简单聊天室

本次使用的WebSocket 来搭建简单的聊天室,主要就是熟悉WebSocket是什么,能做什么的简单入门介绍 网络摘抄 websocket是什么? 答: 它是一种网络通信协议,是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 为什么需要websocket? 疑问? 我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 答: 因为 HTTP 协议有一个缺陷:通信只能由客户端发起 我们都知道轮询的效率低,非常浪费资源(因为必须不停连接...

嗟鸠食桑 2160

Websocket定时监控+开关+参数传递

因为需要定时不断的给前端返回我们业务处理好的数据,这个时候HTTP请求显然不能很好的满足我们的需求,除非用定时器不断的发请求,这样会造成资源的浪费,而websocket是一种。,一旦连接服务端就就可以不断地向客户端推送数据,不用一直三次握手四次握手。需求:需要定时监控多个设备的温度情况,并且需要设置开关控制监控任务。因此这里采用websocket的方式来实现业务。举个例子,当开发中遇到了这样的需求时。3.信号量工具类(控制在线连接数)5.实现Runnable接口。4.控制层监控任务开关。

imagezx的博客 1409

如何使用WebSocket实现网页聊天室?

服务器推送你还在使用轮询吗?本文将带你领略WebSocket的魅力,轻松实现服务器推送功能。本文将以下面两方面让你理解WebSocket并应用到具体的开发中WebSocket 是一种网络通信协议。RFC6455 定义了它的通信标准。WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理。这种通信模型有一个弊端:HTTP 协议无法实现服务器

m0_74931226的博客 4045

从代码学习深度强化学习 - 目标导向的强化学习-HER算法 PyTorch版

经典的深度强化学习算法,如 PPO、SAC 等,在各自擅长的任务中都取得了非常好的效果。但它们通常都局限在解决单个任务上,换句话说,训练好的算法,在运行时也只能完成一个特定的任务。想象一个场景:我们想让一个机械臂能把桌子上的任何一个物体重置到任意一个指定位置。对于传统强化学习而言,如果目标物体的初始位置和目标位置每次都变化,那么这就是一个全新的任务。即便任务的“格式”——抓取并移动——是一样的,但策略本身可能需要重新训练。这显然效率极低。为了解决这类问题,

weixin_43887510的博客 1499

使用WebSocket实现服务端和客户端的通信

开发中经常会有这样的使用场景.如某个用户在一个数据上做了xx操作, 与该数据相关的用户在线上的话,需要实时接收到一条信息. 这种可以使用WebSocket来实现. 另外,对于消息,可以定义一个类进行固化. 主要是消息内容,接收人,发送人,是否已发送等. 用户上线时, 通过方法去查询出来然后进行发送   @ServerEndpoint(value = "/websocket/{sessio...

qq_40085888的博客 2215

CANOE仿真someip报文配置说明

利用canoe测试车辆控制器someip报文收发的步骤

AUTOSAR架构汽车软件开发 1万+

快速上手springboot搭建WebSocket服务器实现聊天(一)

用户连接上该websocket服务器触发该方法,将当前map<userId,session>存入代表该用户进入服务器即用户在。wensocket服务器收到消息时触发,例如当某一用户发送消息时,先将该消息发送到websocket服务器,再由服务器发送。用户断开websocket服务器连接触发该方法,并根据用户id将该用户和该用户的session从在线服务器用户中删除。当用户想给某一用户发消息时,调用该方法,传入接收方用户id以及发送的消息。我们分别让id为1、2、3的用户连接服务器。所有的在线用户都收到了。

m0_71751187的博客 2329

避开ego_planner仿真的第一个坑:深度相机、点云与odom话题配置全指南

本文详细解析了ego_planner仿真中深度相机、点云与odom话题配置的关键问题,帮助开发者避开常见陷阱。从数据流架构到具体配置细节,包括深度相机的内外参匹配、点云数据规范要求以及odom话题的验证方法,提供了全面的实战指南和优化建议。

weixin_30335575的博客 492

量化交易 米筐 多因子合成(回测中使用)

多因子合成 1、因子合成 将一些相关(高、低)的因子合成一个因子 方法: 使用PCA方式(使用于较强相关性) 2、核心代码 将因子 inc_revenue_ttm 和 operating_revenue_growth_ratio_ttm 合成为一个因子 inc_operating from sklearn.decomposition import PCA pca = PCA(n_components=1) # 因子合并 fund['inc_operating'] = pca.fit_transform(fu

廷益_飞鸟的博客 1062

WebSocket客户端java代码

Maven引入websoket的jar包: org.java-websocket Java-WebSocket 客户端代码: package com.cms.integration.common; import java.net.URI; import java.net.URISyntaxException; import org.java_websocket.clien

青衫烟雨客的专栏 1万+

Allegro172版本如何在联机模式下使用skill文件操作指导

注意:如果下次重新开启Symphony模式的时候可能导致symphony_skill中的文件内容被清空,所以最好将自己常用的skill文件都写到symphony_skill.txt中去,然后做好备份,需要的时候,在开启软件后把文件放到env目录中去。在用Allegeo172版本进行PCB设计的时候,有时会用到Symphony模式进行多人实时在线协同设计,如下图。这个模式设计起来可以提升设计速度,但是也有一个缺陷,就是不能使用skill文件。如下图,当调用skill的时候就会出现如下报错。

weixin_54787054的博客 1586

使用WebSocket实现网页聊天室

WebSocket 是一种网络通信协议。RFC6455 定义了它的通信标准。WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理。这种通信模型有一个弊端:HTTP 协议无法实现服务器主动向客户端发起消息。这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。

黑马程序员官方博客 7176

uniapp - [微信小程序] 实现点击预览各种文件 pdf文档、视频mp4、mp3音乐、图片图像、word/excel/ppt 等,uniapp小程序文件预览功能(详细示例代码,一键复制开箱即用)

uniapp,uniapp微信小程序,支付宝小程序平台端,uniapp实现文件在线预览,uniapp微信小程序怎么实现预览视频mp4,mp3音乐,图片,office文档,小程序平台如何在线预览word/excel/ppt文档,uniapp实现小程序端的文件查看功能,uniapp小程序端实现pdf文件预览,uniapp纯前端预览PDF、DOC、DOCX、图片、视频,uni-app文档、图片预览查看,uniapp文档预览功能,uniapp小程序端文件预览,uniapp小程序平台纯前端解析word,pdf,xls

✅ 精选推荐文章 1万+

SAP S/4HANA Public Cloud 的 Development Tenant 深度解析

在传统的 SAP On-Premise 版本中,企业通常拥有完整的开发、测试、生产环境,开发人员可以直接访问 ABAP 代码,进行深度定制。然而,S/4HANA Public Cloud 采用了标准化的 SaaS 模型,不允许用户直接修改核心代码。因此,SAP 提供了一种新的开发方式,即 Development Tenant,允许企业在不破坏核心系统稳定性的前提下,实现个性化扩展。Development Tenant 主要用于 SAP S/4HANA Public Cloud 的扩展开发。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 846

【十五】springboot整合WebSocket实现聊天室

springboot整合WebSocket实现聊天室

weixin_56995925的博客 2万+

10、利用智能合约实现公平的私有集合交集

本文探讨了利用智能合约实现公平的私有集合交集(PSI)的多种协议,重点分析了协议 Π 和 Π∗ 的气体成本与性能特点。同时对比了包括 Justitia 和 Anesidora 在内的现有方案,突出了仅使用智能合约实现硬币补偿公平性的优势。文中还介绍了相关密码学基础、安全模型及隐私保障机制,为在不同应用场景下选择高效、安全的 PSI 协议提供了理论支持和实践指导。

linux的博客 95

基于WebSocket实现客户聊天室

通过websocket,实现聊天室的功能。

Alphamilk的博客 1862

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Nodejs+webSocket搭建多人聊天室

NodeJs+webSocket搭建多人聊天室准备的东西:第一步:安装插件并且完善服务端第二步 :搭建客户端并与服务端的通信第三步 :添加CSS样式第四步:总结 今天花了一个上午的时间去学习了一下使用nodejs+websocket搭建多人聊天室。下面我分享下我做这个多人聊天室案例的整个过程。 先看下最终的效果图 上图的功能包括:显示在线人数,在同一房间可以互相发送消息,显示在线用户的列表. 下...

小贱贱的博客 7452

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

基于WebSocket的网页聊天室

WebSocket聊天室(需求,实现流程,消息格式,功能实现)

日常学习总结 2934

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

WebSocket并搭建简易聊天室

WebSocketWebSocketWebSocket特点代码基本框架客户端服务端代码示例发送与接收客户端实现服务端实现长连接在线聊天室设计思路客户端服务端代码存在的问题用户身份解决方法用户姓名的显示代码并发优化解决方法 WebSocket WebSocket,是一个基于TCP的通讯协议,适用于网站应用。 HTTP:短连接的TCP协议 WebSocket: 长连接的TCP协议 常见的应用场景:基于Web的聊天室、在线客服 WebSocket特点 单一TCP长连接,采用全双工通信模式(HTTP是半双工,

玄霄 4033

WebSocket实现一个聊天室

WebSocket实现一个聊天室 在线聊天室

欢迎访问我的主页:https://www.bookbook.cc 1万+

WebSocket多人聊天室

项目背景   现在的年轻人,大多都有“社交恐惧症”,但其实随着通信技术的日益发展,网络聊天在当今已不算新鲜事物,聊天可以方便大家交流,帮助大家克服“社恐”。以此为契机,我仿照QQ开发了一款 WebSocket多人聊天室 ,以供同一局域网下多名小伙伴相互聊天,增进彼此感情,共同战胜“社恐”。 实现功能 本聊天室具有以下功能:   1) 简单的注册登录功能   2) 用户发送消息,所有在线用户都能收到消息   3) 不在线用户在上线后能收到历史消息(第一次注册用户不会收到历史消息)   4) 右侧动态的显示

不想头秃QAQ的博客 6961

基于 WebSocket 打造聊天室

WebSocket 是一种基于连接上进行 通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单。

LEE180501的博客 1564

websocket聊天室

const WebSocket=require('ws') //websocket中的w和s必须大写; const wss=new WebSocket.Server({port:3001}) let num=0 wss.on('connection',function connection(ws){ console.log('one client is conntected') //接收客户端的消息 ws.on('message',function(msg){

qq_46356186的博客 218
上一篇: IDEA 普通本地jar项目导入
下一篇: BIO,伪异步IO,NIO,AIO与Netty
JavaMrSun
博客等级 码龄9年 27粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值