소켓은 네트워크 상에서 통신을 가능하게 하는 끝점을 의미한다.
두 컴퓨터 간의 데이터를 주고받기 위해 사용되는 인터페이스로, 소켓을 통해 네트워크 연결을 설정하고 데이터를 송수신할 수 있다. 쉽게 말해, 소켓은 네트워크를 통해 다른 컴퓨터와 대화하는 전화기 같은 역할을 한다. (소켓은 사실 파일 개념과 같다)
소켓은 물리적인 장치가 아니라 추상적인 개념의 약속이다. 네트워크 통신을 위해 소프트웨어적으로 정의된 인터페이스로, 컴퓨터 간의 데이터 교환을 가능하게 하는 규칙과 방법을 의미한다. 이를 통해 네트워크 애플리케이션이 서로 통신할 수 있다.
💡
일반 사용자 컴퓨터에서 네트워크 통신에 사용되는 주요 물리적 장치는 네트워크 인터페이스 카드(NIC), 모뎀, 라우터, 스위치, 액세스 포인트, 그리고 이더넷 케이블입니다. 이 장치들은 함께 작동하여 인터넷과의 연결을 설정하고, 데이터 통신을 가능하게 합니다.
네트워크 인터페이스 카드(NIC) / 랜카드(LAN Card)
역할: 컴퓨터를 네트워크에 연결하는 장치입니다. 유형: 유선 NIC(이더넷 카드): 이더넷 케이블을 통해 네트워크에 연결합니다.
무선 NIC(와이파이 카드): 무선 신호를 통해 네트워크에 연결합니다.
소켓에는 두 가지 주요 유형이 있다:
소켓 통신은 다음과 같은 과정으로 이루어진다:
자바에서는 java.net 패키지를 사용하여 소켓 프로그래밍을 할 수 있다.
서버측 기본 코드
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
// 서버측 소켓통신을 만들기 위해서 준비물
// 1. ServerSocket (클라이언트 측 소켓과 연결만 시켜 준다)
// 2. 클라이언트와 연결 되는 소켓을 들고 있어야 한다.
// 로컬 컴퓨터에는 정해진, 사용할 수 있는 포트 번호 갯수가
// 할당 되어 있다 1~1024 포트 번호는 잘 알려진 포트 번호
// 시스템이 선점하고 있는 신호들이다.
try (ServerSocket serverSocket = new ServerSocket(5000)){
System.out.println("서버 포트 번호 : 5000 으로 생성");
//내부 메서드 안에서 while 문을 돌면서 클라이언트 측에
// 연결을 기다리고 있습니다
Socket socket = serverSocket.accept();
// 여기 아래는 클라이언트 측과 양 끝단에 소켓이 서로
// 연결 되어야 실행 흐름이 내려온다.
System.out.println("Clinet connected...");
// 대상 - 소켓 --> 입력 스트림을 가져 온다
InputStream input = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String message = reader.readLine(); // 한줄 단위로 데이터를 읽어라(문자기반)
System.out.println("Received : " + message);
// 기본 소켓은 클라이언트가 연결 되여야 생성 된다
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
클라이언트 측 기본 코드
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
// 클라이언트 측 -- 소켓 통신을 하기 위해서 준비물
// 1. 서버측 컴퓨터에 주소:포트번호
// 2. 서버측과 연결 될 기본 소켓이 필요하다
// 생성자 매개변수에 서버측 (IP주소, 포트번호)
//192.168.0.130 <- 자기 자신의 주소
try (Socket socket = new Socket("192.168.0.132",5000)){
// new Socket("localhost",5000) -> 객체 생성 시 서버측과 연결 되어서
// 스트림을 활용할 수 있다
// 대상은 소켓이다!!!
OutputStream output = socket.getOutputStream(); // 소켓에서 기반 스트림 꺼낸 거
PrintWriter writer = new PrintWriter(output, true); // 기능 확장 -> 보조 스크림 쓴 거
writer.println("kkkkk");
} catch (Exception e) {
e.printStackTrace();
}
}
}
소켓 프로그래밍은 다양한 응용 분야에 사용된다.
[JAVA] 1:1 단방향 통신 (클라이언트측) (0) | 2024.05.24 |
---|---|
[JAVA] 1:1 단방향 통신 (서버측) (0) | 2024.05.24 |
[JAVA] 고수준 스트림(Data/Object Stream) (0) | 2024.05.22 |
[JAVA] 사용자모드와 커널모드 (0) | 2024.05.22 |
[JAVA] 로그와 파일 저장 (0) | 2024.05.21 |