WebSocket实现简单实时聊天窗口

WebSocket实现简单实时聊天窗口文章目录前言一 WebSocketSer 类二 启动类三 前端页面四 效果图五 其他前言使用 JavaWebSocke 包实现聊天窗口 最朴素的实现 大道至简 WebSocket 基础所用 jar 包 Java WebSocket 依赖了日志包 Java WebSocket 1 5 2 jarslf4j log4j12 1 7 32 jarslf4j api 1 7 32 jarslf4j api 1 7 32 jar 一 WebSocketSer 类建立 WebSocketSer 类作为


前言

使用Java WebSocket包实现聊天窗口,最朴素的实现,大道至简
WebSocket基础
所用jar包,Java-WebSocket依赖了日志包
Java-WebSocket-1.5.2.jar
slf4j-log4j12-1.7.32.jar
slf4j-api-1.7.32.jar
slf4j-api-1.7.32.jar












一、WebSocketServer类

public class WsServer extends WebSocketServer { 
     static { 
     //使用默认log配置,不是因为懒,大道至简 BasicConfigurator.configure(); } private static Logger log = Logger.getLogger(WsServer.class); private static int userid = 1; /保存用户连接和用户id*/ public static final HashMap<WebSocket, Integer> users = new HashMap<>(); public WsServer(int port) { 
     super(new InetSocketAddress(port)); } @Override public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) { 
     System.out.println(clientHandshake.getResourceDescriptor()); log.info("--------------------onOpen--------------------"); System.out.println(webSocket.getRemoteSocketAddress()+"已连接"); webSocket.send("服务器:hello,用户"+userid+"你已成功连接"); String str = "用户"+userid+"加入聊天"; users.put(webSocket, userid); broadcastMsg(webSocket,str); userid++; } @Override public void onClose(WebSocket webSocket, int i, String s, boolean b) { 
     log.info("--------------------onClose--------------------"); users.remove(webSocket); String str = "用户"+users.get(webSocket)+"退出聊天"; broadcastMsg(webSocket,str); } @Override public void onMessage(WebSocket webSocket, String s) { 
     log.info("--------------------onMessage--------------------"); System.out.println("收到" + webSocket.getRemoteSocketAddress() + "的消息:" + s); //webSocket.send("回复" + webSocket.getRemoteSocketAddress()); broadcastMsg(webSocket,s); } @Override public void onError(WebSocket webSocket, Exception e) { 
     log.info("--------------------onError--------------------"); webSocket.send("出错了..."); } @Override public void onStart() { 
     log.info("--------------------Server onStart--------------------"); } public void broadcastMsg(WebSocket webSocket, String s){ 
     for (Map.Entry<WebSocket, Integer> user: users.entrySet()) { 
     user.getKey().send("用户"+users.get(webSocket)+":"+s); } } } 

二、启动类

WebSocketServer实现Runnable直接启动即可

public class Main { 
     public static void main(String[] args) { 
     WsServer wsServer = new WsServer(8888); wsServer.start(); } } 

三、前端页面

 
     DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>WebSocket 客户端 
       title>  
        head> <body> <div id="sse"> <input id="WebSocketServer" value="ws://localhost:8888"> <button onclick="getConnection()">连接WebSocket 
         button> <button onclick="closeConnection()">关闭WebSocket 
          button>  
           br> <input id="message" value="一条消息"> <button onclick="sendMessage()">发送 
            button>  
             br> <div id="messageBox"> <div><span>welcome! 
              span> 
               div>  
                div>  
                 div>  
                  body> <script type="text/javascript"> let ws = null; let messageBox = document.getElementById("messageBox"); function getConnection() { 
                    if (!"WebSocket" in window) { 
                    alert("您的浏览器不支持 WebSocket!"); } ws = new WebSocket(document.getElementById("WebSocketServer").value); ws.onmessage = function (evt) { 
                    //alert("数据接收" + evt.data); let str = ' 
                   
' + evt .data + '
'
; messageBox.innerHTML = messageBox.innerHTML + str; }; ws.onerror = function () { alert("出错了...") } ws.onclose = function () { // 关闭 websocket alert("连接已关闭..."); }; } function sendMessage() { if (ws == null || ws.readyState === 3) { alert("请先连接到websocketServer"); return; } //console.log(ws.readyState) ws.send(document.getElementById("message").value) document.getElementById("message").value = ''; } //注意:fun名不能是close,会没反应 function closeConnection() { ws.close(1000); }
script> html>

四、效果图

五、其他

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176015.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午10:52
下一篇 2026年3月26日 下午10:52


相关推荐

  • 在linux中 更改文件权限的命令是,linux 更改文件权限命令 chmod

    在linux中 更改文件权限的命令是,linux 更改文件权限命令 chmodchmod changefilemo 更改文件权限 chmod 是用来改变文件或者目录权限的命令 但只有文件的属主和超级用户 root 才有这种权限 更改文件权限的 2 种方式 一 权限字母 操作符表达式二 数字方法 常用 hmod 数字权限方法 推进 命令格式 chmod 数字组合 文件名 chmod 数字组合 目录名 R 参数可递归生效 该目录下所有文件或子目录一起改

    2026年3月17日
    2
  • 踩坑了,JDK8中HashMap依然会产生死循环问题!

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:Aaron_涛 blog.csdn.net/qq_33330687/article/details/10147…

    2021年6月24日
    116
  • 最全的js正则表达式用法大全_js正则表达式语法大全

    最全的js正则表达式用法大全_js正则表达式语法大全匹配中文字符的正则表达式:[u4e00-u9fa5]评注:匹配中文还真是个头疼的事,有了这个表达式就好办了匹配双字节字符(包括汉字在内):[^x00-xff]评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)匹配空白行的正则表达式:ns*r评注:可以用来删除空白行匹配HTML标记的正则表达式:]*>.*?|评注:网上流

    2025年6月1日
    3
  • C++ 中的getline()函数用法详解

    C++ 中的getline()函数用法详解    遇到了要输入一行字符串的操作,我想除了fgets()的方法(fgets()用法链接),getline()也是可以的,但是我对getline的操作不熟悉,便查阅了很多资料,发现都说的很模糊,借这个机会我想彻底理清楚getline的用法;  网上有说getline有两种用法的,我在这总结一下,一、getline()用的比较多的用法 1) istrea…

    2025年6月1日
    4
  • Oracle拼接字符串的两种方式

    Oracle拼接字符串的两种方式1 listagg nbsp nbsp nbsp 该方法拼接后是 varchar2 类型 有最大长度限制 在 OracleDataba 中 VARCHAR2 字段类型 最大值为 4000 PL SQL 中 VARCHAR2 变量类型 最大字节长度为 32767 nbsp nbsp nbsp 适用场景 当要拼接的字符较少时使用 select select col from table name

    2026年3月19日
    3
  • IDEA汉化版踩坑

    IDEA汉化版踩坑IDEA汉化版踩坑之前下的汉化版踩了一些坑,最后还是用回了英文版……①无法在项目中打开setting首先确保IntellijIDEA关闭,然后打开IDEA安装位置的文件夹,将lib文件夹下的resources_cn.jar文件用压缩软件打开、将其messages文件夹内的①IdeBundle.properties(系统设置(setting)外观选项加载不出来)②VcsBundle….

    2022年5月25日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号