一:项目
二 pom依赖
<dependencies>
<!-- Servlet API -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- websocket -->
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
三 代码
WebSocketDemo.java
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import javax.websocket.EncodeException;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* websocket例子
* https://github.com/dunwu/javaee-notes/tree/master/codes/websocket
* @author slayng7
*
*/
@ServerEndpoint(value = "/websocketTest/{userId}")
public class WebSocketDemo {
private static Logger logger = LoggerFactory.getLogger(WebSocketDemo.class);
private static String userId;
static Map<String, Set<Session>> userSessionMap = new ConcurrentHashMap<>();
// private static Map userSessionMap = new ConcurrentHashMap<Long,
// Set<Session>>();
// 连接时执行
@OnOpen
public void onOpen(@PathParam("userId") String userId, Session session) throws IOException {
this.userId = userId;
logger.info("新连接:{}", userId);
System.out.println("新连接:" + userId);
// 如果是新 Session,记录进 Map
/* boolean isNewUser = true;
Iterator i = userSessionMap.entrySet().iterator();
while (i.hasNext()) {
Map.Entry entry = (Map.Entry) i.next();
String key = (String) entry.getKey();
if (key.equals(userId)) {
userSessionMap.get(key).add(session);
isNewUser = false;
break;
}
}
if (isNewUser) {
Set<Session> sessions = new HashSet<>();
sessions.add(session);
userSessionMap.put(userId, sessions);
}*/
}
// 关闭时执行
@OnClose
public void onClose(Session session) {
logger.info("连接:{} 关闭", this.userId);
System.out.println("连接:" + this.userId + " 关闭");
/* for (Set<Session> item : userSessionMap.values()) {
if (item.contains(session)) {
// 删除连接 session
item.remove(session);
// 如果 userId 对应的 session 数为 0 ,删除该 userId 对应的记录
if (0 == item.size()) {
userSessionMap.values().remove(item);
}
break;
}
}*/
}
// 收到消息时执行
@OnMessage
public void onMessage(String message, Session session) throws IOException {
logger.info("收到用户{}的消息{}", this.userId, message);
System.out.println("收到用户{" + this.userId + "}的消息{" + message + "}");
session.getBasicRemote().sendText("收到 " + this.userId + " 的消sss息 "); // 回复用户
session.getBasicRemote().sendText("收到 " + this.userId + " 的消bbbb息 "); // 回复用户
}
// 连接错误时执行
@OnError
public void onError(Session session, Throwable error) {
logger.info("用户id为:{}的连接发送错误", this.userId);
System.out.println("用户id为:{" + this.userId + "}的连接发送错误");
error.printStackTrace();
}
/**
* 发送广播消息
*
* @param message
*/
public static void sendAll(String message) {
logger.info("SendAll: {}", message);
for (Set<Session> groups : userSessionMap.values()) {
for (Session session : groups) {
try {
session.getBasicRemote().sendObject(message);
} catch (IOException e) {
logger.error(e.toString());
} catch (EncodeException e) {
logger.error(e.toString());
}
}
}
}
public static void send(String userId, String message) {
for (String id : userSessionMap.keySet()) {
if (id.equals(userId)) {
for (Session session : userSessionMap.get(userId)) {
try {
session.getBasicRemote().sendObject(message);
logger.info("SendAll: {}", message);
} catch (Exception e) {
logger.error(e.toString());
}
}
}
}
}
}
log4j.properties
log4j.rootCategory=INFO,stdout,logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c][%t]%L - <%m>%n
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=logs/sparkstream.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c][%t]%L - <%m>%n
log4j.logger.org.hibernate=INFO
log4j.logger.org.hibernate.SQL=ERROR
log4j.logger.org.hibernate.tool=ERROR
log4j.logger.org.hibernate.cache=ERROR
log4j.logger.net.sf.ehcache=ERROR
log4j.logger.com.iflytek=INFO
log4j.logger.com.iflytek.iframework=ERROR
log4j.logger.com.iflytek.jsec.cac=ERROR
log4j.logger.com.iflytek.proxool=INFO
log4j.logger.org.springframework=INFO
log4j.logger.org.springframework.jdbc.core.JdbcTemplate=INFO
log4j.logger.org.jasig.cas=ERROR
log4j.logger.org.jasig.cas.client.util.CommonUtils=ERROR
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
websocket Demo---- user000 <br />
<input id="text" type="text" />
<button οnclick="send()"> Send </button>
<button οnclick="closeWebSocket()"> Close </button>
<div id="message"> </div>
<script type="text/javascript">
//判断当前浏览器是否支持WebSocket
if('WebSocket' in window){
websocket = new WebSocket("ws://localhost:8080/websocket/websocketTest/user000");
console.log("link success")
}else{
alert('Not support websocket')
}
//连接发生错误的回调方法
websocket.onerror = function(){
setMessageInnerHTML("error");
};
//连接成功建立的回调方法
websocket.onopen = function(event){
setMessageInnerHTML("open");
}
console.log("-----")
//接收到消息的回调方法
websocket.onmessage = function(event){
setMessageInnerHTML(event.data);
}
//连接关闭的回调方法
websocket.onclose = function(){
setMessageInnerHTML("close");
}
//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function(){
websocket.close();
}
//将消息显示在网页上
function setMessageInnerHTML(innerHTML){
document.getElementById('message').innerHTML += innerHTML + '<br/>';
}
//关闭连接
function closeWebSocket(){
websocket.close();
}
//发送消息
function send(){
var message = document.getElementById('text').value;
websocket.send(message);
}
</script>
</body>
</html>