ServerHandler.java
3.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package com.bsth.socket.handler;
import java.io.IOException;
import java.util.Date;
import com.bsth.socket.protocol.Message01;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.transport.socket.SocketSessionConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.bsth.socket.manager.MessageProcessor;
import com.bsth.socket.manager.MessageSessionManager;
import com.bsth.socket.protocol.IMessageBody;
import com.bsth.socket.protocol.Message;
/**
* @author Hill
*/
@Service
public class ServerHandler extends IoHandlerAdapter{
private final static Logger log = LoggerFactory.getLogger(ServerHandler.class);
@Autowired
private MessageProcessor processor;
public MessageProcessor getProcessor() {
return this.processor;
}
@Override
public void sessionCreated(IoSession session) throws Exception {
SocketSessionConfig cfg = (SocketSessionConfig) session.getConfig();
cfg.setTcpNoDelay(true);
cfg.setSoLinger(0);
}
@Override
public void sessionOpened(IoSession session) throws Exception {
}
@Override
public void sessionClosed(IoSession session) throws Exception {
String deviceId = (String)session.getAttribute("deviceId");
if (deviceId != null && session == MessageSessionManager.getInstance().getSession(deviceId)) {
MessageSessionManager.getInstance().unregister(deviceId);
log.warn("vin:" + deviceId + "断开连接");
}
}
@Override
public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
log.warn("idle 关闭连接, vin " + session.getAttribute("deviceId") + " status " + status + ",lastIo:" + new Date(session.getLastIoTime()) + ",now:" + new Date(System.currentTimeMillis()));
session.closeNow();
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
if (cause instanceof IOException) {
log.warn("handler exceptionCaught 关闭连接,vin " + session.getAttribute("deviceId"));
}
log.error("MessageServerHandler捕获异常", cause);
}
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
Message msg = (Message)message;
IMessageBody body = msg.getMessageBody();
String sDeviceId = (String)session.getAttribute("deviceId");
if (body != null) {
String vin = msg.getVin();
log.warn("msg.getVin():" + vin);
if (Message01.COMMAND == msg.getCommand()) {
if (sDeviceId == null) {
MessageSessionManager.getInstance().register(vin, session);
log.warn("vin:" + vin + "建立连接");
}
}
processor.process(msg);
} else {
log.warn("异常协议命令字:" + msg.getCommand());
if (sDeviceId == null) {
log.warn("未登入");
}
}
}
@Override
public void messageSent(IoSession session, Object message) throws Exception {
}
}