[Java] Socket Programming

이지현·2023년 4월 10일
0

Java

목록 보기
36/46
post-thumbnail

✔️ Socket Programming

  • Socket : 네트워크의 양방향 통신에서 양쪽 끝단으로, TCP/IP 단에서 구분할 수 있는 하나의 포트 번호를 가짐
  • java.net 패키지가 소켓 프로그래밍 클래스들을 제공함

1. TCP(Transmission Control Protocol)와 UDP(User Datagram Protocol)

  • 모두 OSI 7계층의 전송 계층에 해당하는 프로토콜
항목TCPUDP
연결방식연결 기반, 1:1 통신비연결기반, 1:1 / 1:n / n:n 통신
특징바이트 단위로 전송, 신뢰성 기반: 전송 순서 보존 / 수신 여부 확인데이터 단위로 전송, 신뢰성 없음
클래스Socket, ServerSocketDatagramSocket, DatagramPacket, MulticastSocket

2. TCP 소켓 프로그래밍

  • 서버/클라이언트의 통신 과정
    [서버] ServerSocket으로 특정 포트로 소켓을 열음
    [클라이언트] 서버의 IP 주소와 포트로, Socket으로 소켓을 만들어 서버에 연결 요청함
    [서버] 클라이언트의 연결 요청을 받으면 Socket으로 소켓을 만들어 클라이언트의 소켓과 연결함
    [서버/클라이언트] 연결된 각자의 소켓을 이용해 통신함

  • 소켓
    여러 소켓이 포트 하나를 공유할 수 있지만, 서버소켓은 포트 하나를 독점함.
    소켓은 입력스트림과 출력스트림을 가지고 상대방 소켓과 서로 교차연결해 데이터를 주고받음

  • 예제
    ◦ 쓰레드로 통신하기

class Sender extends Thread {
  DataOutputStream out;
  ...
  Sender(Socket socket) {
    ...
    out = new DataOutputStream(socket.getOutputStream());
    ...
  }
  public void run() {
    ...
    out.writeUTF("Sender message.");
    ...
  }
}
class Receiver extends Thread {
  DataInputStream in;
  ...
  Receiver(Socket socket) {
    ...
    in = new DataInputStream(socket.getInputStream());
    ...
  }
  public void run() {
    ...
    System.out.println(in.readUTF());
    ...
  }
}

◦ 서버

ServerSocket serverSocket = new ServerSocket(7777);

Socket socket = serverSocket.accept(); // 클라이언트의 연결 요청을 받아 통신용 소켓을 만든다.

Sender sender = new Sender(socket);
Receiver receiver = new Receiver(socket);

sender.start();
receiver.start();

◦ 클라이언트

Socket socket = new Socket("127.0.0.1", 7777);

Sender sender = new Sender(socket);
Receiver receiver = new Receiver(socket);

sender.start();
receiver.start();

3. UDP 소켓 프로그래밍

  • 연결지향이 아니므로 ServerSocket이 따로 필요하지 않음

  • 소켓은 DatagramSocket을 사용해 DatagramPacket에 데이터를 담아 통신함

  • DatagramPacket에는 헤더와 데이터가 있으며 헤더에 수신할 상대방의 정보(주소와 포트)를 저장함

  • 예제
    ◦ 서버

DatagramSocket datagramSocket = new DatagramSocket(7777);

byte[] inMsg = new byte[10];
// (데이터, 데이터 길이) - 받을 패킷 만들기
DatagramPacket inPacket = new DatagramPacket(inMsg, inMsg.length);

socket.receive(inPacket);

System.out.println(new String(inPacket.getData());

dataSocket.close();

◦ 클라이언트

// 클라이언트는 포트를 지정하지 않는다.
DatagramSocket datagramSocket = new DatagramSocket();

InetAddress serverAddress = InetAddress.getByName("127.0.0.1");
byte[] msg = new byte[10];
// (데이터, 데이터 길이, 주소, 포트) - 보낼 패킷 만들기
DatagramPacket outPacket = new DatagramPacket(msg, msg.length, serverAddress, 7777);

datagramSocket.send(outPacket);

datagramSocket.close();
profile
2023.09 ~ 티스토리 이전 / 2024.04 ~ 깃허브 블로그 이전

0개의 댓글