[자바 고급 #6] 소켓 실습(스레드)

도경원's avatar
Sep 16, 2025
[자바 고급 #6] 소켓 실습(스레드)

1. 소켓통신 - 단방향 + while문 추가

notion image

서버 코드

package socket2; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class ServerFile { // 클라이언트 연결을 받는 소켓 ServerSocket serverSocket; // 실제 통신을 하는 소켓 Socket socket; // Ctrl + Space BufferedReader br; public ServerFile() { System.out.println("1. 서버소켓 시작--------------------"); try { serverSocket = new ServerSocket(10000); System.out.println("2. 서버소켓 생성완료 : 클라이언트 접속 대기중 ------------------"); socket = serverSocket.accept(); // 클라이언트 접속 대기중 .... System.out.println("3. 클라이언트 연결완료 - buffer 연결완료(read)"); br = new BufferedReader(new InputStreamReader(socket.getInputStream())); while (true) { String msg = br.readLine(); System.out.println("4. 클라이언트로 부터 받은 메시지 : " + msg); } } catch (Exception e) { System.out.println("서버소켓 에러 발생함" + e.getMessage()); } } public static void main(String[] args) { new ServerFile(); } }

클라이언트 코드

package socket2; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; public class ClientFile { Socket socket; BufferedWriter bw; BufferedReader br; public ClientFile() { try { System.out.println("1. 클라이언트소켓 시작-------------------------"); socket = new Socket("localhost", 10000); //라인 실행시 -> 서버소켓의 accept() 메서드 호출 System.out.println("2. 버퍼(write) 연결완료 ------------------"); bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // 키보드 연결 System.out.println("3. 키보드 스트림 + 버퍼(read) 연결완료 -----------------"); br = new BufferedReader(new InputStreamReader(System.in)); while (true) { System.out.println("4. 키보드 메시지 입력 대기중 ----------------------"); String keyboardMsg = br.readLine(); // 메시지 끝을 알려줘야 한다. \n bw.write(keyboardMsg+"\n"); bw.flush(); } } catch (Exception e) { System.out.println("클라이언트소켓 에러 발생함 : " + e.getMessage()); } } public static void main(String[] args) { new ClientFile(); } }

2. 소켓통신 - 스레드 (양방향)

notion image

서버 코드

package socket3; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; public class ServerFile { // 클라이언트 연결을 받는 소켓 ServerSocket serverSocket; // 실제 통신을 하는 소켓 Socket socket; // Ctrl + Space BufferedReader br; // 새로운 스레드가 필요하다. BufferedWriter bw; BufferedReader keyboard; public ServerFile() { System.out.println("1. 서버소켓 시작--------------------"); try { serverSocket = new ServerSocket(10000); System.out.println("2. 서버소켓 생성완료 : 클라이언트 접속 대기중 ------------------"); socket = serverSocket.accept(); // 클라이언트 접속 대기중 .... System.out.println("3. 클라이언트 연결완료 - buffer 연결완료(read)"); br = new BufferedReader(new InputStreamReader(socket.getInputStream())); keyboard = new BufferedReader(new InputStreamReader(System.in)); bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // write 스레드 실행 (글쓰기) WriteThrerad wt = new WriteThrerad(); Thread t1 = new Thread(wt); t1.start(); // main 스레드 역할 (글읽기) while (true) { String msg = br.readLine(); System.out.println("4. 클라이언트로 부터 받은 메시지 : " + msg); } } catch (Exception e) { System.out.println("서버소켓 에러 발생함" + e.getMessage()); } } // 내부 클래스 class WriteThrerad implements Runnable { @Override public void run() { while (true) { try { String keyboardMsg = keyboard.readLine(); bw.write(keyboardMsg+"\n"); bw.flush(); } catch (Exception e) { System.out.println("서버소켓쪽에서 키보드 입력받는 중 오류가 발생했습니다 : " + e.getMessage()); } } } } public static void main(String[] args) { new ServerFile(); } }

클라이언트 코드

package socket3; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; public class ClientFile { Socket socket; BufferedWriter bw; BufferedReader keyboard; BufferedReader br; public ClientFile() { try { System.out.println("1. 클라이언트소켓 시작-------------------------"); socket = new Socket("localhost", 10000); //라인 실행시 -> 서버소켓의 accept() 메서드 호출 System.out.println("2. 버퍼(write) 연결완료 ------------------"); bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // 키보드 연결 System.out.println("3. 키보드 스트림 + 버퍼(read) 연결완료 -----------------"); keyboard = new BufferedReader(new InputStreamReader(System.in)); br = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 새로운 스레드 역할 (글 읽기) ReadThrerad rt = new ReadThrerad(); Thread t1 = new Thread(rt); t1.start(); // 메인 스레드의 역할 (글 쓰기) while (true) { System.out.println("4. 키보드 메시지 입력 대기중 ----------------------"); String keyboardMsg = keyboard.readLine(); // 메시지 끝을 알려줘야 한다. \n bw.write(keyboardMsg+"\n"); bw.flush(); } } catch (Exception e) { System.out.println("클라이언트소켓 에러 발생함 : " + e.getMessage()); } } class ReadThrerad implements Runnable { @Override public void run() { while (true) { try { String msg = br.readLine(); System.out.println("서버로부터받은 메시지:" + msg); } catch (Exception e) { System.out.println("클라이언트 소켓쪽에서 서버소켓 메시지를 입력받는 중 오류가 발생했습니다: " + e.getMessage()); } } } } public static void main(String[] args) { new ClientFile(); } }

3. 소켓 통신의 활용(Http)

notion image
 
Share article

Gyeongwon's blog