利用websocket实现群聊以及单聊

article/2025/10/23 5:37:30

利用websocket实现群聊以及单聊

    • 项目结构
    • 实现代码
    • 运行截图

在这里提供一下思路,正常情况下我们登陆进去之后就应该打开一个ws连接,以便和服务器进行通信,将打开的管道用一个set容器进行存储,并将用户名或者其他能唯一标示用户的字段作为key,把与之对应的管道作为value存储到一个map集合中。
那么怎么实现广播的方法呢?其实很简单,这需要对set容器中的每一个管道进行遍历并执sendText()方法,就可以将消息传递给了集合中每个管道(前提是在每个用户进行登陆时将用户存储到一个集合中)。
接下来首先实现群聊,通过jquery获得输入框的内容,然后通过onmessage()方法向后端传递消息,在调用广播方法就可以实现群聊了。
接下来就是单聊,单聊的实现原理就是得到被单聊的人的用户名,然后在map集合中的得到与之对应的管道,然后调用sendText()方法就可以将消息发送给对应的人了。
话不多说,直接上图上代码

项目结构

在这里插入图片描述

实现代码

DemoConfig.java

import java.util.Set;import javax.websocket.Endpoint;
import javax.websocket.server.ServerApplicationConfig;
import javax.websocket.server.ServerEndpointConfig;public class DemoConfig implements ServerApplicationConfig {@Overridepublic Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scan) {// TODO Auto-generated method stubSystem.out.println("config................"+scan.size());//可以提供过滤作用return scan;}@Overridepublic Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> arg0) {// TODO Auto-generated method stubreturn null;}}

index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Insert title here</title>
</head>
<body>
<form action="LoginServlet">姓名:<input id="username" name="username" /><input type="submit" />
</form>
</body>
</html>

ChatRoom.jsp

<%@page import="java.io.PrintWriter"%>
<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Insert title here</title><script type="text/javascript" src="jquery-1.4.2.min.js"></script><script type="text/javascript">var username="${sessionScope.username}";var ws;//一个ws对象就是一个管道var target="ws://localhost:8080/web_war_exploded/chatSocket?username="+username;window.onload=function(){//登录进入ChatRoom就打开socket通道if ('WebSocket' in window) {ws = new WebSocket(target);} else if ('MozWebSocket' in window) {ws = new MozWebSocket(target);} else {alert('WebSocket is not supported by this browser.');return;}ws.onmessage=function(event){eval("var msg="+event.data+";");if(undefined!=msg.welcome)$("#content").append(msg.welcome+"<br/>");if(undefined!=msg.usernames){$("#userList").html("");$(msg.usernames).each(function(){$("#userList").append("<input  type=checkbox  value='"+this+"'/>"+ this + "<br/>");});}if(undefined!=content){$("#content").append(msg.content+"<br/>");console.info(msg);}}}function subSend() {//判断是否选中var ss=$("#userList :checked");var val = $("#msg").val();console.info(ss.size());//如果未选中var obj=null;if(ss.size()==0){var obj={msg:val,type:1 //1广播 2单聊}}else {var to = $("#userList :checked").val();obj={to:to,msg:val,type:2 //1广播 2单聊}}var str = JSON.stringify(obj);/* $("msg").val("");var obj={to:to,msg:val,type:1 //1广播 2单聊} */ws.send(str);}</script>
</head>
<body>
<div id="container" style="border:1px solid black;width:400px;height:400px;float:left;"><div id="content" style="height:350px;"></div>
</div>
<div style="border-top:1px solid black;width:400px;height:50px;"><input id="msg" /><button onclick="subSend();">send</button>
</div><div id="userList" style="border:1px solid black;width:400px;height:400px;float:left;">
</div>
</body>
</html>

LoginServlet.java

package com.hys.servlet;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class LoginServlet*/
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public LoginServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubrequest.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");String username = request.getParameter("username");request.getSession().setAttribute("username", username);/*System.out.println(username);*/response.sendRedirect("ChatRoom.jsp");}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

ChatSocket.java

package com.hys.socket;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;import com.google.gson.Gson;
import com.hys.vo.ContentVo;
import com.hys.vo.Message;import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
@ServerEndpoint(value = "/chatSocket")
public class ChatSocket {
private String username;
private Session session;
private static Map<String, Session> map=new HashMap<String, Session>();/*将管道与用户名绑定*/
private  static  Set<ChatSocket>  sockets=new HashSet<ChatSocket>();/*管道道的集合*/
private static List<String> names = new ArrayList<String>();/*用户的集合*/
private  Gson gson = new Gson();@OnOpenpublic void open(Session session) {//当前的websocket的session不是之前的session//获取username//将当前的管道加入到管道的集合中去this.session = session;this.sockets.add(this);//将当前的username与session绑定String queryname = session.getQueryString();/*System.out.println(queryname);*/username=queryname.split("=")[1];this.names.add(username);this.map.put(this.username, this.session);/*System.out.println(username);*/String msg = "欢迎"+this.username+"进入聊天室";Message message=new Message();message.setWelcome(msg);message.setUsernames(this.names);this.broadcast(sockets,message.toJson());}@OnClosepublic void close(Session session) {this.sockets.remove(this);this.names.remove(this.username);String msg = this.username+"离开聊天室";Message message=new Message();message.setWelcome(msg);message.setUsernames(this.names);broadcast(sockets,message.toJson());}
//    private static Gson gson=new Gson();@OnMessagepublic void onmessage(Session session,String json) {ContentVo vo=gson.fromJson(json, ContentVo.class);if(vo.getType()==1) {//广播Message message=new Message();message.setContent(this.username, vo.getMsg());this.broadcast(sockets,message.toJson());}else {//单聊//单聊过程与广播类似,/*分析前台传过来的消息的type如果是2的话就在map(存放的是key是用户名,value是socket)中通过getTo来取得接收信息的socket并通过to_session.getBasicRemote().sendText(gson.toJson(message))将消息传递给前台*//*举个不太恰当的例子,我想将一个苹果(消息)放到小明的冰箱(小明的前端页面),然后就我又不想动,我就想找小明然后我就喊小明的名字,小明(相当于服务器)听到我喊他的名字(从map集合中找到对应的session)然后小明就将苹果放入到了他的冰箱(对应的session调用sendText()方法传递消息)放到冰箱里(前台)* */String to=vo.getTo();Session to_session = this.map.get(to);System.out.println(to);System.out.println(to_session);Message message=new Message();message.setContent(this.username, vo.getMsg());try {to_session.getBasicRemote().sendText(gson.toJson(message));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}//广播消息
public void broadcast(Set<ChatSocket>sockets ,String msg){//遍历当前所有的连接管道,将通知信息发送给每一个管道for(ChatSocket socket : sockets){try {//通过session发送信息socket.session.getBasicRemote().sendText(msg);} catch (IOException e) {e.printStackTrace();}}
}
}

ContentVo.java

package com.hys.vo;public class ContentVo {
private String to;
private String msg;
private Integer type;
public String getTo() {return to;
}
public void setTo(String to) {this.to = to;
}
public String getMsg() {return msg;
}
public void setMsg(String msg) {this.msg = msg;
}
public Integer getType() {return type;
}
public void setType(Integer type) {this.type = type;
}
}

Message.java

package com.hys.vo;import java.util.Date;
import java.util.List;import com.google.gson.Gson;public class Message {
private String welcome;
private List<String> usernames;
private String content;
public String getContent() {return content;
}
public void setContent(String content) {this.content = content;
}public void setContent(String name,String msg) {this.content = name+""+new Date().toLocaleString()+":<br/>"+msg+":<br/>";
}public String getWelcome() {return welcome;
}
public void setWelcome(String welcome) {this.welcome = welcome;
}
public List<String> getUsernames() {return usernames;
}
public void setUsernames(List<String> usernames) {this.usernames = usernames;
}
public String toJson() {return gson.toJson(this);
} public static Gson gson=new Gson();
}

运行截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
##注意
如果使用eclipse的话,可以建立相应的目录结构将代码粘贴进去,导入jar包即可


http://chatgpt.dhexx.cn/article/ppJIwcpK.shtml

相关文章

Java实现钉钉自定义群聊机器人

参考文档&#xff1a; 自定义机器人接入 - 钉钉开放平台https://open.dingtalk.com/document/orgapp/custom-robot-access 自定义机器人安全设置 - 钉钉开放平台目前有3种安全设置方式&#xff0c;请根据需要选择一种。https://open.dingtalk.com/document/robots/customize-ro…

Netty基础,Netty实现群聊系统

NIO群聊系统 这里面的知识比较全面&#xff0c;用到了我们之前学习的三大组件&#xff0c;首先我先来给大家介绍本系统的功能 服务端功能 最基本的当然是注册功能&#xff0c;也就是将serverSocketChannel注册进Selector&#xff0c;Selector负责调度事件 监听、读取客户端…

c语言 多进程实现基于UDP的网络群聊聊天室

功能 有新用户登录&#xff0c;其他在线的用户可以收到登录信息 有用户群聊&#xff0c;其他在线的用户可以收到群聊信息 有用户退出&#xff0c;其他在线的用户可以收到退出信息 服务器可以发送系统信息 流程图如下&#xff1a; 提示&#xff1a; 客户端登录之后&#x…

Spring Boot使用WebSocket实现群聊

1.通过https://start.aliyun.com创建一个spring boot项目 https://start.aliyun.com 所需依赖&#xff1a; 2.编写代码 目录&#xff1a; WebMvcConfig&#xff0c;监控用户页面&#xff1a; package com.example.mywbsk.config;import org.springframework.context.annotat…

网络编程 : 基于UDP的网络群聊聊天室

一、UDP网络编程: 1.1 流程 服务器流程: 创建用户数据报套接字 填充服务器的网络信息结构体 绑定套接字与服务器网络信息结构体 收发数据 关闭套接字 客户端流程&#xff1a; 创建用户数据报套接字 填充服务器的网络信息结构体 收发数据 关闭套接字 二、基于UDP的网络群聊聊天…

Java网络编程:TCP实现群聊功能代码

Java网络编程&#xff1a;TCP实现群聊功能代码 实现的功能&#xff1a;群聊 具体操作流程的大致思路&#xff1a; 某个客户端发送消息&#xff0c;服务器将该消息转发给其余客户端&#xff08;除了自己&#xff09;。 代码一共分两个端&#xff08;服务器和客户端&#xff0…

【Java教程】UDP实现群聊聊天室

大家好&#xff0c;今天为大家带来了一个非常有意思的小程序——UDP实现的群聊聊天室。这个程序使用的UDP协议&#xff0c;并使用DatagramSocket的子类MulticastSocket实现组播&#xff0c;可以部署在一个局域网内的多台电脑上&#xff0c;并可以实现文字群聊。 本文将会按照以…

群聊私聊天建群社交即时通讯H5系统开发

群聊私聊天建群社交即时通讯H5系统开发 前端功能&#xff1a; 聊天、通讯录、动态、发现、我、多国语言、私聊、群聊、创建群聊&#xff08;设置免费、收费&#xff09;、发布动态、发信息&#xff08;图片、文字、红包、不支持语言&#xff09;、我的余额&#xff08;后台添加…

socket.io实现简易版群聊

最近学了点 websocket 的技术知识&#xff0c;了解到 node.js 有相关技术——socket.io可以实现&#xff0c;就想着实现一个简单版本的群聊。 先看看效果图 在浏览器中打开2个窗口&#xff0c;访问 http://localhost:3000/socket 目录结构 node 服务器代码实现 需要安装 exp…

Go实现简易聊天室(群聊)

参考&#xff1a;Go 群聊 ( goroutine ) 语雀 基于websocket的聊天室&#xff0c;可进一步参考&#xff1a; (1) go实现聊天室(WebSocket方式) (2) Golang代码搜集-基于websocketvue.js的简易聊天室 闲着无聊ing~ 一直想着能用go整一些好玩的小工具&#xff0c;想着想着突然想…

vue+websocket+nodejs创建聊天室- 创建群聊、加入群聊

前言 前几篇我们讲了如何创建聊天室,一对一/一对多聊天&#xff0c;以及加已读未读消息状态。 这篇主要讲如何创建群聊和加入群聊。 还是跟之前一样&#xff0c;本文只写新加入的逻辑&#xff0c;之前逻辑请查看之前文章。 PS&#xff1a;效果稍微有点粗糙哈哈&#xff0c;不要…

html群聊插件,团队群聊.html

&#xfeff;团队群聊 $axure.utils.getTransparentGifPath function() { return resources/images/transparent.gif; }; $axure.utils.getOtherPath function() { return resources/Other.html; }; $axure.utils.getReloadPath function() { return resources/reload.html;…

ajax聊天室创建群聊,js+node.js+socket.io实现聊天功能(私聊,创建群聊)

效果图: 这里启动了四个客户端进行测试 1. 登录,以及获取在线用户列表 2. 私聊功能 3. 群聊功能 偶然发现了WebSocket, 发现这个可以实时通信,在线聊天,所以就做了一个聊天工具的demo,记录一下 Socket.io WebSocket是js原生自带的,而Socket.io相当于是对WebSocket进行封装…

php怎么做群聊,workerman实现群聊

服务端&#xff1a; require_once "../vendor/autoload.php"; use Workerman\Worker; $worker new Worker(‘websocket://0.0.0.0:2345‘); $worker->count 1; $worker->onWorkerStart function($data){ echo "连接开始\n"; }; $worker->onCon…

致微信:我们什么时候重新定义群聊?

你永远都不知道&#xff0c;自己到底有多少微信群。 你也很难想象&#xff0c;一个20多人的小团队&#xff0c;相互之间会建几百个群&#xff0c;然后当你需要群发一个文件/通知时&#xff0c;还是找不到合适的群&#xff0c;怎么办&#xff1f;重新拉一个群呗。 如果你加的群稍…

怎么玩转LINE 群聊

关键词&#xff1a;LINE群聊 &#xff1b;SaleSmartly&#xff08;ss客服&#xff09; 一个 LINE 群聊是企业让客户了解其产品或服务的有效方式。如果使用得当&#xff0c; LINE 小组是企业同时快速培养与多个客户关系的绝佳场所。想了解更多吗&#xff1f;继续阅读&#xff0…

微信怎么找群聊?找回微信群聊只需要这样…

如今社会中的日常生活已经离不开微信&#xff0c;微信是社交界的一股清流&#xff0c;聊天、视频、语音等等功能&#xff0c;而且支付功能的用途范围在国内也甚是广泛。微信怎么找群聊&#xff1f;是的&#xff0c;当多个好友之间相互认识&#xff0c;或者都有一个共同点的时候…

免费tk域名+freewebhostingarea空间

1.申请免费域名 进入http://www.dot.tk&#xff08;推荐注册tk域名&#xff09;&#xff0c;申请一个新的域名&#xff0c;每次申请12个月以下是免费的&#xff0c;到期前14天可以免费续期 在此页面执行下一步之前&#xff0c;需要进行设置DNS服务器 2.获取DNS服务器 申请进…

免费国外PHP+MYSQL空间申请

这是一个在匈牙利的免费空间,但是在网页上方挂广告条(可以用CSS屏蔽掉). 支持的以下内容管理系统: - Joomla - Wordpress - e107 - Drupal - Simple Machine Forum (SMF) - PHP-Nuke - phpBB - Elxis - MyBB - CMS Made Simple 具体申请步骤: 1.进入www.freeweb.hu 2. 3. 4. 5.…

GIS地理空间数据免费获取

GIS地理空间数据免费获取 国内&#xff1a; 一、测绘地理信息局会提供权威的数据。 需要进入全国地理信息资源目录服务系统网站&#xff08;http://www.webmap.cn/main.do?methodindex&#xff09;&#xff0c;该网站提供&#xff1a;30米全球地表覆盖数据&#xff0c;Globe…