항목 | TCP | UDP |
---|---|---|
연결방식 | 연결 기반, 1:1 통신 | 비연결기반, 1:1 / 1:n / n:n 통신 |
특징 | 바이트 단위로 전송, 신뢰성 기반: 전송 순서 보존 / 수신 여부 확인 | 데이터 단위로 전송, 신뢰성 없음 |
클래스 | Socket, ServerSocket | DatagramSocket, DatagramPacket, MulticastSocket |
서버/클라이언트의 통신 과정
[서버] 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();
연결지향이 아니므로 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();