SSM框架WebSocket配置
1、StartFilter.java
package cn.xydata.pharmacy.websocket; import java.io.IOException; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; import org.java_websocket.WebSocketImpl; import cn.xydata.pharmacy.websocket.WSServer;; public class StartFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException { } public void init(FilterConfig arg0) throws ServletException {
this.startWebsocketInstantMsg();
} /**
* 启动即时聊天服务
*/
public void startWebsocketInstantMsg() {
WebSocketImpl.DEBUG = false;
WebServer s = new WebServer(6004);
s.start();
}
}
2、WebServer.java
package cn.xydata.pharmacy.websocket; import java.net.InetSocketAddress; import org.java_websocket.WebSocket;
import org.java_websocket.WebSocketImpl;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer; public class WebServer extends WebSocketServer {
public WebServer(int port) {
super(new InetSocketAddress(port));
} public WebServer(InetSocketAddress address) {
super(address);
} @Override
public void onOpen(WebSocket conn, ClientHandshake handshake) {
// ws连接的时候触发的代码,onOpen中我们不做任何操作
System.out.println("onOpen");
} @Override
public void onClose(WebSocket conn, int code, String reason, boolean remote) {
//断开连接时候触发代码
userLeave(conn);
System.out.println(reason);
System.out.println("onClose");
} @Override
public void onMessage(WebSocket conn, String message) {
System.out.println(message);
System.out.println("onMessage");
if(null != message){
String userName = message.replaceFirst("online", message);//用户名
userJoin(conn,userName);//用户加入
} } @Override
public void onError(WebSocket conn, Exception ex) {
//错误时候触发的代码
System.out.println("on error");
ex.printStackTrace();
}
/**
* 去除掉失效的websocket链接
* @param conn
*/
private void userLeave(WebSocket conn){
WsPool.removeUser(conn);
}
/**
* 将websocket加入用户池
* @param conn
* @param userName
*/
private void userJoin(WebSocket conn,String userName){
WsPool.addUser(userName, conn);
} // public void start() {
// if( selectorthread != null )
// throw new IllegalStateException( getClass().getName() + " can only be started once." );
// new Thread( this ).start();;
// } // public static void main(String args[]){
// WebSocketImpl.DEBUG = false;
// int port = 8887; // 端口
// WsServer s = new WsServer(port);
// s.start();
// } @Override
public void onStart() {
System.out.println("onstart");
} }
3、WsPool.java
package cn.xydata.pharmacy.websocket; import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set; import org.java_websocket.WebSocket; public class WsPool {
private static final Map<WebSocket, String> wsUserMap = new HashMap<WebSocket, String>(); /**
* 通过websocket连接获取其对应的用户
*
* @param conn
* @return
*/
public static String getUserByWs(WebSocket conn) {
return wsUserMap.get(conn);
} /**
* 根据userName获取WebSocket,这是一个list,此处取第一个
* 因为有可能多个websocket对应一个userName(但一般是只有一个,因为在close方法中,我们将失效的websocket连接去除了)
*
* @param user
*/
public static WebSocket getWsByUser(String userName) {
Set<WebSocket> keySet = wsUserMap.keySet();
synchronized (keySet) {
for (WebSocket conn : keySet) {
String cuser = wsUserMap.get(conn);
if (cuser.equals(userName)) {
return conn;
}
}
}
return null;
} /**
* 向连接池中添加连接
*
* @param inbound
*/
public static void addUser(String userName, WebSocket conn) {
wsUserMap.put(conn, userName); // 添加连接
} /**
* 获取所有连接池中的用户,因为set是不允许重复的,所以可以得到无重复的user数组
*
* @return
*/
public static Collection<String> getOnlineUser() {
List<String> setUsers = new ArrayList<String>();
Collection<String> setUser = wsUserMap.values();
for (String u : setUser) {
setUsers.add(u);
}
return setUsers;
} /**
* 移除连接池中的连接
*
* @param inbound
*/
public static boolean removeUser(WebSocket conn) {
if (wsUserMap.containsKey(conn)) {
wsUserMap.remove(conn); // 移除连接
return true;
} else {
return false;
}
} /**
* 向特定的用户发送数据
*
* @param user
* @param message
*/
public static void sendMessageToUser(WebSocket conn, String message) {
if (null != conn && null != wsUserMap.get(conn)) {
conn.send(message);
}
} /**
* 向所有的用户发送消息
*
* @param message
*/
public static void sendMessageToAll(String message) {
Set<WebSocket> keySet = wsUserMap.keySet();
synchronized (keySet) {
for (WebSocket conn : keySet) {
String user = wsUserMap.get(conn);
if (user != null) {
conn.send(message);
}
}
}
} }
4、WSServer.java
package cn.xydata.pharmacy.websocket; import java.io.UnsupportedEncodingException;
import java.util.Collection; import org.java_websocket.WebSocket;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; //@ServerEndpoint注解中的内容是用户客户端websocket的连接url,例如ws://127.0.0.1:80/websocket/ws,
//结构形式为“ws://ip:端口/项目名/指定的url”
@Controller
@RequestMapping(value="WSServer")
public class WSServer { // @SystemControllerLog(description="添加用户信息")
// @RequestMapping(value="addParticipant",method = RequestMethod.POST)
// @ResponseBody()
// public Object addParticipant(HttpServletRequest request,
// HttpServletResponse response) {
// Map<String,Object> result = new HashMap<String,Object>();
//
// result.put("success", "500");
// return result;
// } @ResponseBody
@RequestMapping("sendWs")
public String sendWs(String message) throws Exception {
message = new String(message.getBytes("ISO-8859-1"),"UTF-8");
WsPool.sendMessageToAll(message);
return message;
} @ResponseBody
@RequestMapping("sendWsOne")
public String sendWsOne() {
Collection<String> conns = WsPool.getOnlineUser();
System.out.println(conns + "sendWsOne");
return "123";
} }
另需两个jar包:
javax.websocket-api-1.1.jar
Java-WebSocket-1.3.7.jar
在web.xml中配置过滤器如下:
<filter>
<filter-name>startFilter</filter-name>
<filter-class>StartFilter.java路径</filter-class>
</filter>
怎么引用?一段代码即可:
WsPool.sendMessageToAll(p.getRealName()+","+p.getPosition()+","+mp.getSeatNo());
客户端怎么弄?
var ws = new WebSocket("ws://180.76.236.11:6005"); //握手协议,服务器ip地址以及服务器提供给WebSocket进程端口,与StartFilter.java中startWebsocketInstantMsg方法内的端口保持一致
ws.onopen = function(){
ws.send("online-hello");
console.log("连接...")
}
//处理服务器发送来的数据
ws.onmessage = function(e){
var text = e.data;
var arr = text.split(',');
sign(arr[0],arr[1],arr[2]); //sign函数的作用是将从服务器发送来的参会人员信息显示在欢迎屏
}
ws.onclose = function(){
console.log("连接关闭");
}
ws.onerror = function(){
console.log('连接失败');
}
SSM框架WebSocket配置的更多相关文章
- ssm框架之配置日志系统打印到控制台与指定文件
前提: 0:ssm框架已经搭建并且成功运行 1.maven环境配置成功 2.tomcat配置成功,并且配置本机的tomcat环境变量 内容: 0.导入所需要的jar包 <!-- 配置log4j日 ...
- SSM框架的配置Spring+Springmvc +Mybatis
ssm框架是由spring mvc +spring+mybatis组成 快速阅读 通过spring的配置文件spring.xml,在servlet中指定spring mvc的配置文件spring-mv ...
- SSM框架初始配置
1 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="h ...
- ssm框架文件配置
1 简介 Spring MVC (web level),采取 MVC 架构,意图取代麻烦的 Servlet 写法,简化 web 层 MyBatis (dao level),意图取代 jdbc 操作数据 ...
- SSM框架的配置整合(包含配置文件代码)
由于SSM框架学习都要去网上或者以前的项目拷贝相同的代码,所以我在此把自己用到的配置文件全放在这里,帮助自己,帮助别人 首先开始前导入依赖和处理静态资源导出问题 <dependencies> ...
- ssm框架整合配置,用maven配置依赖jar包
1.创建maven project 首先在pom.xml中指定工程所依赖的jar包 <project xmlns="http://maven.apache.org/POM/4.0.0& ...
- SSM框架的配置
主要是这三个配置文件 web.xml(用来加载和初始化下面的配置文件) applicationcontet.xml(就是Spring的配置文件,一般包括声明式失误等等AOP) Sprimgmvc,xm ...
- 整合最优雅SSM框架:SpringMVC + Spring + MyBatis
我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教学课堂中,也会把SSH作为最核心的教学内容. 但是,我们在实际应用中发现,SpringMVC可以完全替代Struts,配 ...
- 最优雅SSM框架:SpringMVC + Spring + MyBatis
在写代码之前我们先了解一下这三个框架分别是干什么的? 相信大以前也看过不少这些概念,我这就用大白话来讲,如果之前有了解过可以跳过这一大段,直接看代码! SpringMVC:它用于web层,相当于con ...
随机推荐
- Linux修改信息
修改时间 sudo date -s MM/DD/YY //修改日期 sudo date -s hh:mm:ss //修改时间 在修改时间以后,修改硬件CMOS的时间 sudo hwclock --sy ...
- Python 学习笔记之random 模块
要使用Random 模块里的一些随机数方法需要先导入random 模块. 下面是几种常用的随机数方法: 以生成随机8位密码,包括大小写字母,数字为例 pwd = ''.join(random.samp ...
- SpringMVC整合ActiveMQ
spring activeMq 配置 <!-- ActiveMQ 连接工厂 --> <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服 ...
- python 字符串的一些操作
name = "my \tname is {name} and i am {year} old" print(name.capitalize()) #将首字母都大写 print(n ...
- win 7 64 安装 tensorflow
1:安装 python 3.5 2. 安装 pip 3: 安装 tensorflow 4,demo
- nginx添加sticky cookie 分流模块
需要下载nginx源码和sticky,在nginx配置文件中添加sticky模块,然后重新编译nginx. #准备安装基础环境:yum install gcc openssl-devel pcre-d ...
- js小工具---本地图片转换为base64编码数据
今天用jmeter对图片对比进行性能测试,post请求为json请求,图片为Base64编码后的图片数据.所以需要将一张本地图片生成base64编码,找到一个js小工具,记录在这儿便于以后复用. 效果 ...
- JSON.stringify without quotes on properties?
https://stackoverflow.com/questions/11233498/json-stringify-without-quotes-on-properties/11233515 va ...
- vi重要操作指令
[Ctrl] + [f] 萤幕『向下』移动一页,相当于[Page Down]按键( 常用 ) [Ctrl] + [b] 萤幕『向上』移动一页,相当于[Page Up]按键( 常用 ) 0 或功能键[H ...
- Windows Update error 80070003
上次更新完成一半,这次更新便会出错.办法:删除上次更新残余文件. 删除Windows 用于标识计算机更新的临时文件.需要先停止Windows Update 服务: 在开始菜单的“搜索程序和文件”框输入 ...