1. 웹소켓 : 23.01.18
1) 웹 소켓이란?
-
소켓이라는 것은 송신부와 수신부에서 최소한의 정보 2가지를 묶어서 보내준다.(IP, 버퍼에 붙여지는 식별해주는 Port)
-
이 2가지가 있어야 데이터의 송수신을 식별할 수 있고 이를 소켓이라고 부른다.
-
마지막으로 URL이 필요하다.(리소스에 해당하는 식별자) 이제는 URL을 통해서 데이터를 주고 받는다.
-
uri도 접속자의 식별자로 사용된다.
-
하지만, 나중에 서버쪽에서 데이터를 분배하는 것이 어려울 수도 있다.***
2) 소켓 예제
-
소켓은 TCP/IP에 의해서 설정이 되어서 즉, 사서함이 따로 준비된다.
-
모든 클라이언트들이 개별적인 사서함(전용 포트들)들을 가지고 있다.
-
TCP/IP는 연결이 끊어지면, 사서함이 사라진다.(전용 포트이면서 전용 사서함)
-
UDP는 공용 포트인 공용 사서함을 의미한다.
-
서버 포트라는 것도 추가적으로 존재한다.
-
예시 :
window.addEventListener("load",function(){
let inputSend = this.document.querySelector(".input-send");
let btnSend = this.document.querySelector(".btn-send");
let btnConn = this.document.querySelector(".btn-conn");
btnConn.onclick = function(e){
// WebSocket 연결 생성
let username = 'newlec';
const socket = new WebSocket(`ws://localhost:8080/chat/${username}`);
// 연결이 열리면
socket.addEventListener('open', function (event) {
socket.send('Hello Server!');
});
// 메시지 수신
socket.addEventListener('message', function (event) {
console.log('Message from server ', event.data);
});
console.log("connect ...");
}
btnSend.onclick = function(e){
let msg = inputSend.value;
console.log(msg);
}
});
3) 소켓 예제 : 이클립스와 연동
-
실행 순서 :
-
이클립스에서 톰캣 서버 실행하고 vscode도 서버 실행한다
-
실행된 vscode의 html url에서 서버 연결 버튼 클릭 후 메세지 입력 후 전송 버튼을 누르면, 이클립스에서 메세지가 출력된다.
-
window.addEventListener("load",function(){
let inputSend = this.document.querySelector(".input-send");
let btnSend = this.document.querySelector(".btn-send");
let btnConn = this.document.querySelector(".btn-conn");
let socket = null; // 전체 범위에서 사용
btnConn.onclick = function(e){
// WebSocket 연결 생성
let username = 'newlec'; // localhost, 80, chat만 설정!
socket = new WebSocket(`ws://ict.newlecture.com/chat`); // 변수 초기화 삭제!!
// 연결이 열리면
socket.addEventListener('open', function (event) {
socket.send('Hello Server!');
});
// 메시지 수신
socket.addEventListener('message', function (event) {
//console.log('Message from server ', event.data);
console.log(event.data); // 데이터가 바로 추력
});
// console.log("connect ...");
}
btnSend.onclick = function(e){
let msg = inputSend.value;
console.log(msg);
if(socket)
socket.send(msg); // 메세지를 받는 경우!
}
});
-
다른 ip로 웹 소켓을 연결하는 과정 :
-
메세지를 모두에게 다 뿌리면 채팅이 된다. 메세지를 보낸 사람한테 보내면 에코 기능만 될 뿐이다. 이러한 데이터를 동기식으로 변경해주자!
-
이미 들어온 사람이 있는데 나가버리면 그 자리를 지워줘야 한다!! 지우지 않으면, 서버가 끊어지는 일이 발생하고 다음사람이 못 들어 온다.
-
package com.newlecture.web;
import java.util.concurrent.CopyOnWriteArrayList;
import jakarta.websocket.OnClose;
import jakarta.websocket.OnMessage;
import jakarta.websocket.OnOpen;
import jakarta.websocket.Session;
import jakarta.websocket.server.ServerEndpoint;
// 왜 나는 슬래시를 빼야하는가??(vscode의 url과 eclipse의 url가 터진다.)
//웹프로젝트에서 만든다!
@ServerEndpoint("/chat") // ServerEndpoin라는 어노테이션으로 웹소켓입니다. , {}는 변수처럼 끌어다가 사용할 수 있다.
public class ChatServer {
// 클라이언트인 vscode에서 localhost, 80, chat만 설정!
// 아무것도 여기에 안쓰면 에러가 발생한다!
// ** 줄세워주는 동기화 기능!!
static CopyOnWriteArrayList<Session> sessions = new CopyOnWriteArrayList<>();
// ** OPEN : 서버 연결
@OnOpen
public void openHandler(Session session) {
System.out.println("connected from "); // 누구한테 연락이 왔는지 알 수가 없다.
}
// ** MESSAGE(session은 연결되었는지, message 메세지 내용까지)
@OnMessage
public void messageHandler(Session session, String message) {
System.out.println(message); // 메세지를 모두에게 다 뿌리면 채팅이 된다.
// 메세지를 보낸 사람한테 보내면 에코 기능만 될 뿐이다.
for(Session s : sessions) {
s.getAsyncRemote().sendText(message); // 이미 들어온 사람이 있는데 나가버리면 그 자리를 지워줘야 한다!!
// 지우지 않으면, 서버가 끊어지는 일이 발생하고 다음사람이 못 들어 온다.
}
}
// ** CLOSE : 그 배열 자리를 지우는 부분!!
@OnClose
public void closeHandler(Session session) {
sessions.remove(session); // 채팅방에서 나가는 사람을 지우자!(이렇게 하면 더이상 서버 끊기는 일이 사라진다!)
}
}
2. 23.01.18
1) 브라우저 디버깅 모드
-
개발자 도구에서 네트워크 탭에서 캐시 사용 중지하면 새로고침 시, 새로고침 에러 없어짐.(캐시 쌓이는 것)
-
네트워크탭의 응답탭에서 디버깅 가능!!
-
window 메서드 중에서 setInterval() 사용하여 계속 컴파일 시, 내용이 겹치는 경우가 생겨서 setTimeClear()로 없애주기!!(MDN 참고)