package com.socket;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
import javax.websocket.EndpointConfig;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import utils.MessageUtil;
@ServerEndpoint(value = "/websocket",configurator=GetHttpSessionConfigurator.class)
public class ChatServlet {
private static final Map<HttpSession,ChatServlet> onlineUsers = new HashMap<HttpSession, ChatServlet>();
private static int onlineCount = 0;//上线人数
private HttpSession httpSession;
private Session session;
@OnOpen
public void onOpen(Session session,EndpointConfig config){
this.session = session;
this.httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());
if(httpSession.getAttribute("user") != null){
onlineUsers.put(httpSession, this);
}
String names = getNames();
String content = MessageUtil.sendContent(MessageUtil.USER,names);
broadcastAll(content);
addOnlineCount(); //在线数加1
System.out.println("有新连接加入!当前在线人数为" + onlineUsers.size());
}
@OnClose
public void onClose(){
onlineUsers.remove(this); //从set中删除
subOnlineCount(); //在线数减1
System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
}
@OnMessage
public void onMessage(String message, Session session) throws IOException {
HashMap<String,String> messageMap = MessageUtil.getMessage(message); //处理消息类
String fromName = messageMap.get("fromName"); //消息来自人 的userId
String toName = messageMap.get("toName"); //消息发往人的 userId
String mapContent = messageMap.get("content");
String time = messageMap.get("time");
if(toName.isEmpty()){
sendOffLine(fromName,toName);
return;
}
//"|"是分隔符,用于前台处理
String msgContentString = fromName + "|" + mapContent+"|"+time; //构造发送的消息
if("all".equals(toName)){
String content = MessageUtil.sendContent(MessageUtil.MESSAGE,msgContentString);
broadcastAll(content);
}else{
try {
String content = MessageUtil.sendContent(MessageUtil.MESSAGE,msgContentString);
singleChat(fromName,toName,content);
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("来自客户端的消息:" + message);
broadcastAll(message);
}
private void singleChat(String fromName, String toName, String mapContent) throws IOException {
boolean isExit = false;
for (HttpSession key : onlineUsers.keySet()) {
if(key.getAttribute("user").equals(toName)){
isExit = true;
}
}
if(isExit){
for (HttpSession key : onlineUsers.keySet()) {
if(key.getAttribute("user").equals(fromName) || key.getAttribute("user").equals(toName)){
onlineUsers.get(key).session.getBasicRemote().sendText(mapContent);
}
}
}else{
String content = MessageUtil.sendContent(MessageUtil.MESSAGE,"客服不在线请留言...");
broadcastAll(content);
}
}
private void sendOffLine(String fromName, String toName) throws IOException {
String msgContentString = toName + "不在线";
String content = MessageUtil.sendContent(MessageUtil.MESSAGE,msgContentString);
for (HttpSession key : onlineUsers.keySet()) {
if(key.getAttribute("user").equals(fromName) || key.getAttribute("user").equals(toName)){
onlineUsers.get(key).session.getBasicRemote().sendText(content);
}
}
}
private static void broadcastAll(String msg) {
System.out.println(msg);
for (HttpSession key : onlineUsers.keySet()) {
try {
onlineUsers.get(key).session.getBasicRemote().sendText(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
@OnError
public void onError(Session session, Throwable error){
System.out.println("发生错误");
error.printStackTrace();
}
private String getNames() {
String names = "";
for (HttpSession key : onlineUsers.keySet()) {
String name = (String) key.getAttribute("user");
names += name + ",";
}
String namesTemp = names.substring(0,names.length()-1);
return namesTemp;
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static synchronized void addOnlineCount() {
ChatServlet.onlineCount++;
}
public static synchronized void subOnlineCount() {
ChatServlet.onlineCount--;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
WebSocket实现即时通信.zip (44个子文件)
WebSocket8
.project 1KB
WebContent
WEB-INF
lib
gson-2.3.1.jar 206KB
web.xml 241B
QQtalk
images
chat_bar_bg.jpg 1KB
wlf_title_bg.jpg 319B
icon.png 3KB
bodyBg3.jpg 307B
wlf_title_btn.jpg 477B
wlf_bg.png 110B
title-bg.png 2KB
bodyBg2.jpg 306B
all.PNG 48KB
you0.jpg 11KB
bodyBg.jpg 307B
send_btn.jpg 2KB
you.PNG 12KB
me.jpg 10KB
title_bg.jpg 1KB
chat_title_bg.jpg 1KB
status.gif 83B
layer_arrow.png 315B
js
chat.js 4KB
iepng.js 5KB
IE7.js 30KB
jquery-1.7.2.min.js 93KB
css
chat.css 9KB
chat.jsp 3KB
META-INF
MANIFEST.MF 39B
login.jsp 486B
src
utils
HTMLFilter.java 2KB
MessageUtil.java 963B
com
socket
GetHttpSessionConfigurator.java 577B
ChatServlet.java 5KB
.settings
org.eclipse.wst.jsdt.ui.superType.container 49B
org.eclipse.wst.common.project.facet.core.xml 305B
org.eclipse.jdt.core.prefs 364B
org.eclipse.wst.jsdt.ui.superType.name 6B
org.eclipse.wst.common.component 482B
.jsdtscope 503B
build
classes
utils
HTMLFilter.class 1KB
MessageUtil.class 2KB
com
socket
ChatServlet.class 6KB
GetHttpSessionConfigurator.class 1KB
.classpath 548B
共 44 条
- 1
资源评论
- TIANWEE2017-03-13垃圾!用别人的代码作为自己的资源?
- heshuiafan2017-03-13不能用啊…?报错404
- 禅时2018-01-23是java的,也是无法
SundaySunshine
- 粉丝: 9
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Fortran语言语法快速入门.pdf
- 明日方舟 年 鼠标指针.rar
- 全国银行经济监管可视化系统
- e商小二-供应链管理物流交仓创业商业计划书.rar
- Edge浏览器下载文件提示 “无法安全下载” 的解决方法
- 基于springboot+layui的医院日常耗材管理系统.zip
- Emkex亿迈克思新型互联网磁材供应链商业计划书.rar
- 计算机毕业设计-ASP.NET某店POS积分管理系统-销售情况,会员卡再发行数据生成(源代码+)-毕设源码实例.zip
- 计算机毕业设计-asp.net某店POS积分管理系统-清除履历表、日志表、月购买额(源代码+)-毕设源码实例.zip
- 计算机毕业设计-ASP.NET某店POS积分管理系统-积分实绩更新及销售状况统计(源代码+)-毕设源码实例.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功