네트워크 프로그램을 만들 때 자주 등장하는 개념이 Socket이다. Soekct은 서로 다른 컴퓨터나 프로그램이 네트워크를 통해 데이터를 주고받을 수 있도록 해 주는 통신의 출입구 역할을 한다
1. Socket이란 ?
Socket은 네트워크에서 프로그램끼리 데이터를 주고받기 위한 통신 창구이다
쉽게 말하면, 한 컴퓨터의 프로그램이 다른 컴퓨터의 프로그램과 통신할 수 있도록 연결해 주는 끝점이다
예를 들어 노트북에서 실행 중인 프로그램이 Raspberry Pi에서 실행 중인 프로그램과 데이터를 주고받는다면, 두 프로그램은 Socket을 통해 연결된다
노트북 프로그램 <---- Socket 통신 ----> Raspberry Pi 프로그램
Socket은 다음과 같은 역할을 함
- 네트워크 연결 생성
- 데이터 송신
- 데이터 수신
- 연결 종료
즉, Socket은 네트워크 통신을 위한 프로그램의 접점이라고 볼 수 있다
2. IP 주소와 Port 번호
Socket 통신을 이해하려면 IP 주소와 Port 번호를 알아야 한다
IP 주소
IP 주소는 네트워크에서 장치를 구분하기 위한 주소이다
예를 들어 같은 Wi-Fi에 연결된 노트북과 Raspberry Pi는 각각 다른 IP 주소를 가진다
노트북 IP : 192.168.0.10
Raspberry Pi Ip : 192.168.0.20
Ip 주소는 네트워크 상에서 "어느 장치로 보낼 것인가"를 결정하는데 사용된다
Port 번호
port 번호는 한 장치 안에서 어떤 프로그램과 통신할지 구분하는 번호이다
하나의 컴퓨터에서도 여러 프로그램이 동시에 네트워크를 사용할 수 있기 때문에 Port 번호가 필요하다
예를 들어 다음 주소를 보면
==============
192.168.0.20:5000
==============
의미 :
IP 주소 : 192.168.0.20
Port 번호 : 5000
즉, IP 주소는 컴퓨터의 주소, Port 번호는 그 컴퓨터 안의 프로그램 번호라고 이해할 수 있다.
3. Client와 Server의 역할
네트워크 통신은 보통 Client-Server 구조로 이루어진다
Server
Server는 연결을 기다리는 쪽이다.
Server의 역할
- 특정 Port에서 대기
- Client의 접속 요청 수락
- Client의 데이터 송수신
- 필요하면 여러 Client 처리
예를 들어 Raspberry Pi에서 Server 프로그램을 실행하면, Raspberrry Pi는 특정 Port에서 Client의 접속을 기다린다
Raspbeery Pi(Server) : 5000번 Port에서 대기
Client
Client는 Server에 접속을 요청하는 쪽이다
Client의 역할
- Server의 IP 주소와 Port 번호 확인
- Server에 연결 요청
- 연결 후 데이터 송수신
예를 들어 노트북에서 Client 프로그램을 실행하면, 노트북은 Raspberry Pi의 IP 주소와 Port 번호를 이용해 접속한다
노트북(Client) : 192.168.0.20:5000으로 접속
4. Client-Server 연결 흐름
Socket 통신의 전체 흐름은 다음과 같다
1. Server 프로그램이 먼저 실행됨
2. Server가 특정 Port에서 연결을 기다림
3. Client가 Server의 IP 주소와 Port 번호로 접속을 시도한다
4. Server가 Client의 연결 요청을 수락한다
5. Client와 Server가 데이터를 주고 받는다
6. 통신이 끝나면 Socket을 닫는다
5. Java에서의 Socket Programming
Java에서는 TCP Socket 통신을 위해 주로 다음 클래스를 사용한다
역할 Java 클래스
| Server Socket 생성 | ServerSocket |
| Client Socket 생성 | Socket |
| 데이터 입력 | InputStream, BufferedReader |
| 데이터 출력 | OutputStream, PrintWriter |
6.Java에서 Server 프로그램은 일반적으로 다음 순서로 동작한다
1. ServerSocket을 생성한다
2. 특정 Port에서 Client 접속을 기다린다
3. accept()로 Client 접속을 수락한다
4. Client와 통신할 Socket을 생성한다
5. 입력 스트림과 출력 스트림을 생성한다
6. Client로부터 데이터를 수신한다
7. Client에게 응답 데이터를 전송한다
8. 통신이 끝나면 Socket을 닫는다
예시 코드)
ServerSocket serverSocket = new ServerSocket(5000);
Socket clientSocket = serverSocket.accept();
여기서 new ServerSocket(5000)은 5000번 Port에서 대기하겠다는 의미이다
accept()는 Client가 접속할 때까지 기다리는 메서드이다
7. Java Client 프로그램 동작 순서
Client 프로그램은 다음 순서로 동작함
1. Server의 IP 주소와 Port 번호를 지정한다
2. Socket을 생성하여 Server에 연결한다
3. 입력 스트림과 출력 스트림을 생성한다
4. Server로 데이터를 전송한다
5. Server의 응답 데이터를 수신한다
6. 통신이 끝나면 Socket을 닫는다
예시 코드)
Socket socket = new Socket("192.168.0.20", 5000);
이 코드는 192.168.0.20 IP 주소를 가진 장치의 5000번 Port로 접속하겠다는 의미이다
8. 노트북과 Raspbeery Pi를 이용한 Client-Server 구성
다음과 같은 상황을 가정)
노트북 : Client
Raspbeery Pi : Server
두 장치가 같은 Wi-Fi 또는 같은 네트워크에 연결됨
이 경우 Raspbeery Pi에서 Server 프로그램을 실행하고, 노트북에서 Client 프로그램을 실행하여 통신할 수 있다
9. Raspbeery Pi의 IP 주소 확인 방법
Client가 Server에 접속하려면 Raspbeery Pi의 IP 주소를 알아야 한다
Raspberry Pi 터미널에서 다음 명령어를 입력한다
hostname -I
또는 다음 명령어도 사용 가능
ip addr
예를 들어 결과가 다음과 같다면:
192.168.0.20
Raspberry Pi의 IP 주소는 192.168.0.20 이다
10. Server가 대기하는 IP와 Port
Raspberry Pi에서 Server 프로그램을 실행하면, Server는 특정 Port에서 Client의 연결을 기다린다
예를 들어 Server가 5000번 Port에서 대기한다면 주소는 다음과 같다
192.168.0.20:5000
0.0.0.0 은 Raspberry Pi의 모든 네트워크 인터페이스에서 연결을 받겠다는 의미이다
주의할 점은 localhost 또는 127.0.0.1 이다
이 주소들은 자기 자신을 의미한다. 따라서 노트북에서 localhost로 접속하면 Raspberry Pi가 아니라 노트북 자기 자신에게 접속하게 된다
11. Client가 Server에 접속할 때 필요한 정보
Client인 노트북은 Server에 접속하기 위해 다음 정보가 필요하다
Server IP 주소 : Raspberry Pi의 IP 주소
Server Port 번호 : Server가 기다리는 Port 번호
예를 들어 Raspbeery Pi의 IP 주소가 192.168.0.20이고 Server Port가 5000이라면, Cllient는 다음 정보로 접속한다
192.168.0.20:5000
Java 코드에서는 다음과 같이 작성 가능하다
Socket socket = new Socket("192.168.0.20", 5000);
12. 데이터 송수신 순서
Client가 먼저 메시지를 보내고 Server가 응답하는 구조라면 통신 순서는 다음과 같다
1. Raspberry Pi에서 Server 프로그램을 실행한다.
2. Server가 5000번 Port에서 대기한다.
3. 노트북에서 Client 프로그램을 실행한다.
4. Client가 Raspberry Pi의 IP 주소와 Port 번호로 접속한다.
5. Server가 Client의 연결 요청을 수락한다.
6. Client가 Server에게 메시지를 보낸다.
7. Server가 Client의 메시지를 받는다.
8. Server가 Client에게 응답 메시지를 보낸다.
9. Client가 Server의 응답 메시지를 받는다.
10. 통신이 끝나면 연결을 종료한다.
예를 들어 다음과 같은 데이터가 오갈 수 있다
Client -> Server: Hello Server
Server -> Client : Hello Client
13. 통신 정상 여부 확인 방법
통신이 정상적으로 이루어졌는지는 여러 방법으로 확인할 수 있다
1. Server 콘솔 로그 확인
Server 프로그램에서 Client 접속 여부와 수신 데이터를 출력한다
Client : connected
Received : Hello Server
2. Client 콘솔 로그 확인
Client 프로그램에서 Server 연결 여부와 응답 데이터를 출력한다
Connected to server
Server response : Hello Client
3. ping으로 네트워크 연결 확인
노트북에서 Raspberry Pi로 ping을 보내 네트워크 연결을 확인할 수 있다
ping 192.168.0.20
4. Port 대기 상태 확인
Raspberry Pi에서 Server가 해당 Port를 열고 있는지 확인할 수 있다
ss -tuln
또는
netstat -tuln
5. 방화벽 확인
Raspberry Pi 또는 노트북의 방화벽이 해당 Port를 차단하고 있으면 연결이 실패할 수 있다
이 경우 방화벽 설정에서 사용하는 Port가 허용되어 있는지 확인해야 한다
마무리
Socket은 네트워크에서 프로그램끼리 통신하기 위한 기본적인 도구입니다. IP 주소는 통신할 장치를 찾기 위한 주소이고, Port 번호는 그 장치 안에서 어떤 프로그램과 통신할지 구분하는 번호이다.
Client-Server 구조에서는 Server가 먼저 실행되어 연결을 기다리고, Client가 Server의 IP 주소와 Port 번호를 이용해 접속한다. 노트북과 Raspberry Pi를 사용할 경우 Raspberry Pi를 Server로 실행하고, 노트북 Client는 Raspberry Pi의 IP 주소와 Server Port 번호를 이용해 통신한다.
Socket 통신의 흐름을 이해하면 이후 TCP 통신, IoT 기기 제어, 원격 데이터 전송, 센서 데이터 수집 같은 다양한 네트워크 프로그램을 구현하는 데 도움이 된다.
'네트워크' 카테고리의 다른 글
| 서버 IP를 변경했는데도 특정 서버가 구 IP로 접속하는 이유 (0) | 2026.07.23 |
|---|