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 ...
随机推荐
- OpenSSL拒绝服务漏洞(CNVD-2016-01479)
更新OpenSSL版本. [root@nginx ~]# openssl version -a OpenSSL 1.0.1e-fips 11 Feb 2013 built on: Wed Mar 22 ...
- java中使用MD5对密码进行加密
import org.springframework.security.authentication.encoding.MessageDigestPasswordEncoder; import org ...
- 前端调试利器——BrowserSync
此处记录一下踩过的坑 之前看的这个地址:http://www.browsersync.cn/ 也就是 BrowserSync的官网上面关于代理服务器的例子不管怎么试都不行 请看下例子 browser- ...
- XDU 1130 (快速幂)
题目大意:原题链接 解题思路:sum((p+i*d)*C(n,i))=sum(p*C(n,i)+d*i*C(n,i)) ; 又因为i*C(n,i)=n*C(n-1,i-1) 所以sum((p+i*d) ...
- Django 分页查询并返回jsons数据,中文乱码解决方法
Django 分页查询并返回jsons数据,中文乱码解决方法 一.引子 Django 分页查询并返回 json ,需要将返回的 queryset 序列化, demo 如下: # coding=UTF- ...
- NGUI混合FingerGesture《卷一》 统一坐标
问题背景 使用FingerGesture 获取触碰点2D坐标, 将该2D坐标赋值给NGUI元素,发现位置出现偏差. 排查思路 1:NGUI的 (0,0,0)默认位置是在屏幕正中心.而FingerGes ...
- Hbase1.0伪分布式集群启动失败问题
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl/p/7340681.html 转载请注明出处 最近抽空折腾自己的虚拟机环境时启动伪分布式Hbase集群一直失败, ...
- Android事件处理下(按键、触摸屏和滚动球的一些实现细节)
http://www.cnblogs.com/andtt/articles/2145563.html 对于按键事件,调用mDevices[i]->layoutMap->map进行映射.映射 ...
- 2017年4月16日 一周AnswerOpenCV佳作赏析
2017年4月16日 一周AnswerOpenCV佳作赏析 1.HelloHow to smooth edge of text in binary image, based on threshold. ...
- 20135302魏静静——linux课程第六周实验及总结
linux课程第六周实验及总结 实验及学习总结 1.进程描述符task_struct数据结构 进程的作用: 将信号.进程间通信.内存管理和文件系统联系起来 操作系统的三大功能: 进程管理.内存管理.文 ...