웹소켓 사용 법

단방향 통신인 HTTP로 timeout이 걸려 해당 작업을 완료 할 수 없어, web socket을 활용하는 방법에 대해 찾아보고 테스트해 보았다. 웹소켓 객체가 생성되고 메시지를 주고 받는 것까지 확인하였다.

  • pom.xml 수정 ( dependency 추가)

  • 웹소켓 java 추가 ( serverEndpoint에 요청 url 추가 )
import javax.websocket.RemoteEndpoint.Basic;

@Controller  
@ServerEndpoint(value="/echo.do")  
public class WebSocketChat {


@Autowired
private DiscountApiController discountApiController;

private static final List sessionList=new ArrayList();;  
private static final Logger logger = LoggerFactory.getLogger(WebSocketChat.class);  
public WebSocketChat() {  
// TODO Auto-generated constructor stub  
System.out.println("웹소켓(서버) 객체생성");  
}

@RequestMapping(value="/chat.do")  
public ModelAndView getChatViewPage(ModelAndView mav) {  
mav.setViewName("chat");  
return mav;  
}  
@OnOpen  
public void onOpen(Session session) {  
logger.info("Open session id:"+session.getId());  
try {  
final Basic basic=session.getBasicRemote();  
basic.sendText("Connection Established");  
}catch (Exception e) {  
// TODO: handle exception  
System.out.println(e.getMessage());  
}  
sessionList.add(session);  
}  
/\*

-   모든 사용자에게 메시지를 전달한다.
-   @param self
-   @param message
-   /  
    private void sendAllSessionToMessage(Session self,String message) {


      try {
          for(Session session : WebSocketChat.sessionList) {
              if(!self.getId().equals(session.getId())) {
                  session.getBasicRemote().sendText(message.split(",")[1]+" : "+message);


    }


          }
      }catch (Exception e) {
          // TODO: handle exception


    System.out.println(e.getMessage());  
    }  
    }

    @OnMessage  
    public void onMessage(Session session, String msg) throws IOException {


     클라이언트에서 fileName:파일명 형태로 파일 요청


    //String fileName = msg.substring(msg.indexOf(":")+1);  
    JSONObject jo = JSONObject.fromObject(msg);


System.out.println("request file : " + msg);  
System.out.println("source Type : " + jo.get("sourceType"));

 파일 객체 생성  
File file = new File(path+fileName);  
 파일을 담을 바이트 배열  
byte\[\] fileBytes = new byte\[(int)file.length()\];  
try( // 파일로 연결된 스트림 생성  
 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));  
 ){ // 바이트 배열에 파일 저장  
 bis.read(fileBytes);  
}

}


@OnError
public void onError(Throwable e,Session session) {

}

@OnClose
public void onClose(Session session) {  
logger.info("Session "+session.getId()+" has ended");  
sessionList.remove(session);  
}  
}
  • js파일 수정 ( 커넥션 요청 및 메시지 주고받기 )

let ws;  
$scope.opensocket = function(){  
if(ws!==undefined && ws.readyState!==WebSocket.CLOSED){  
console.log("WebSocket is already opened.");  
return;  
}  
//웹소켓 객체 만드는 코드  
var uriGet = window.location.origin;  
var uriGet2 = uriGet.substring(6);  
ws = new WebSocket("ws://" + uriGet2 + "/echo.do");


ws.onopen=function(event){
    if(event.data===undefined) return;
    console.log(event.data);

};

ws.onmessage=function(event){
    console.log(event.data);

};

/*ws.onmessage = function(message){
    // 메시지 echo
    console.log(message.data);
    ws.send(message.data);

    if(message.data === 'FILENAME'){
        //파일 이름 전송
        ws.send(filename);
    }else if(message.data === 'FILESIZE'){
        //파일 사이즈 전송
        ws.send(filesize);
    }else if(message.data ==='DATA'){
        //buffersize만큼 파일을 나누어 전송
        ws.send(file.slice(pos, pos+buffersize));
        pos = pos + buffersize;
        if(pos > filesize){
            pos = filesize;
        }
    }
}*/

ws.onclose=function(event){
    console.log("Connection closed");

};


}

$scope.send = function(params){  
var text = JSON.stringify(params);  
ws.send(text);  
text="";  
}

$scope.closeSocket = function(){  
ws.close();  
}

댓글

Designed by JB FACTORY