JSP

JSP 웹소켓(WebSocket) 만들고 활용하기

PiccoBella 2023. 4. 15. 10:47

■ 소켓(Socket)이란?

 TCP/IP 기반 네트워크 통신에서 데이터 송수신의 마지막 접점을 말한다. 소켓통신은 이러한 소켓을 통해 서버-클라이언트간 데이터를 주고받는 양방향 연결 지향성 통신을 말한다. 소켓통신은 보통 지속적으로 연결을 유지하면서 실시간으로 데이터를 주고받아야 하는 경우에는 사용된다

소켓은 클라이언트 소켓과 서버 소켓으로 구분되며, 소켓간 통신을 위해서는 네트워크상에서 클라이언트와 서버에 해당되는 컴퓨터를 식별하기 위한 IP주소와 해당 컴퓨터내에서 현재 통신에 사용되는 응용프로그램을 식별하기 위한 포트번호가 사용된다.

 

 웹 소켓의 필요성

웹 소켓은 ws 프로토콜을 사용하여 client와 server 사이에 양방향 연결 스트림을 지속하여 통신할 수 있도록 해준다. 일반으로 채팅이나 구글 스프레드 시트 같이 서로 다른 상대방의 PC에서 실시간으로 통신을 해야하는 부분들에서 주로 사용된다.

 

4. 클라이언트 소켓 구현하기

 

1) 클라이언트 소켓 생성을 통한 서버접속
 Socket socket = new Socket("127.0.0.1", 8000);  // IP주소, 포트번호

 

2) 데이터 송수신을 위한 input/output 스트림 생성 
    InputStream in = socket.getInputStream( );
    OutputStream out = socket.getOutputStream( );

 

3) output 스트림을 통한 데이터 송신 (클라이언트 → 서버)
    String outputMessage = "보낼메시지";
    out.write(outputMessage.getBytes( ));
    out.flush( );

 

4) input 스트림을 통한 데이터 수신 (서버 → 클라이언트)
    byte[ ] inputData = new byte[100];
    int length = in.read(inputData);
    String inputMessage = new String(inputData, 0, length);

 

5) 통신 종료
    socket.close( );

 

서버단에서 어노테이션(@)를 이용하여 메소드를 구현하여주고,자바스크립트에서는 webSocket.opmessage와 같이 해당 어노테이션(@OnMessage)된 메소드를 호출합니다.

 

1) 서버

public class MyServer {
	public static void main(String[] args) {
		BufferedReader in = null;
		PrintWriter out = null;
		
		ServerSocket serverSocket = null;
		Socket socket = null;
		Scanner scanner = new Scanner(System.in);
		
		try {
			serverSocket = new ServerSocket(8000);
			
			System.out.println("[Server실행] Client연결대기중...");
			socket = serverSocket.accept();			// 연결대기

			System.out.println("Client 연결됨.");
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			out = new PrintWriter(socket.getOutputStream());
						
			while(true) {
				String inputMessage = in.readLine();	// 수신데이터 한줄씩 읽기	
				if ("quit".equalsIgnoreCase(inputMessage)) break;
				
				System.out.println("From Client: " + inputMessage);
				System.out.print("전송하기>>> ");
				
				String outputMessage = scanner.nextLine();
				out.println(outputMessage);
				out.flush();
				if ("quit".equalsIgnoreCase(outputMessage)) break;
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				scanner.close();		// Scanner 닫기
				socket.close();			// Socket 닫기
				serverSocket.close();		// ServerSocket 닫기
				System.out.println("연결종료");
			} catch (IOException e) {
				System.out.println("소켓통신에러");
			}
		}
	}
}

 

2) 클라이언트

public class MyClient {
	public static void main(String[] args) {
		BufferedReader in = null;
		PrintWriter out = null;
		
		Socket socket = null;
		Scanner scanner = new Scanner(System.in);
		
		try {
			socket = new Socket("127.0.0.1", 8000);
			
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			out = new PrintWriter(socket.getOutputStream());
			
			while(true) {
				System.out.print("전송하기>>> ");
				String outputMessage = scanner.nextLine();
				out.println(outputMessage);
				out.flush();
				if ("quit".equalsIgnoreCase(outputMessage)) break;
								
				String inputMessage = in.readLine();
				System.out.println("From Server: " + inputMessage);
				if ("quit".equalsIgnoreCase(inputMessage)) break;
			}
		} catch (IOException e) {
			System.out.println(e.getMessage());
		} finally {
			try {
				scanner.close();
				if (socket != null) socket.close();
				System.out.println("서버연결종료");
			} catch (IOException e) {
				System.out.println("소켓통신에러");
			}
		}
	}
}

'JSP' 카테고리의 다른 글

MVC 패턴 이란?  (0) 2023.04.14
JSTL이란? JSTL 사용법  (0) 2023.04.11
JSP Scope의 4가지 개념과 쓰임  (0) 2023.04.04
JSP 내부객체  (0) 2023.04.04
JSP(Java Server Pages) 란  (0) 2023.04.03