package
org.xdemo.example.websocket.websocket;
import
java.io.IOException;
import
java.text.SimpleDateFormat;
import
java.util.Date;
import
java.util.HashMap;
import
java.util.Iterator;
import
java.util.Map;
import
java.util.Map.Entry;
import
org.springframework.stereotype.Component;
import
org.springframework.web.socket.CloseStatus;
import
org.springframework.web.socket.TextMessage;
import
org.springframework.web.socket.WebSocketHandler;
import
org.springframework.web.socket.WebSocketMessage;
import
org.springframework.web.socket.WebSocketSession;
import
org.xdemo.example.websocket.entity.Message;
import
com.google.gson.Gson;
import
com.google.gson.GsonBuilder;
/**
* Socket处理器
*
* @author Goofy
* @Date 2015年6月11日 下午1:19:50
*/
@Component
public
class
MyWebSocketHandler
implements
WebSocketHandler {
public
static
final
Map<Long, WebSocketSession> userSocketSessionMap;
static
{
userSocketSessionMap =
new
HashMap<Long, WebSocketSession>();
}
/**
* 建立连接后
*/
public
void
afterConnectionEstablished(WebSocketSession session)
throws
Exception {
Long uid = (Long) session.getAttributes().get(
"uid"
);
if
(userSocketSessionMap.get(uid) ==
null
) {
userSocketSessionMap.put(uid, session);
}
}
/**
* 消息处理,在客户端通过Websocket API发送的消息会经过这里,然后进行相应的处理
*/
public
void
handleMessage(WebSocketSession session, WebSocketMessage<?> message)
throws
Exception {
if
(message.getPayloadLength()==
0
)
return
;
Message msg=
new
Gson().fromJson(message.getPayload().toString(),Message.
class
);
msg.setDate(
new
Date());
sendMessageToUser(msg.getTo(),
new
TextMessage(
new
GsonBuilder().setDateFormat(
"yyyy-MM-dd HH:mm:ss"
).create().toJson(msg)));
}
/**
* 消息传输错误处理
*/
public
void
handleTransportError(WebSocketSession session,
Throwable exception)
throws
Exception {
if
(session.isOpen()) {
session.close();
}
Iterator<Entry<Long, WebSocketSession>> it = userSocketSessionMap
.entrySet().iterator();
while
(it.hasNext()) {
Entry<Long, WebSocketSession> entry = it.next();
if
(entry.getValue().getId().equals(session.getId())) {
userSocketSessionMap.remove(entry.getKey());
System.out.println(
"Socket会话已经移除:用户ID"
+ entry.getKey());
break
;
}
}
}
/**
* 关闭连接后
*/
public
void
afterConnectionClosed(WebSocketSession session,
CloseStatus closeStatus)
throws
Exception {
System.out.println(
"Websocket:"
+ session.getId() +
"已经关闭"
);
Iterator<Entry<Long, WebSocketSession>> it = userSocketSessionMap
.entrySet().iterator();
while
(it.hasNext()) {
Entry<Long, WebSocketSession> entry = it.next();
if
(entry.getValue().getId().equals(session.getId())) {
userSocketSessionMap.remove(entry.getKey());
System.out.println(
"Socket会话已经移除:用户ID"
+ entry.getKey());
break
;
}
}
}
public
boolean
supportsPartialMessages() {
return
false
;
}
/**
* 给所有在线用户发送消息
*
* @param message
* @throws IOException
*/
public
void
broadcast(
final
TextMessage message)
throws
IOException {
Iterator<Entry<Long, WebSocketSession>> it = userSocketSessionMap
.entrySet().iterator();
while
(it.hasNext()) {
final
Entry<Long, WebSocketSession> entry = it.next();
if
(entry.getValue().isOpen()) {
new
Thread(
new
Runnable() {
public
void
run() {
try
{
if
(entry.getValue().isOpen()) {
entry.getValue().sendMessage(message);
}
}
catch
(IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
}
/**
* 给某个用户发送消息
*
* @param userName
* @param message
* @throws IOException
*/
public
void
sendMessageToUser(Long uid, TextMessage message)
throws
IOException {
WebSocketSession session = userSocketSessionMap.get(uid);
if
(session !=
null
&& session.isOpen()) {
session.sendMessage(message);
}
}
}