웹소켓 사용 법
- WEB/Spring
- 2021. 2. 10. 15:03
단방향 통신인 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();
}
'WEB > Spring' 카테고리의 다른 글
RESTful API 문서(#2) SpringBoot, Swagger 적용 (0) | 2022.02.20 |
---|---|
[IoC container, 생성자 주입] JAVA > Spring (0) | 2021.12.20 |
[JUnit] Junit 테스트, @RunWith, @ContextConfiguration 그리고 @SpringApplicationConfiguration (0) | 2021.01.21 |
Async 비동기 처리하기 (0) | 2020.12.16 |
[서버 물리 경로]절대 경로, 상대 경로 가져오기 (0) | 2020.12.10 |