티스토리 뷰

IT

springboot websocket server

I$ON_H 2018. 10. 22. 10:23


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@SpringBootApplication
public class FisMonitoringApplication {
    private static final Logger logger = LoggerFactory.getLogger(FisMonitoringApplication.class);
 
    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(FisMonitoringApplication.class, args);
        //
        /**
         * @description Jetty Websocket Server Start 
         * **/
        MonitorServer jettyServer = ctx.getBean(MonitorServer.class);  
        jettyServer.start();
    }
}
 
cs



Monitoring에서 jettyServer 로 monitorServer를 메모리상에 올립니다.


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
 
@Service
public class MonitorServer {
    private final Logger logger = LoggerFactory.getLogger(MonitorServer.class);
    
    // class변수 기준- 메소드안에 있는 것 or 메소드 안에 자주 쓰이는 것 (?)
    private Server server;
    private ServerConnector connector;
    private final int PORT = 13702;
    private ServletContextHandler context;
    private ServletHolder holderEvents;
    
    public MonitorServer(){
        this.server = new Server();
        this.connector = new ServerConnector(server);
        connector.setPort(PORT);
    }
    
    public void start(){
        this.server.addConnector(connector);
        
        // '/' 에서 이 응용 프로그램의 기본 응용 프로그램 'context'를 설정
        context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");
        server.setHandler(context);    
        
        // ServletHolder 인스턴스 생성해 이벤트를 핸들할 경로를 설정 >>> ws://localhost:13702/fiopr/*
        holderEvents = new ServletHolder("fiopr", MonitorServerServlet.class);
        context.addServlet(holderEvents, "/fiopr/*");
        
        try{
            server.start();
            server.dump(System.err);    //예외처리 메시지
            server.join();
        } catch(Throwable t){
            t.printStackTrace(System.err);
        }
    }
}
 
cs


server를 start를 하고 dump를 통한 실행될때 오류가 발생시 그 오류사항에 맞는 메세지를 띄어줍니다.

그리고 servletContextHandler


1
2
3
4
5
6
7
8
9
 
@SuppressWarnings("serial"//serial 원인 없애준다.
public class MonitorServerServlet extends WebSocketServlet{
    @Override
    public void configure(WebSocketServletFactory factory){
        factory.register(MonitorServerHandler.class);
    }
}
 
cs



servlet에서 serverHandler로 websocket 서버를 jsp와 연결을 맺고, 그 이후 요청받은 메세지가 같다면, 해당 데이터를 보내주는 부분이 webSocketTextHandler입니다.



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
 
public class MonitorServerHandler extends WebSocketAdapter{
    private final Logger logger = LoggerFactory.getLogger(MonitorServerHandler.class);
    
    @Override
    public void onWebSocketConnect(Session session){
        super.onWebSocketConnect(session);
        logger.info("Socket Connected: " + session.getRemoteAddress().getAddress());
    }
 
    @Override
    public void onWebSocketText(String message) {
        super.onWebSocketText(message);
        logger.info("Received TEXT message: " + message);
        
        WebSocketTextHandler msgDe = new WebSocketTextHandler();
        ResultSet set = new ResultSet();
        set = msgDe.MsgDecoder(message);
        
        try {    
            getRemote().sendString(CommonGlobalVariable.m_gson.toJson(set)); //client 응답
        } catch (IOException e) {
            logger.error("sendString Exception", e);
            e.printStackTrace();
        }
    }
    
    @Override
    public void onWebSocketClose(int statusCode, String reason){
        super.onWebSocketClose(statusCode,  reason);
        logger.info("Socket Closed: [" + statusCode + "] " + reason);
    }
    
    @Override
    public void onWebSocketError(Throwable cause){
        super.onWebSocketError(cause);
        cause.printStackTrace(System.err);
    }
}
 
cs





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
/ Client가 요청한 message를 parsing후 키 값에 맞는 data를 ResultSet의 형태로 돌려주는 Class
 
public class WebSocketTextHandler {
    private final Logger logger = LoggerFactory.getLogger(WebSocketTextHandler.class);
    
    private String cmd;
    private JSONObject jsonObject;        // class변수이유 > json파싱 부분에서 try-catch을 전체 해줘야댐
    private JSONParser jsonParser;
    private ResultSet set;
    
    public WebSocketTextHandler(){
        this.cmd="";
        this.jsonObject = new JSONObject();
        this.jsonParser = new JSONParser();
        this.set = new ResultSet();
    }
    
    public ResultSet MsgDecoder(String message){
        MonitorService fis = ApplicationContextHolder.getContext().getBean(MonitorService.class);
        List<ListVO> listVO = null;
        CntVO cntData = null;
        
        try{
            jsonObject = (JSONObject) jsonParser.parse(message);
            cmd = (String) jsonObject.get("cmd");
        } catch(ParseException e){
            logger.error("json parsing Exception", e);
            e.printStackTrace();
        }
        
        if(cmd.equals("equipStatus")){            //response    
            try{
                listVO = fis.selectList();          
                cntData = fis.selectCnt();
                set.setList(listVO);
                set.setCntData(cntData);
                set.setResultCode(200);
                set.setResultMsg("success");
            } catch(Exception e){
                logger.error("select list Exception", e);
                e.printStackTrace();
                set.setResultCode(300);
                set.setResultMsg("fail");
            }
        }
        return set;
    }
}
cs





순서를 보자면 


FisMonitoringApplication ->MonitorServer->MonitorServerServlet->MonitorServerHandler->WebSocketTextHandler  textHandler에서 필요한 데이터를 db에서 가져와 VO ,mapper,service,serviceimpl 을 가는 플로우입니다.

'IT' 카테고리의 다른 글

daum 지도 infowindow오류 해결방법  (0) 2018.10.22
AWS와 WEB과 WAS  (0) 2018.10.22
Springboot java- Bean,logger,context  (0) 2018.10.22
web socket polling 요청은 왜하는가??  (0) 2018.10.18
WEB SOCKET 연동 JAVASCRIPT  (0) 2018.10.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함