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配置的更多相关文章

  1. ssm框架之配置日志系统打印到控制台与指定文件

    前提: 0:ssm框架已经搭建并且成功运行 1.maven环境配置成功 2.tomcat配置成功,并且配置本机的tomcat环境变量 内容: 0.导入所需要的jar包 <!-- 配置log4j日 ...

  2. SSM框架的配置Spring+Springmvc +Mybatis

    ssm框架是由spring mvc +spring+mybatis组成 快速阅读 通过spring的配置文件spring.xml,在servlet中指定spring mvc的配置文件spring-mv ...

  3. SSM框架初始配置

    1 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="h ...

  4. ssm框架文件配置

    1 简介 Spring MVC (web level),采取 MVC 架构,意图取代麻烦的 Servlet 写法,简化 web 层 MyBatis (dao level),意图取代 jdbc 操作数据 ...

  5. SSM框架的配置整合(包含配置文件代码)

    由于SSM框架学习都要去网上或者以前的项目拷贝相同的代码,所以我在此把自己用到的配置文件全放在这里,帮助自己,帮助别人 首先开始前导入依赖和处理静态资源导出问题 <dependencies> ...

  6. ssm框架整合配置,用maven配置依赖jar包

    1.创建maven project 首先在pom.xml中指定工程所依赖的jar包 <project xmlns="http://maven.apache.org/POM/4.0.0& ...

  7. SSM框架的配置

    主要是这三个配置文件 web.xml(用来加载和初始化下面的配置文件) applicationcontet.xml(就是Spring的配置文件,一般包括声明式失误等等AOP) Sprimgmvc,xm ...

  8. 整合最优雅SSM框架:SpringMVC + Spring + MyBatis

    我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教学课堂中,也会把SSH作为最核心的教学内容. 但是,我们在实际应用中发现,SpringMVC可以完全替代Struts,配 ...

  9. 最优雅SSM框架:SpringMVC + Spring + MyBatis

    在写代码之前我们先了解一下这三个框架分别是干什么的? 相信大以前也看过不少这些概念,我这就用大白话来讲,如果之前有了解过可以跳过这一大段,直接看代码! SpringMVC:它用于web层,相当于con ...

随机推荐

  1. 玩转DOM遍历——用NodeIterator实现getElementById,getElementsByTagName方法

    先声明一下DOM2中NodeIterator和TreeWalker这两类型真的只是用来玩玩的,因为性能不行遍历起来超级慢,在JS中基本用不到它们,除了<高程>上有两三页对它的讲解外,谷歌的 ...

  2. C的指针疑惑:C和指针13(高级指针话题)上

    int *f(); f为一个函数,返回值类型是一个指向整形的指针. int (*f)(); 两对括号,第二对括号是函数调用操作符,但第一对括号只起到聚组的作用. f为一个函数指针,它所指向的函数返回一 ...

  3. SMO算法精解

    本文参考自:https://www.zhihu.com/question/40546280/answer/88539689 解决svm首先将原始问题转化到对偶问题,而对偶问题则是一个凸二次规划问题,理 ...

  4. Extjs添加行双击事件

    var grid = new Ext.grid.GridPanel({ store: store, trackMouseOver: false, disableSelection: true, aut ...

  5. append和extend区别

    append append方法用于在列表末尾添加新的对象 它是把添加的对象当成一个整体追加到末尾 a=[1,23,436] b=[] b.append(a) print(b)""& ...

  6. php array_mutisort

    PHP中array_multisort可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序. 关联(string)键名保持不变,但数字键名会被重新索引. 输入数组被当成一个表的列并以 ...

  7. window7主题破解与恢复(复制)

    window7主题破解与恢复 1 2 3 分步阅读 windows7主题破解后可以换自己喜欢的主题,但也有一些弊端.这里帮助打家破解与恢复. 工具/原料 UniversalThemePatcher.e ...

  8. 高并发下hystrix熔断超时及concurrent.RejectedExecutionException: Rejected command because thread-pool queueSize is at rejection threshold问题

    我的一个项目并发200+,观察服务器的日志发现出现了大量的熔断超时偶尔会闪现出RejectedExecutionException: Rejected command because thread-p ...

  9. HackerRank - candies 【贪心】

    HackerRank - candies [贪心] Description Alice is a kindergarten teacher. She wants to give some candie ...

  10. SQL注入漏洞有哪些

    SQL注入攻击是当今最危险.最普遍的基于Web的攻击之一.所谓注入攻击,是攻击者把SQL命令插入到Web表单的输入域页面请求的查询字符串中,如果要对一个网站进行SQL注入攻击,首先需要找到存在SQL注 ...