package com.controller;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import net.sf.json.JSONObject;
@ServerEndpoint("/websocket/{info}")
public class WebSocketService {
private static SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");//创建时间格式对象
//concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketService对象。
//创建一个房间的集合,用来存放房间
private static ConcurrentHashMap<String,ConcurrentHashMap<String, WebSocketService>> roomList = new ConcurrentHashMap<String,ConcurrentHashMap<String, WebSocketService>>();
//与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session;
//重新加入房间的标示;
private int rejoin = 0;
static {
roomList.put("room1", new ConcurrentHashMap<String, WebSocketService>());
roomList.put("room2", new ConcurrentHashMap<String, WebSocketService>());
}
/**
* 用户接入
* @param session
*/
@OnOpen
public void onOpen(@PathParam(value = "info") String param,Session session){
this.session = session;
String flag = param.split("[|]")[0]; //标识
String member = param.split("[|]")[1]; //成员名
if(flag.equals("join")){
String user = param.split("[|]")[2];
joinRoom(member,user);
}
}
//加入房间
public void joinRoom(String member,String user){
ConcurrentHashMap<String, WebSocketService> r = roomList.get(member);
if(r.get(user) != null){ //该用户有没有出
this.rejoin = 1;
}
r.put(user, this);//将此用户加入房间中
}
public void sendMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
}
/**
* 接收到来自用户的消息
* @param message
* @param session
* @throws IOException
*/
@OnMessage
public void onMessage(String message,Session session) throws IOException{
//把用户发来的消息解析为JSON对象
JSONObject obj = JSONObject.fromObject(message);
if(obj.get("flag").toString().equals("exitroom")){ //退出房间操作
String roomid = obj.get("roomid").toString();
//将用户从聊天室中移除
int f2 = 1;
roomList.get(roomid).remove(obj.get("nickname").toString());//将用户直接移除
if(roomList.get(roomid).size() == 0){//判断房间该房间是否还有用户,如果没有,则将此房间也移除
f2 = 2;
}
if(f2 == 1){ //证明该房间还有其它成员,则通知其它成员更新列表
obj.put("flag","exitroom");
String m = obj.get("nickname").toString()+" 退出了房间";
obj.put("message", m);
ConcurrentHashMap<String, WebSocketService> r =roomList.get(roomid);
List<String> uname = new ArrayList<String>();
for(String u:r.keySet()){
uname.add(u);
}
obj.put("uname", uname.toArray());
for(String i:r.keySet()){ //遍历该房间
r.get(i).sendMessage(obj.toString());//调用方法 将消息推送
}
}
}else if(obj.get("flag").toString().equals("chatroom")){ //聊天室的消息 加入房间/发送消息
//向JSON对象中添加发送时间
obj.put("date", df.format(new Date()));
//获取客户端发送的数据中的内容---房间�? 用于区别该消息是来自于哪个房间
String roomid = obj.get("target").toString();
//获取客户端发送的数据中的内容---用户
String username = obj.get("nickname").toString();
//从房间列表中定位到该房间
ConcurrentHashMap<String, WebSocketService> r =roomList.get(roomid);
List<String> uname = new ArrayList<String>();
for(String u:r.keySet()){
uname.add(u);
}
obj.put("uname", uname.toArray());
if(r.get(username).rejoin == 0){ //证明不是退出重连
for(String i:r.keySet()){ //遍历该房间
obj.put("isSelf", username.equals(i));//设置消息是否为自己的
r.get(i).sendMessage(obj.toString());//调用方法 将消息推送
}
}else{
obj.put("isSelf", true);
r.get(username).sendMessage(obj.toString());
}
r.get(username).rejoin = 0;
}
}
/**
* 用户断开
* @param session
*/
@OnClose
public void onClose(Session session){
}
/**
* 用户连接异常
* @param t
*/
@OnError
public void onError(Throwable t){
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
java利用websocket实现多人聊天室(springmvc框架)
共79个文件
jar:54个
xml:6个
prefs:2个
4星 · 超过85%的资源 需积分: 50 103 下载量 5 浏览量
2018-05-22
14:42:49
上传
评论 5
收藏 15.72MB RAR 举报
温馨提示
环境:eclipse+jdk1.8+tomcat8 项目启动后访问链接:http://localhost:8080/Chatroom/home/list.do
资源推荐
资源详情
资源评论
收起资源包目录
Chatroom.rar (79个子文件)
Chatroom
conf
applicationContext.xml 862B
springmvc.xml 1KB
.project 908B
WebContent
WEB-INF
pages
index.jsp 1018B
room.jsp 6KB
lib
slf4j-api-1.5.6.jar 22KB
jackson-databind-2.3.3.jar 894KB
commons-fileupload-1.3.1.jar 67KB
log4j-1.2.16.jar 470KB
slf4j-jdk14-1.5.6.jar 9KB
json.jar 45KB
httpcore-4.4.3.jar 319KB
xpp3_min-1.1.4c.jar 24KB
spring-jdbc-4.0.5.RELEASE.jar 415KB
jstl-1.2.jar 416KB
jackson-annotations-2.3.0.jar 34KB
spring-webmvc-4.0.5.RELEASE.jar 647KB
spring-websocket-4.0.5.RELEASE.jar 271KB
jodconverter-cli-2.2.2.jar 6KB
jodconverter-2.2.2.jar 31KB
gson-2.3.1.jar 206KB
mysql-connector-java-5.1.2-beta-bin.jar 622KB
commons-beanutils-1.7.0.jar 184KB
spring-expression-4.0.5.RELEASE.jar 200KB
spring-web-4.0.5.RELEASE.jar 657KB
mybatis-spring-1.1.1.jar 40KB
ezmorph-1.0.3.jar 76KB
spring-context-support-4.1.5.RELEASE.jar 174KB
jurt-3.0.1.jar 106KB
spring-beans-4.0.5.RELEASE.jar 654KB
commons-collections-3.1.jar 546KB
commons.logging-1.1.1.jar 60KB
ridl-3.0.1.jar 248KB
juh-3.0.1.jar 54KB
xstream-1.3.jar 401KB
commons-httpclient-3.0.jar 273KB
unoil-3.0.1.jar 1.3MB
aspectjweaver.jar 1.8MB
commons-cli-1.2.jar 40KB
spring-messaging-4.0.5.RELEASE.jar 262KB
json-lib-2.4-jdk15.jar 155KB
jettison-1.1.jar 66KB
spring-aop-4.0.5.RELEASE.jar 344KB
ueditor-1.1.2.jar 30KB
aopalliance-1.0.jar 4KB
aspectjrt.jar 112KB
httpclient-4.5.1.jar 716KB
commons-io-2.4.jar 181KB
commons-lang-2.5.jar 273KB
spring-core-4.0.5.RELEASE.jar 953KB
commons-codec-1.9.jar 258KB
spring-context-4.0.5.RELEASE.jar 954KB
spring-tx-4.0.5.RELEASE.jar 242KB
javax.mail.jar 425KB
jackson-core-2.3.1.jar 193KB
xstream-1.3.1.jar 421KB
dom4j-2.0.0-RC1.jar 305KB
fastjson-1.2.7.jar 407KB
mybatis-3.1.1.jar 636KB
web.xml 3KB
img
touxiang.jpg 6KB
touxiang2.jpg 8KB
js
jquery-3.2.1.min.js 85KB
META-INF
MANIFEST.MF 39B
css
chat.css 2KB
src
com
controller
WebSocketService.java 5KB
ViewController.java 658B
.settings
org.eclipse.wst.jsdt.ui.superType.container 49B
org.eclipse.wst.common.project.facet.core.xml 345B
org.eclipse.jdt.core.prefs 364B
org.eclipse.wst.jsdt.ui.superType.name 6B
org.eclipse.core.resources.prefs 115B
org.eclipse.wst.common.component 551B
.jsdtscope 567B
build
classes
applicationContext.xml 862B
com
controller
ViewController.class 1KB
WebSocketService.class 5KB
springmvc.xml 1KB
.classpath 880B
共 79 条
- 1
资源评论
- 伊利亚菲尔丁2020-06-22这个东西怎么用呀 是room1和room2聊天吗?
- wdt3203222019-05-31一般化吧,好久前下的,没事来评价下
隨遇灬而安
- 粉丝: 107
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功