์์ผ(Socket)์ด๋ ๋คํธ์ํฌ์์ ๋ฐ์ดํฐ๋ฅผ ์ก์์ ํ๊ธฐ ์ํ ์๋ํฌ์ธํธ(EndPoint)์ด๋ค.
์ฆ, ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ํต์ ํ๋ ์ฐฝ๊ตฌ ์ญํ ์ ํ๋ฉฐ,
TCP/IP ๋๋ UDP ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค.
๊ฐ๋ | ์ค๋ช |
---|---|
์๋ฒ(Server) | ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ๋ณด๋ด๋ ์ญํ |
ํด๋ผ์ด์ธํธ(Client) | ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฐ๋ ์ญํ |
ํฌํธ(Port) | ๋คํธ์ํฌ์์ ํน์ ํ๋ก์ธ์ค๋ฅผ ์๋ณํ๋ ๋ฒํธ (0~65535) |
IP ์ฃผ์ | ๋คํธ์ํฌ์์ ์ฅ์น๋ฅผ ๊ตฌ๋ถํ๋ ์ฃผ์ (IPv4: 192.168.0.1) |
TCP (Transmission Control Protocol) | ์ ๋ขฐ์ฑ์ด ๋์ ์ฐ๊ฒฐ ์งํฅ ํ๋กํ ์ฝ |
UDP (User Datagram Protocol) | ์๋๊ฐ ๋น ๋ฅด์ง๋ง ์ ๋ขฐ์ฑ์ด ๋ฎ์ ๋น์ฐ๊ฒฐํ ํ๋กํ ์ฝ |
ํน์ง | TCP | UDP |
---|---|---|
์ฐ๊ฒฐ ๋ฐฉ์ | ์ฐ๊ฒฐ ์งํฅ(Connection-Oriented) | ๋น์ฐ๊ฒฐ(Connectionless) |
๋ฐ์ดํฐ ์ ์ก | ์ ๋ขฐ์ฑ ๋์ (์์ ๋ณด์ฅ, ์ฌ์ ์ก) | ์ ๋ขฐ์ฑ ๋ฎ์ (ํจํท ์์ค ๊ฐ๋ฅ) |
์๋ | ์๋์ ์ผ๋ก ๋๋ฆผ | ๋งค์ฐ ๋น ๋ฆ |
์ฌ์ฉ ์์ | ์น ๋ธ๋ผ์ฐ์ (HTTP), ํ์ผ ์ ์ก(FTP), ์ด๋ฉ์ผ(SMTP) | ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ, VoIP, ์จ๋ผ์ธ ๊ฒ์ |
TCP ๊ธฐ๋ฐ์ ์์ผ ํต์ ์ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ์ฐ๊ฒฐ์ ๋งบ๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๋ค.
import java.io.*;
import java.net.*;
public class TCPServer {
public static void main(String[] args) {
try {
// 1๏ธโฃ ์๋ฒ ์์ผ ์์ฑ (ํฌํธ 5000)
ServerSocket serverSocket = new ServerSocket(5000);
System.out.println("โ
์๋ฒ๊ฐ 5000๋ฒ ํฌํธ์์ ๋๊ธฐ ์ค...");
// 2๏ธโฃ ํด๋ผ์ด์ธํธ ์ ์ ๋๊ธฐ
Socket socket = serverSocket.accept();
System.out.println("๐ ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ๋จ: " + socket.getInetAddress());
// 3๏ธโฃ ๋ฐ์ดํฐ ์
์ถ๋ ฅ ์คํธ๋ฆผ ์์ฑ
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// 4๏ธโฃ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฉ์์ง ์์ ๋ฐ ์๋ต
String message;
while ((message = in.readLine()) != null) {
System.out.println("๐ฉ ํด๋ผ์ด์ธํธ: " + message);
out.println("์๋ฒ ์๋ต: " + message); // ๋ฐ์ ๋ฉ์์ง๋ฅผ ๊ทธ๋๋ก ์๋ต
}
// 5๏ธโฃ ์ฐ๊ฒฐ ์ข
๋ฃ
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) {
try {
// 1๏ธโฃ ์๋ฒ์ ์ ์ (localhost, ํฌํธ 5000)
Socket socket = new Socket("localhost", 5000);
System.out.println("โ
์๋ฒ์ ์ฐ๊ฒฐ๋จ");
// 2๏ธโฃ ๋ฐ์ดํฐ ์
์ถ๋ ฅ ์คํธ๋ฆผ ์์ฑ
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
// 3๏ธโฃ ์ฌ์ฉ์ ์
๋ ฅ์ ์๋ฒ๋ก ์ ์ก
String message;
while (true) {
System.out.print("๋ฉ์์ง ์
๋ ฅ: ");
message = userInput.readLine();
out.println(message); // ์๋ฒ๋ก ์ ์ก
if (message.equalsIgnoreCase("exit")) break; // 'exit' ์
๋ ฅ ์ ์ข
๋ฃ
System.out.println("๐ฉ ์๋ฒ ์๋ต: " + in.readLine()); // ์๋ฒ ์๋ต ์ถ๋ ฅ
}
// 4๏ธโฃ ์ฐ๊ฒฐ ์ข
๋ฃ
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
TCP๋ ์ฐ๊ฒฐ์ ์ ์งํ๋ ๋ฐฉ์์ด์ง๋ง, UDP๋ ๋น์ฐ๊ฒฐํ ํต์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ก์์ ํ๋ค.
import java.net.*;
public class UDPServer {
public static void main(String[] args) {
try {
// 1๏ธโฃ UDP ์์ผ ์์ฑ (ํฌํธ 4000)
DatagramSocket socket = new DatagramSocket(4000);
System.out.println("โ
UDP ์๋ฒ๊ฐ 4000๋ฒ ํฌํธ์์ ๋๊ธฐ ์ค...");
// 2๏ธโฃ ๋ฐ์ดํฐ ์์ ์ ์ํ ๋ฒํผ ์์ฑ
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
// 3๏ธโฃ ํด๋ผ์ด์ธํธ์ ๋ฐ์ดํฐ ์์
socket.receive(packet);
String receivedData = new String(packet.getData(), 0, packet.getLength());
System.out.println("๐ฉ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ ๋ฉ์์ง: " + receivedData);
// 4๏ธโฃ ์๋ต ์ ์ก
String response = "์๋ฒ ์๋ต: " + receivedData;
byte[] responseData = response.getBytes();
DatagramPacket responsePacket = new DatagramPacket(
responseData, responseData.length, packet.getAddress(), packet.getPort()
);
socket.send(responsePacket);
// 5๏ธโฃ ์์ผ ์ข
๋ฃ
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.net.*;
public class UDPClient {
public static void main(String[] args) {
try {
// 1๏ธโฃ UDP ์์ผ ์์ฑ
DatagramSocket socket = new DatagramSocket();
InetAddress serverAddress = InetAddress.getByName("localhost");
// 2๏ธโฃ ์๋ฒ๋ก ์ ์กํ ๋ฐ์ดํฐ ์์ฑ
String message = "Hello, UDP Server!";
byte[] buffer = message.getBytes();
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, serverAddress, 4000);
// 3๏ธโฃ ๋ฐ์ดํฐ ์ ์ก
socket.send(packet);
System.out.println("โ
๋ฉ์์ง ์ ์ก ์๋ฃ");
// 4๏ธโฃ ์๋ฒ ์๋ต ์์
byte[] responseBuffer = new byte[1024];
DatagramPacket responsePacket = new DatagramPacket(responseBuffer, responseBuffer.length);
socket.receive(responsePacket);
String response = new String(responsePacket.getData(), 0, responsePacket.getLength());
System.out.println("๐ฉ ์๋ฒ ์๋ต: " + response);
// 5๏ธโฃ ์์ผ ์ข
๋ฃ
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
โ
์์ผ(Socket)์ด๋? ๋คํธ์ํฌ์์ ๋ฐ์ดํฐ๋ฅผ ์ก์์ ํ๋ ์ฐฝ๊ตฌ ์ญํ
โ
TCP ๊ธฐ๋ฐ์ ์์ผ ํ๋ก๊ทธ๋๋ฐ
โ
ํด๋ผ์ด์ธํธ๋ Socket
์ ์ฌ์ฉํ์ฌ ์๋ฒ์ ์ ์
โ
InputStream
/ OutputStream
์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ก์์
โ
ํด๋ผ์ด์ธํธ๊ฐ "exit"
๋ฅผ ์
๋ ฅํ๋ฉด ์ฐ๊ฒฐ ์ข
๋ฃ