Search

์†Œ์ผ“ ํ†ต์‹ 

์ž๋ฐ” ์†Œ์ผ“ ํ†ต์‹ 

์†Œ์ผ“์ด๋ž€?

์†Œ์ผ“(Socket)์ด๋ž€ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ์œ„ํ•œ ์—”๋“œํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค.
๋‘ ํ”„๋กœ๊ทธ๋žจ์ด ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–‘์ชฝ์— ์†Œ์ผ“์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์†Œ์ผ“(Socket)์€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•œ ํ†ต์‹ ์˜ ๋์ (endpoint)์ž…๋‹ˆ๋‹ค.
์†Œ์ผ“์€ IP ์ฃผ์†Œ์™€ ํฌํŠธ ๋ฒˆํ˜ธ์˜ ์กฐํ•ฉ์œผ๋กœ ์‹๋ณ„๋˜๋ฉฐ, ๋‘ ํ”„๋กœ๊ทธ๋žจ ๊ฐ„์˜ ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ์ฑ„๋„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. TCP ์†Œ์ผ“์˜ ๊ฒฝ์šฐ ์—ฐ๊ฒฐ ์ง€ํ–ฅ์ ์ด๋ฉฐ, 3-way handshake๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ์„ ์ˆ˜๋ฆฝํ•˜๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ์™€ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์†Œ์ผ“์€ OSI 7๊ณ„์ธต ๋ชจ๋ธ์—์„œ ์ „์†ก ๊ณ„์ธต๊ณผ ์‘์šฉ ๊ณ„์ธต ์‚ฌ์ด์˜ ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• ์„ ํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ถ”์ƒํ™”๋œ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Java์—์„œ๋Š” Socket ํด๋ž˜์Šค(ํด๋ผ์ด์–ธํŠธ)์™€ ServerSocket ํด๋ž˜์Šค(์„œ๋ฒ„)๋ฅผ ํ†ตํ•ด ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๊ฐœ๋…

โ€ข
IP ์ฃผ์†Œ: ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ์ปดํ“จํ„ฐ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ์ฃผ์†Œ
โ€ข
ํฌํŠธ ๋ฒˆํ˜ธ: ํ•˜๋‚˜์˜ ์ปดํ“จํ„ฐ ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฒˆํ˜ธ (0~65535)
โ€ข
ํ”„๋กœํ† ์ฝœ: ํ†ต์‹  ๊ทœ์•ฝ (TCP, UDP ๋“ฑ)

TCP vs UDP

๊ตฌ๋ถ„
TCP
UDP
์—ฐ๊ฒฐ ๋ฐฉ์‹
์—ฐ๊ฒฐ ์ง€ํ–ฅ
๋น„์—ฐ๊ฒฐ ์ง€ํ–ฅ
์‹ ๋ขฐ์„ฑ
๋†’์Œ (๋ฐ์ดํ„ฐ ์ˆœ์„œ ๋ณด์žฅ)
๋‚ฎ์Œ (์ˆœ์„œ ๋ณด์žฅ ์•ˆ ํ•จ)
์†๋„
์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆผ
๋น ๋ฆ„
์‚ฌ์šฉ ์˜ˆ
์›น, ์ด๋ฉ”์ผ, ํŒŒ์ผ ์ „์†ก
์ŠคํŠธ๋ฆฌ๋ฐ, ์˜จ๋ผ์ธ ๊ฒŒ์ž„

TCP ์†Œ์ผ“ ํ†ต์‹  ๊ตฌ์กฐ

์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ

์—ญํ• 
์„ค๋ช…
์„œ๋ฒ„
ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ๋Œ€๊ธฐํ•˜๊ณ  ์ˆ˜๋ฝ
ํด๋ผ์ด์–ธํŠธ
์„œ๋ฒ„์— ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ 

ํ†ต์‹  ํ๋ฆ„

1.
์„œ๋ฒ„๊ฐ€ ํŠน์ • ํฌํŠธ์—์„œ ๋Œ€๊ธฐ (ServerSocket)
2.
ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์—ฐ๊ฒฐ ์š”์ฒญ (Socket)
3.
์„œ๋ฒ„๊ฐ€ ์—ฐ๊ฒฐ ์ˆ˜๋ฝ
4.
๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹  (InputStream, OutputStream)
5.
์—ฐ๊ฒฐ ์ข…๋ฃŒ

Windows ๋ฐฉํ™”๋ฒฝ ํฌํŠธ ๊ฐœ๋ฐฉ ๋ฐฉ๋ฒ•

Java ์†Œ์ผ“ ํ†ต์‹ ์„ ์œ„ํ•ด์„œ๋Š” ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํฌํŠธ๋ฅผ ๋ฐฉํ™”๋ฒฝ์—์„œ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ธ๋ฐ”์šด๋“œ ๊ทœ์น™ ์ถ”๊ฐ€ํ•˜๊ธฐ

1.
Windows ๋ฐฉํ™”๋ฒฝ ์„ค์ • ์—ด๊ธฐ
โ€ข
์‹œ์ž‘ ๋ฉ”๋‰ด์—์„œ "Windows Defender ๋ฐฉํ™”๋ฒฝ" ๊ฒ€์ƒ‰
โ€ข
"๊ณ ๊ธ‰ ์„ค์ •" ํด๋ฆญ
2.
์ƒˆ ์ธ๋ฐ”์šด๋“œ ๊ทœ์น™ ๋งŒ๋“ค๊ธฐ
โ€ข
์™ผ์ชฝ ๋ฉ”๋‰ด์—์„œ "์ธ๋ฐ”์šด๋“œ ๊ทœ์น™" ์„ ํƒ
โ€ข
์˜ค๋ฅธ์ชฝ "์ž‘์—…" ํŒจ๋„์—์„œ "์ƒˆ ๊ทœ์น™..." ํด๋ฆญ
3.
๊ทœ์น™ ์œ ํ˜• ์„ ํƒ
โ€ข
"ํฌํŠธ" ์„ ํƒ
โ€ข
"๋‹ค์Œ" ํด๋ฆญ
4.
ํ”„๋กœํ† ์ฝœ ๋ฐ ํฌํŠธ ์ง€์ •
โ€ข
"TCP" ์„ ํƒ (Java ์†Œ์ผ“์€ ์ผ๋ฐ˜์ ์œผ๋กœ TCP ์‚ฌ์šฉ)
โ€ข
"ํŠน์ • ๋กœ์ปฌ ํฌํŠธ" ์„ ํƒ
โ€ข
ํฌํŠธ ๋ฒˆํ˜ธ ์ž…๋ ฅ (์˜ˆ: 9999)
โ€ข
"๋‹ค์Œ" ํด๋ฆญ
5.
์ž‘์—… ์„ ํƒ
โ€ข
"์—ฐ๊ฒฐ ํ—ˆ์šฉ" ์„ ํƒ
โ€ข
"๋‹ค์Œ" ํด๋ฆญ
6.
ํ”„๋กœํ•„ ์„ ํƒ
โ€ข
๊ทœ์น™์„ ์ ์šฉํ•  ๋„คํŠธ์›Œํฌ ํ”„๋กœํ•„ ์„ ํƒ (๋„๋ฉ”์ธ, ๊ฐœ์ธ, ๊ณต์šฉ)
โ€ข
์ผ๋ฐ˜์ ์œผ๋กœ "๊ฐœ์ธ" ์ฒดํฌ
โ€ข
"๋‹ค์Œ" ํด๋ฆญ
7.
์ด๋ฆ„ ๋ฐ ์„ค๋ช…
โ€ข
๊ทœ์น™ ์ด๋ฆ„ ์ž…๋ ฅ (์˜ˆ: "Java Socket Server Port 9999")
โ€ข
์„ ํƒ์ ์œผ๋กœ ์„ค๋ช… ์ถ”๊ฐ€
โ€ข
"๋งˆ์นจ" ํด๋ฆญ

๋ช…๋ น ํ”„๋กฌํ”„ํŠธ๋กœ ํฌํŠธ ๊ฐœ๋ฐฉ

๊ด€๋ฆฌ์ž ๊ถŒํ•œ์œผ๋กœ ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ๋ฅผ ์—ด์–ด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
netsh advfirewall firewall add rule name="Java Socket Port 9999" dir=in action=allow protocol=TCP localport=9999
PowerShell
๋ณต์‚ฌ

ํฌํŠธ ๊ฐœ๋ฐฉ ํ™•์ธ

ํฌํŠธ๊ฐ€ ์ œ๋Œ€๋กœ ์—ด๋ ธ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด:
netstat -an | findstr :9999
PowerShell
๋ณต์‚ฌ
๋ณด์•ˆ ์ฃผ์˜์‚ฌํ•ญ
โ€ข
ํ…Œ์ŠคํŠธ ๋ชฉ์ ์œผ๋กœ๋งŒ ํฌํŠธ๋ฅผ ๊ฐœ๋ฐฉํ•˜์„ธ์š”
โ€ข
๊ณต์šฉ ๋„คํŠธ์›Œํฌ์—์„œ๋Š” ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค
โ€ข
์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํฌํŠธ๋Š” ๋‹ซ์•„๋‘๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค

์„œ๋ฒ„ ๊ตฌํ˜„

ServerSocket ํด๋ž˜์Šค

ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ์ˆ˜์‹ ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
import java.io.*; import java.net.*; public class SimpleServer { public static void main(String[] args) { int port = 9999; try (ServerSocket serverSocket = new ServerSocket(port)) { System.out.println("์„œ๋ฒ„๊ฐ€ ํฌํŠธ " + port + "์—์„œ ๋Œ€๊ธฐ ์ค‘..."); // ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ๋Œ€๊ธฐ Socket clientSocket = serverSocket.accept(); System.out.println("ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ๋จ: " + clientSocket.getInetAddress()); // ์ž…์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ BufferedReader in = new BufferedReader( new InputStreamReader(clientSocket.getInputStream()) ); PrintWriter out = new PrintWriter( clientSocket.getOutputStream(), true ); // ๋ฉ”์‹œ์ง€ ์ˆ˜์‹  ๋ฐ ์‘๋‹ต String message = in.readLine(); System.out.println("๋ฐ›์€ ๋ฉ”์‹œ์ง€: " + message); out.println("์„œ๋ฒ„ ์‘๋‹ต: " + message); // ์—ฐ๊ฒฐ ์ข…๋ฃŒ clientSocket.close(); } catch (IOException e) { e.printStackTrace(); } } }
Java
๋ณต์‚ฌ

์ฃผ์š” ๋ฉ”์„œ๋“œ

โ€ข
ServerSocket(int port): ์ง€์ •๋œ ํฌํŠธ๋กœ ์„œ๋ฒ„ ์†Œ์ผ“ ์ƒ์„ฑ
โ€ข
accept(): ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ์š”์ฒญ ๋Œ€๊ธฐ ๋ฐ ์ˆ˜๋ฝ (๋ธ”๋กœํ‚น ๋ฉ”์„œ๋“œ)
โ€ข
close(): ์„œ๋ฒ„ ์†Œ์ผ“ ๋‹ซ๊ธฐ

ํด๋ผ์ด์–ธํŠธ ๊ตฌํ˜„

Socket ํด๋ž˜์Šค

์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
import java.io.*; import java.net.*; public class SimpleClient { public static void main(String[] args) { String serverAddress = "localhost"; int port = 9999; try (Socket socket = new Socket(serverAddress, port)) { System.out.println("์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋จ"); // ์ž…์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ PrintWriter out = new PrintWriter( socket.getOutputStream(), true ); BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream()) ); // ๋ฉ”์‹œ์ง€ ์ „์†ก out.println("์•ˆ๋…•ํ•˜์„ธ์š”, ์„œ๋ฒ„!"); // ์‘๋‹ต ์ˆ˜์‹  String response = in.readLine(); System.out.println("์„œ๋ฒ„ ์‘๋‹ต: " + response); } catch (IOException e) { e.printStackTrace(); } } }
Java
๋ณต์‚ฌ

์ฃผ์š” ๋ฉ”์„œ๋“œ

โ€ข
Socket(String host, int port): ์ง€์ •๋œ ํ˜ธ์ŠคํŠธ์™€ ํฌํŠธ๋กœ ์—ฐ๊ฒฐ
โ€ข
getInputStream(): ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ ๋ฐ˜ํ™˜
โ€ข
getOutputStream(): ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ ๋ฐ˜ํ™˜
โ€ข
close(): ์†Œ์ผ“ ์—ฐ๊ฒฐ ๋‹ซ๊ธฐ

๋‹ค์ค‘ ํด๋ผ์ด์–ธํŠธ ์ฒ˜๋ฆฌ

์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
import java.io.*; import java.net.*; public class MultiThreadServer { public static void main(String[] args) { int port = 9999; try (ServerSocket serverSocket = new ServerSocket(port)) { System.out.println("๋‹ค์ค‘ ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„ ์‹œ์ž‘..."); while (true) { Socket clientSocket = serverSocket.accept(); System.out.println("์ƒˆ ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ: " + clientSocket.getInetAddress()); // ๊ฐ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ณ„๋„ ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ ClientHandler handler = new ClientHandler(clientSocket); Thread thread = new Thread(handler); thread.start(); } } catch (IOException e) { e.printStackTrace(); } } } class ClientHandler implements Runnable { private Socket socket; public ClientHandler(Socket socket) { this.socket = socket; } @Override public void run() { try ( BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream()) ); PrintWriter out = new PrintWriter( socket.getOutputStream(), true ) ) { String message; while ((message = in.readLine()) != null) { System.out.println("๋ฐ›์€ ๋ฉ”์‹œ์ง€: " + message); out.println("์—์ฝ”: " + message); if (message.equalsIgnoreCase("bye")) { break; } } } catch (IOException e) { e.printStackTrace(); } finally { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
Java
๋ณต์‚ฌ

์‹ค์ „ ์˜ˆ์ œ: ์ฑ„ํŒ… ํ”„๋กœ๊ทธ๋žจ

์ฑ„ํŒ… ์„œ๋ฒ„

package socket; import java.io.*; import java.net.*; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public class ChatServer { // ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋“ค์˜ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ ์ €์žฅํ•  ๋ฆฌ์ŠคํŠธ (Thread safe) private static List<PrintWriter> clientWriterList = new CopyOnWriteArrayList<>(); public static void main(String[] args) { int port = 9999; try (ServerSocket serverSocket = new ServerSocket(port)) { System.out.println("์„œ๋ฒ„ ๋Œ€๊ธฐ ์ค‘: " + port); // ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ณ„์† ๋ฐ›๊ธฐ ์œ„ํ•ด ๋ฌดํ•œ ๋ฃจํ”„ while (true) { Socket clientSocket = serverSocket.accept(); System.out.println("ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ๋จ: " + clientSocket.getInetAddress()); // ๊ฐ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ณ„๋„ ์Šค๋ ˆ๋“œ๋กœ ์ฒ˜๋ฆฌ new Thread(new ClientHandler(clientSocket)).start(); } } catch (IOException e) { e.printStackTrace(); } } // main() ๋ // ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ : ๋ชจ๋“  ํด๋ž˜์ด์–ธํŠธ์— ๋ฉ”์‹œ์ง€ ์ „์†ก public static void broadcast(String message, PrintWriter sender) { for (PrintWriter writer : clientWriterList) { if( writer != sender ) { writer.println(message); } } } // ํด๋ผ์ด์–ธํŠธ์™€์˜ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค static class ClientHandler implements Runnable { private Socket socket; private PrintWriter out; private BufferedReader in; private String clientName; public ClientHandler(Socket socket) { this.socket = socket; } @Override public void run() { try { in = new BufferedReader( new InputStreamReader(socket.getInputStream()) ); out = new PrintWriter(socket.getOutputStream(), true); // ๊ฐœ๋ณ„ ํด๋ผ์ด์–ธํŠธ์˜ ์ถœ๋ ฅ์ŠคํŠธ๋ฆผ์„ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ clientWriterList.add(out); out.println("์ด๋ฆ„ : "); clientName = in.readLine(); System.out.println("* " + clientName + "๋‹˜ ์ž…์žฅ!"); // ์ž…์žฅ broadcast("* " + clientName + "๋‹˜ ์ž…์žฅ!", out); // ๊ณ„์† ์ฑ„ํŒ… String message; while ((message = in.readLine()) != null) { System.out.println("[" + clientName + "] ๋ฉ”์‹œ์ง€: " + message); // ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ broadcast("[" + clientName + "] ๋ฉ”์‹œ์ง€: " + message, out); if (message.equalsIgnoreCase("exit")) { System.out.println("[" + socket.getInetAddress() + "] ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์š”์ฒญ"); break; } } } catch (IOException e) { System.out.println("ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ์˜ค๋ฅ˜: " + e.getMessage()); } finally { try { if(out != null) clientWriterList.remove(out); if( clientName != null ) { broadcast(clientName + "๋‹˜์ด ํ‡ด์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.", out); } socket.close(); System.out.println("ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ์ข…๋ฃŒ๋จ: " + socket.getInetAddress()); } catch (IOException e) { e.printStackTrace(); } } } } }
Java
๋ณต์‚ฌ

์ฑ„ํŒ… ํด๋ผ์ด์–ธํŠธ

package socket; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.util.Scanner; public class SimpleClient { public static void main(String[] args) { String serverAddress = "localhost"; int port = 9999; try ( Socket socket = new Socket(serverAddress, port); Scanner sc = new Scanner(System.in); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream()) ); ) { System.out.println("์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋จ"); // ์„œ๋ฒ„์—์„œ ์˜ค๋Š” ๋ฉ”์‹œ์ง€ ์ž…๋ ฅ Thread receiver = new Thread(() -> { try { String response; while( (response = in.readLine() ) != null ) { System.out.println(response); } } catch (Exception e) { System.out.println("์„œ๋ฒ„ ์—ฐ๊ฒฐ ์ข…๋ฃŒ"); } }); receiver.start(); // ์„œ๋ฒ„๋กœ ์ถœ๋ ฅ while(true) { String input = sc.nextLine(); out.println(input); // ์„œ๋ฒ„๋กœ ์ฑ„ํŒ… ๋ณด๋ƒ„ } } catch (Exception e) { e.printStackTrace(); } } }
Java
๋ณต์‚ฌ

์ฃผ์˜์‚ฌํ•ญ ๋ฐ Best Practices

์˜ˆ์™ธ ์ฒ˜๋ฆฌ

โ€ข
IOException: ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜ ์‹œ ๋ฐœ์ƒ
โ€ข
SocketException: ์†Œ์ผ“ ๊ด€๋ จ ์˜ค๋ฅ˜
โ€ข
ํ•ญ์ƒ try-with-resources ์‚ฌ์šฉ: ์ž์› ์ž๋™ ํ•ด์ œ

ํƒ€์ž„์•„์›ƒ ์„ค์ •

// ์—ฐ๊ฒฐ ํƒ€์ž„์•„์›ƒ (๋ฐ€๋ฆฌ์ดˆ) socket.connect(new InetSocketAddress(host, port), 5000); // ์ฝ๊ธฐ ํƒ€์ž„์•„์›ƒ socket.setSoTimeout(10000);
Java
๋ณต์‚ฌ

๋ฒ„ํผ๋ง

โ€ข
ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์œ„ํ•ด BufferedReader์™€ BufferedWriter ์‚ฌ์šฉ
โ€ข
PrintWriter์˜ autoFlush ์˜ต์…˜ ํ™œ์šฉ

์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ

โ€ข
๊ณต์œ  ์ž์› ์ ‘๊ทผ ์‹œ synchronized ์‚ฌ์šฉ
โ€ข
์Šค๋ ˆ๋“œ ํ’€(ExecutorService) ์‚ฌ์šฉ ๊ณ ๋ ค