λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

μžλ°” λ„€νŠΈμ›Œν¬ TCP 톡신 μ†ŒμΌ“ν”„λ‘œκ·Έλž˜λ°

by 5566 2023. 11. 21.

1. μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ° 기초 κ°œλ…

μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ€ 컴퓨터 μ‚¬μ΄μ˜ 톡신을 κ°€λŠ₯ν•˜κ²Œ ν•΄μ£ΌλŠ” ν”„λ‘œκ·Έλž¨μ΄λ‹€. μ†ŒμΌ“μ€ λ„€νŠΈμ›Œν¬μƒμ—μ„œ μ–‘μͺ½ 톡신을 μˆ˜ν–‰ν•˜λŠ” 컴퓨터 κ°„μ˜ μ–‘λ°©ν–₯ ν†΅μ‹ μ˜ 쒅단점이닀. μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ„ 톡해 μ„œλ²„-ν΄λΌμ΄μ–ΈνŠΈ λͺ¨λΈμ„ κ΅¬ν˜„ν•˜μ—¬, μ„œλ‘œ λ‹€λ₯Έ 컴퓨터끼리 데이터λ₯Ό 주고받을 수 μžˆλ‹€.

1.1 μ†ŒμΌ“μ˜ μ—­ν• 

μ†ŒμΌ“μ€ λ„€νŠΈμ›Œν¬λ₯Ό 톡해 데이터λ₯Ό 주고받을 수 μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€ 역할을 ν•œλ‹€. μ„œλ²„μ—μ„œ μ†ŒμΌ“μ„ μƒμ„±ν•˜κ³  λŒ€κΈ° μƒνƒœλ‘œ μœ μ§€ν•˜λ©°, ν΄λΌμ΄μ–ΈνŠΈκ°€ 접속 μš”μ²­μ„ 보내면 연결을 μˆ˜λ½ν•˜κ³  데이터λ₯Ό 주고받을 수 μžˆλŠ” ν†΅λ‘œλ₯Ό ν˜•μ„±ν•œλ‹€. 이λ₯Ό 톡해 μ‹€μ‹œκ°„ λ˜λŠ” λΉ„λ™κΈ°μ‹μœΌλ‘œ 데이터λ₯Ό μ£Όκ³ λ°›μ•„ λ‹€μ–‘ν•œ λ„€νŠΈμ›Œν¬ κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆλ‹€.

1.2 μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ˜ κΈ°λ³Έ λ™μž‘ κ³Όμ •

  1. μ„œλ²„ μ†ŒμΌ“ 생성: μ„œλ²„λŠ” λ„€νŠΈμ›Œν¬μ— μ—°κ²°ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ˜ 접속을 λŒ€κΈ°ν•˜κΈ° μœ„ν•΄ μ„œλ²„ μ†ŒμΌ“μ„ μƒμ„±ν•œλ‹€.
  2. ν΄λΌμ΄μ–ΈνŠΈ 접속 λŒ€κΈ°: μ„œλ²„λŠ” 포트 번호λ₯Ό 톡해 ν΄λΌμ΄μ–ΈνŠΈμ˜ 접속을 λŒ€κΈ°ν•œλ‹€.
  3. ν΄λΌμ΄μ–ΈνŠΈ μ—°κ²° 수락: ν΄λΌμ΄μ–ΈνŠΈκ°€ 접속 μš”μ²­μ„ 보내면, μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ 연결을 μˆ˜λ½ν•˜κ³  톡신을 μœ„ν•œ μ†ŒμΌ“μ„ μƒμ„±ν•œλ‹€.
  4. 데이터 μ†‘μˆ˜μ‹ : μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈλŠ” μƒμ„±λœ μ†ŒμΌ“μ„ 톡해 데이터λ₯Ό μ£Όκ³ λ°›λŠ”λ‹€. μ΄λ•Œ TCP ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜μ—¬ μ‹ λ’°μ„±μžˆκ³  μ—°κ²° 지ν–₯적인 톡신이 이루어진닀.
  5. 톡신 μ’…λ£Œ: 톡신이 μ’…λ£Œλ˜λ©΄ μ†ŒμΌ“μ„ λ‹«κ³ , ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„λŠ” 연결이 λŠμ–΄μ§„λ‹€.

1.3 μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ˜ μ€‘μš”μ„±

μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ€ λ‹€μ–‘ν•œ μ‘μš© ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©λ˜λ©°, λ„€νŠΈμ›Œν¬ μƒμ—μ„œ 데이터λ₯Ό μ£Όκ³ λ°›λŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ μ±„νŒ… ν”„λ‘œκ·Έλž¨, 온라인 κ²Œμž„, 파일 전솑 등에 μ‚¬μš©λ˜λ©°, λŒ€κ·œλͺ¨ λ™μ‹œ μ ‘μ†μ΄λ‚˜ λŒ€μš©λŸ‰ 데이터 전솑에도 효율적으둜 λ™μž‘ν•œλ‹€. μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ„ μ΄ν•΄ν•˜κ³  μ‚¬μš©ν•  수 μžˆλ‹€λ©΄ λ‹€μ–‘ν•œ λ„€νŠΈμ›Œν¬ κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 있으며, λΆ„μ‚° μ‹œμŠ€ν…œ, ν΄λΌμš°λ“œ μ»΄ν“¨νŒ… λ“±κ³Ό 같은 ν˜„λŒ€μ μΈ μ»΄ν“¨νŒ… ν™˜κ²½μ—μ„œ ν•„μˆ˜μ μΈ κ°œλ…μ΄λ‹€.

2. TCP 톡신 ν”„λ‘œν† μ½œκ³Ό μ†ŒμΌ“μ˜ μ—­ν• 

2.1 TCP 톡신 ν”„λ‘œν† μ½œ

TCP(Transmission Control Protocol)λŠ” μΈν„°λ„·μ—μ„œ 데이터λ₯Ό μ•ˆμ •μ μœΌλ‘œ μ „μ†‘ν•˜κΈ° μœ„ν•œ ν”„λ‘œν† μ½œ 쀑 ν•˜λ‚˜μ΄λ‹€. TCPλŠ” μ—°κ²° 지ν–₯적이며, μ‹ λ’°μ„± μžˆλŠ” 데이터 전솑을 보μž₯ν•œλ‹€. 이λ₯Ό μœ„ν•΄ νŒ¨ν‚·μ˜ 손싀, 쀑볡, μˆœμ„œ λ³€κ²½ 등을 ν™•μΈν•˜κ³  λ³΅κ΅¬ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

TCPλŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ μ‹ λ’°μ„± μžˆλŠ” 데이터 μŠ€νŠΈλ¦Όμ„ λ§Œλ“€κΈ° μœ„ν•΄ 3-way handshakeλ₯Ό 톡해 연결을 μˆ˜λ¦½ν•œλ‹€. 데이터 전솑 ν›„μ—λŠ” 4-way handshakeλ₯Ό 톡해 연결을 μ’…λ£Œν•œλ‹€.

TCPλŠ” 전솑 μ œμ–΄, 흐름 μ œμ–΄, 혼작 μ œμ–΄ λ“± λ‹€μ–‘ν•œ κΈ°λŠ₯을 κ°–μΆ”κ³  μžˆμ–΄ μ•ˆμ •μ μΈ 데이터 전솑을 보μž₯ν•œλ‹€. ν•˜μ§€λ§Œ 이에 λ”°λ₯Έ μ˜€λ²„ν—€λ“œλ‘œ 인해 속도 μΈ‘λ©΄μ—μ„œλŠ” UDP에 λΉ„ν•΄ λŠλ¦¬λ‹€.

2.2 μ†ŒμΌ“μ˜ μ—­ν• 

μ†ŒμΌ“μ€ TCP 톡신을 μœ„ν•œ λ„€νŠΈμ›Œν¬ μΈν„°νŽ˜μ΄μŠ€λ‘œ, 데이터λ₯Ό 주고받을 수 μžˆλŠ” ν†΅λ‘œλ₯Ό ν˜•μ„±ν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ 간에 데이터λ₯Ό κ΅ν™˜ν•˜κΈ° μœ„ν•΄ μ†ŒμΌ“μ„ μƒμ„±ν•˜κ³  μ‚¬μš©ν•œλ‹€.

μ„œλ²„λŠ” μ†ŒμΌ“μ„ μƒμ„±ν•˜μ—¬ μ—°κ²° μš”μ²­μ„ λŒ€κΈ°ν•˜κ³ , ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„μ˜ IP μ£Όμ†Œμ™€ 포트 번호λ₯Ό 톡해 μ—°κ²° μš”μ²­μ„ 보낸닀. μ„œλ²„λŠ” μš”μ²­μ„ μˆ˜λ½ν•˜κ³  μ„œλ‘œ 데이터λ₯Ό 주고받을 수 μžˆλŠ” μ†ŒμΌ“μ„ μƒμ„±ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ™€ 연결을 ν˜•μ„±ν•œλ‹€.

μ†ŒμΌ“μ€ λ„€νŠΈμ›Œν¬ 레벨의 ν”„λ‘œκ·Έλž˜λ° μΈν„°νŽ˜μ΄μŠ€λ‘œ, λ°μ΄ν„°μ˜ μˆ˜μ‹ , 솑신, μ—°κ²° μ„€μ • 및 ν•΄μ œ, μ—λŸ¬ 처리 등을 μ œκ³΅ν•œλ‹€. λ„€νŠΈμ›Œν¬ μƒμ—μ„œ 데이터λ₯Ό μ£Όκ³ λ°›μœΌλ©°, μ†ŒμΌ“μ„ 톡해 솑신과 μˆ˜μ‹ μ„ μœ„ν•œ 버퍼λ₯Ό μƒμ„±ν•˜κ³  데이터λ₯Ό μ „μ†‘ν•œλ‹€.

μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” μ„œλ²„ μ†ŒμΌ“κ³Ό ν΄λΌμ΄μ–ΈνŠΈ μ†ŒμΌ“μ΄ μ‚¬μš©λ˜λ©°, μ„œλ²„ μ†ŒμΌ“μ€ μ—°κ²° μš”μ²­μ„ λŒ€κΈ°ν•˜κ³  μˆ˜λ½ν•˜λŠ” 역할을 ν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈ μ†ŒμΌ“μ€ μ„œλ²„μ™€μ˜ 연결을 μš”μ²­ν•˜κ³ , 연결이 수락되면 μ„œλ²„μ™€ 데이터λ₯Ό μ£Όκ³ λ°›λŠ”λ‹€.

μ†ŒμΌ“μ€ 인터넷 ν”„λ‘œν† μ½œ(IP) μ£Όμ†Œμ™€ 포트 번호λ₯Ό 기반으둜 μ—°κ²°κ³Ό 데이터 κ΅ν™˜μ„ μˆ˜ν–‰ν•˜λ©°, TCP ν”„λ‘œν† μ½œμ„ 톡해 μ•ˆμ •μ μΈ 데이터 전솑을 μ§€μ›ν•œλ‹€. μ†ŒμΌ“μ„ μ‚¬μš©ν•˜μ—¬ λ„€νŠΈμ›Œν¬ ν”„λ‘œκ·Έλž˜λ°μ„ κ΅¬ν˜„ν•  수 있으며, λ‹€μ–‘ν•œ λ„€νŠΈμ›Œν¬ κΈ°λŠ₯의 핡심 μš”μ†Œλ‘œ μ‚¬μš©λœλ‹€.

3. μžλ°” λ„€νŠΈμ›Œν¬ API μ†Œκ°œ

3.1 μžλ°” λ„€νŠΈμ›Œν¬ APIλž€?

μžλ°” λ„€νŠΈμ›Œν¬ APIλŠ” μžλ°”μ—μ„œ λ„€νŠΈμ›Œν¬ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ μ œκ³΅λ˜λŠ” API(Application Programming Interface)이닀. 이 APIλ₯Ό μ‚¬μš©ν•˜μ—¬ μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ„ κ΅¬ν˜„ν•˜κ³ , ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ 톡신을 μˆ˜ν–‰ν•  수 μžˆλ‹€. μžλ°”μ—μ„œλŠ” java.net νŒ¨ν‚€μ§€λ₯Ό 톡해 λ‹€μ–‘ν•œ λ„€νŠΈμ›Œν¬ κ΄€λ ¨ ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜κ³  μžˆλ‹€.

3.2 μžλ°” λ„€νŠΈμ›Œν¬ API의 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€

μžλ°” λ„€νŠΈμ›Œν¬ APIμ—λŠ” λ‹€μ–‘ν•œ ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€κ°€ ν¬ν•¨λ˜μ–΄ μžˆλ‹€. λͺ‡ 가지 μ£Όμš”ν•œ ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€λŠ” μ•„λž˜μ™€ κ°™λ‹€:

  • Socket: ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— μ—°κ²°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” 클래슀둜, μ„œλ²„μ˜ μ£Όμ†Œμ™€ 포트 번호λ₯Ό μ΄μš©ν•˜μ—¬ μ†ŒμΌ“μ„ μƒμ„±ν•œλ‹€.
  • ServerSocket: μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈμ˜ 접속을 λŒ€κΈ°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” 클래슀둜, μ§€μ •λœ 포트 λ²ˆν˜Έμ— λŒ€ν•œ ν΄λΌμ΄μ–ΈνŠΈμ˜ μ—°κ²° μš”μ²­μ„ μˆ˜λ½ν•œλ‹€.
  • InputStream 및 OutputStream: μ†ŒμΌ“μœΌλ‘œλΆ€ν„° 데이터λ₯Ό 읽고 μ“°κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” 슀트림 클래슀둜, λ°”μ΄νŠΈ λ‹¨μœ„λ‘œ 데이터λ₯Ό μ „μ†‘ν•œλ‹€.
  • DataInputStream 및 DataOutputStream: λ°”μ΄νŠΈ λ‹¨μœ„κ°€ μ•„λ‹Œ μžλ°”μ˜ κΈ°λ³Έ 데이터 νƒ€μž…μœΌλ‘œ 데이터λ₯Ό μ „μ†‘ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” 슀트림 클래슀둜, InputStream 및 OutputStream을 μƒμ†λ°›λŠ”λ‹€.
  • URL: URL(Uniform Resource Locator)을 μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” 클래슀둜, μ›Ή νŽ˜μ΄μ§€λ‚˜ νŒŒμΌμ— λŒ€ν•œ URL을 μƒμ„±ν•˜κ³  μ‘°μž‘ν•  수 μžˆλ‹€.
  • URLConnection: URL에 λŒ€ν•œ 연결을 μ—΄κΈ° μœ„ν•΄ μ‚¬μš©λ˜λ©°, μ—°κ²° ν›„ λ°μ΄ν„°μ˜ μ†‘μˆ˜μ‹ μ„ μœ„ν•œ μŠ€νŠΈλ¦Όμ„ μ œκ³΅ν•œλ‹€.

3.3 μžλ°” λ„€νŠΈμ›Œν¬ API의 ν™œμš©

μžλ°” λ„€νŠΈμ›Œν¬ APIλ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μ–‘ν•œ λ„€νŠΈμ›Œν¬ κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ™€ ν†΅μ‹ ν•˜κ³  데이터λ₯Ό μ£Όκ³ λ°›κΈ° μœ„ν•΄μ„œλŠ” μ†ŒμΌ“μ„ μƒμ„±ν•˜μ—¬ μ„œλ²„μ— μ—°κ²°ν•˜κ³ , InputStream 및 OutputStream을 μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό 주고받을 수 μžˆλ‹€. μ„œλ²„μ—μ„œλŠ” ServerSocket을 μ‚¬μš©ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ˜ μ—°κ²° μš”μ²­μ„ μˆ˜λ½ν•˜κ³  데이터λ₯Ό μ†‘μˆ˜μ‹ ν•  수 μžˆλ‹€.

μžλ°” λ„€νŠΈμ›Œν¬ APIλ₯Ό μ΄μš©ν•˜μ—¬ HTTP μš”μ²­μ„ λ³΄λ‚΄κ±°λ‚˜, μ›Ή μ„œλ²„μ™€ ν†΅μ‹ ν•˜λŠ” HTTP ν΄λΌμ΄μ–ΈνŠΈλ₯Ό κ΅¬ν˜„ν•  μˆ˜λ„ μžˆλ‹€. λ˜ν•œ, μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ„ ν™œμš©ν•˜μ—¬ μ±„νŒ… μ„œλ²„/ν΄λΌμ΄μ–ΈνŠΈ, 파일 전솑 κΈ°λŠ₯ 등을 κ΅¬ν˜„ν•  수 μžˆλ‹€.

μžλ°” λ„€νŠΈμ›Œν¬ APIλŠ” λ„€νŠΈμ›Œν¬ κΈ°λŠ₯에 λŒ€ν•œ 좔상화 계측을 μ œκ³΅ν•˜λ―€λ‘œ, κ°œλ°œμžλŠ” μƒμ„Έν•œ λ„€νŠΈμ›Œν¬ ν”„λ‘œν† μ½œμ„ μ΄ν•΄ν•˜μ§€ μ•Šκ³ λ„ λ„€νŠΈμ›Œν¬ κΈ°λŠ₯을 μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€. λ„€νŠΈμ›Œν¬ ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•΄ μžλ°”λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 μžλ°” λ„€νŠΈμ›Œν¬ APIλ₯Ό ν•™μŠ΅ν•˜κ³  ν™œμš©ν•˜λŠ” 것이 맀우 μœ μš©ν•˜λ‹€.

4. TCP μ†ŒμΌ“ 톡신 κ΅¬ν˜„ 방법

4.1 μ†ŒμΌ“ 생성 및 μ—°κ²°

TCP μ†ŒμΌ“ 톡신을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ¨Όμ € ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ 각각 μ†ŒμΌ“μ„ 생성해야 ν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈ μ†ŒμΌ“μ€ μ„œλ²„μ˜ IP μ£Όμ†Œμ™€ 포트 번호λ₯Ό μ΄μš©ν•˜μ—¬ μƒμ„±ν•˜κ³ , μ„œλ²„ μ†ŒμΌ“μ€ νŠΉμ • 포트 번호λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ„±ν•œλ‹€.

ν΄λΌμ΄μ–ΈνŠΈ μ†ŒμΌ“μ€ λ‹€μŒκ³Ό 같이 생성할 수 μžˆλ‹€:

Socket clientSocket = new Socket("μ„œλ²„ IP μ£Όμ†Œ", 포트 번호);

μ„œλ²„ μ†ŒμΌ“μ€ λ‹€μŒκ³Ό 같이 μƒμ„±ν•˜κ³  μ—°κ²° μš”μ²­μ„ λŒ€κΈ°ν•  수 μžˆλ‹€:

ServerSocket serverSocket = new ServerSocket(포트 번호);
Socket clientSocket = serverSocket.accept(); // ν΄λΌμ΄μ–ΈνŠΈμ˜ μ—°κ²° μš”μ²­ 수락

4.2 데이터 μ†‘μˆ˜μ‹ 

μ†ŒμΌ“μ΄ μƒμ„±λ˜κ³  연결이 ν˜•μ„±λœ ν›„μ—λŠ” 데이터λ₯Ό 주고받을 수 μžˆλ‹€. λ°μ΄ν„°μ˜ μ†‘μˆ˜μ‹ μ€ InputStreamκ³Ό OutputStream을 μ΄μš©ν•˜μ—¬ 이루어진닀.

ν΄λΌμ΄μ–ΈνŠΈ μ†ŒμΌ“μ—μ„œ 데이터λ₯Ό λ³΄λ‚΄λŠ” μ˜ˆμ‹œλŠ” λ‹€μŒκ³Ό κ°™λ‹€:

OutputStream outputStream = clientSocket.getOutputStream();
outputStream.write(데이터);

μ„œλ²„ μ†ŒμΌ“μ—μ„œ 데이터λ₯Ό λ°›λŠ” μ˜ˆμ‹œλŠ” λ‹€μŒκ³Ό κ°™λ‹€:

InputStream inputStream = clientSocket.getInputStream();
byte[] buffer = new byte[1024];
int bytesRead = inputStream.read(buffer);
String receivedData = new String(buffer, 0, bytesRead);

4.3 μ†ŒμΌ“ μ’…λ£Œ

데이터 μ†‘μˆ˜μ‹ μ΄ μ™„λ£Œλ˜κ³  연결을 μ’…λ£Œν•˜κΈ° μœ„ν•΄μ„œλŠ” μ†ŒμΌ“μ„ λ‹«μ•„μ•Ό ν•œλ‹€. μ†ŒμΌ“μ„ λ‹«μœΌλ©΄ ν•΄λ‹Ή μ†ŒμΌ“μœΌλ‘œμ˜ μž…μΆœλ ₯ 및 연결이 μ’…λ£Œλœλ‹€.

ν΄λΌμ΄μ–ΈνŠΈ μ†ŒμΌ“μ˜ μ’…λ£Œ μ˜ˆμ‹œλŠ” λ‹€μŒκ³Ό κ°™λ‹€:

clientSocket.close();

μ„œλ²„ μ†ŒμΌ“μ˜ μ’…λ£Œ μ˜ˆμ‹œλŠ” λ‹€μŒκ³Ό κ°™λ‹€:

serverSocket.close();

4.4 μ˜ˆμ™Έ 처리

μ†ŒμΌ“ 톡신을 κ΅¬ν˜„ν•  λ•ŒλŠ” μ˜ˆμ™Έ μ²˜λ¦¬κ°€ ν•„μš”ν•˜λ‹€. μ†ŒμΌ“ 톡신 μ€‘μ—λŠ” λ‹€μ–‘ν•œ 였λ₯˜κ°€ λ°œμƒν•  수 있으며, 이λ₯Ό 적절히 μ²˜λ¦¬ν•˜μ—¬ μ•ˆμ •μ μΈ ν”„λ‘œκ·Έλž¨μ„ κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.

μ£Όμš”ν•œ μ˜ˆμ™Έλ“€ 쀑 μΌλΆ€λŠ” λ‹€μŒκ³Ό κ°™λ‹€:

  • IOException: μž…μΆœλ ₯ λ™μž‘ 쀑에 였λ₯˜κ°€ λ°œμƒν•  경우
  • SocketException: μ†ŒμΌ“ λ™μž‘ 쀑에 였λ₯˜κ°€ λ°œμƒν•  경우
  • UnknownHostException: 주어진 호슀트 이름이 잘λͺ»λœ 경우

μ΄λŸ¬ν•œ μ˜ˆμ™Έλ“€μ„ try-catch 문을 μ΄μš©ν•˜μ—¬ μ²˜λ¦¬ν•˜κ³ , 였λ₯˜μ— λŒ€ν•œ μ μ ˆν•œ λŒ€μ‘μ„ μ„€μ •ν•΄μ•Ό ν•œλ‹€.

4.5 λ³΄μ•ˆ 및 μ„±λŠ₯ κ³ λ €

μ†ŒμΌ“ 톡신을 κ΅¬ν˜„ν•  λ•ŒλŠ” λ³΄μ•ˆκ³Ό μ„±λŠ₯도 κ³ λ €ν•΄μ•Ό ν•œλ‹€. λ°μ΄ν„°μ˜ μ•ˆμ •μ„±μ„ 보μž₯ν•˜κΈ° μœ„ν•΄ SSL(Secure Sockets Layer)κ³Ό 같은 ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•  수 μžˆλ‹€. SSL은 λ°μ΄ν„°μ˜ μ•”ν˜Έν™”μ™€ 인증을 μ œκ³΅ν•˜μ—¬ μ•ˆμ „ν•œ 톡신을 κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.

λ˜ν•œ, λŒ€λŸ‰μ˜ 데이터 μ†‘μˆ˜μ‹ μ΄ ν•„μš”ν•œ κ²½μš°μ—λŠ” 버퍼 크기 및 데이터 청크 크기λ₯Ό 적절히 μ„€μ •ν•˜μ—¬ μ„±λŠ₯을 μ΅œμ ν™”ν•  수 μžˆλ‹€. μ΄λŸ¬ν•œ μ„±λŠ₯ ν–₯상을 μœ„ν•΄ 넀이글 μ•Œκ³ λ¦¬μ¦˜(Nagle's algorithm)을 μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.

4.6 μ†ŒμΌ“ 톡신 ν”„λ‘œκ·Έλž¨ μ˜ˆμ‹œ

μ•„λž˜λŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ κ°„λ‹¨ν•œ μ†ŒμΌ“ 톡신 μ˜ˆμ‹œμ΄λ‹€:

// μ„œλ²„
ServerSocket serverSocket = new ServerSocket(5000);
Socket clientSocket = serverSocket.accept();
OutputStream outputStream = clientSocket.getOutputStream();
outputStream.write("Hello from server".getBytes());
clientSocket.close();
serverSocket.close();

// ν΄λΌμ΄μ–ΈνŠΈ
Socket clientSocket = new Socket("μ„œλ²„ IP μ£Όμ†Œ", 5000);
InputStream inputStream = clientSocket.getInputStream();
byte[] buffer = new byte[1024];
int bytesRead = inputStream.read(buffer);
String receivedData = new String(buffer, 0, bytesRead);
clientSocket.close();

이 μ˜ˆμ‹œλŠ” μ„œλ²„κ°€ 'Hello from server'λΌλŠ” λ©”μ‹œμ§€λ₯Ό 보내고, ν΄λΌμ΄μ–ΈνŠΈκ°€ ν•΄λ‹Ή λ©”μ‹œμ§€λ₯Ό λ°›λŠ” κ°„λ‹¨ν•œ μ†ŒμΌ“ 톡신 ν”„λ‘œκ·Έλž¨μ΄λ‹€.

5. TCP μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ˜ ν™œμš©κ³Ό μž₯단점

5.1 TCP μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ˜ ν™œμš©

TCP μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ€ λ‹€μ–‘ν•œ λΆ„μ•Όμ—μ„œ ν™œμš©λ˜κ³  μžˆλ‹€. λͺ‡ 가지 μ£Όμš”ν•œ ν™œμš© μ‚¬λ‘€λŠ” λ‹€μŒκ³Ό κ°™λ‹€:

  • μ›Ή μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ 톡신: TCP μ†ŒμΌ“μ„ μ‚¬μš©ν•˜μ—¬ HTTP μš”μ²­ 및 응닡을 μ „μ†‘ν•˜λŠ” 데 μ‚¬μš©λœλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” μ›Ή μ„œλ²„μ— μ—°κ²°ν•˜μ—¬ μ›Ή νŽ˜μ΄μ§€λ₯Ό μš”μ²­ν•˜κ³ , μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ ν•΄λ‹Ή νŽ˜μ΄μ§€λ₯Ό μ „μ†‘ν•œλ‹€.

  • μ±„νŒ… ν”„λ‘œκ·Έλž¨: TCP μ†ŒμΌ“μ„ μ‚¬μš©ν•˜μ—¬ μ±„νŒ… μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ κ°„μ˜ μ‹€μ‹œκ°„ 톡신을 κ΅¬ν˜„ν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈλ“€μ€ μ„œλ²„μ— μ—°κ²°ν•˜μ—¬ λ©”μ‹œμ§€λ₯Ό 주고받을 수 μžˆλ‹€.

  • 파일 전솑: TCP μ†ŒμΌ“μ„ μ‚¬μš©ν•˜μ—¬ νŒŒμΌμ„ μ „μ†‘ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ κ΅¬ν˜„ν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„μ— νŒŒμΌμ„ μ—…λ‘œλ“œν•˜κ±°λ‚˜, μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•  수 μžˆλ‹€.

  • 리λͺ¨νŠΈ 디버깅: TCP μ†ŒμΌ“μ„ μ‚¬μš©ν•˜μ—¬ 원격 μ»΄ν“¨ν„°μ—μ„œ λ™μž‘ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ˜ 디버깅을 μ§€μ›ν•œλ‹€. 디버그 정보λ₯Ό μ†‘μ‹ ν•˜κ³  μˆ˜μ‹ ν•˜κΈ° μœ„ν•΄ TCP μ†ŒμΌ“μ΄ μ‚¬μš©λœλ‹€.

  • λ©€ν‹°ν”Œλ ˆμ΄μ–΄ κ²Œμž„: TCP μ†ŒμΌ“μ„ μ‚¬μš©ν•˜μ—¬ λ©€ν‹°ν”Œλ ˆμ΄μ–΄ κ²Œμž„μ—μ„œ ν”Œλ ˆμ΄μ–΄λ“€ κ°„μ˜ 톡신을 κ΅¬ν˜„ν•œλ‹€. κ²Œμž„ 데이터, μƒνƒœ 및 λͺ…령을 μ „λ‹¬ν•˜κΈ° μœ„ν•΄ TCP μ†ŒμΌ“μ΄ ν™œμš©λœλ‹€.

5.2 TCP μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ˜ μž₯점

TCP μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ€ λ‹€μŒκ³Ό 같은 μž₯점을 가지고 μžˆλ‹€:

  • μ‹ λ’°μ„±: TCPλŠ” λ„€νŠΈμ›Œν¬ μƒμ—μ„œ μ‹ λ’°μ„± μžˆλŠ” 데이터 전솑을 μ œκ³΅ν•œλ‹€. 데이터 전솑 쀑에 λ°œμƒν•˜λŠ” 손싀, 손상, 쀑볡, μˆœμ„œ λ³€κ²½ λ“±μ˜ 문제λ₯Ό μžλ™μœΌλ‘œ μ²˜λ¦¬ν•˜μ—¬ μ•ˆμ •μ μΈ 톡신을 κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.

  • μ–‘λ°©ν–₯ 톡신: TCP μ†ŒμΌ“μ€ 전이쀑(full-duplex) 톡신을 μ§€μ›ν•˜μ—¬ λ™μ‹œμ— μ–‘λ°©ν–₯으둜 데이터λ₯Ό 주고받을 수 μžˆλ‹€. λ”°λΌμ„œ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ μ‹€μ‹œκ°„μœΌλ‘œ 데이터λ₯Ό μ£Όκ³ λ°›λŠ” μ–‘λ°©ν–₯ 톡신에 μ ν•©ν•˜λ‹€.

  • 포트 기반의 톡신: TCP μ†ŒμΌ“μ€ 포트 번호λ₯Ό 기반으둜 연결을 ν˜•μ„±ν•˜κ³  κ΄€λ¦¬ν•œλ‹€. 포트 번호λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μˆ˜μ˜ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— 연결될 수 있으며, 이λ₯Ό 톡해 닀쀑 접속을 μ§€μ›ν•˜κ³  효율적인 톡신을 κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.

5.3 TCP μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ˜ 단점

TCP μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ€ λͺ‡ 가지 단점도 가지고 μžˆλ‹€:

  • 속도: TCP μ†ŒμΌ“μ€ 신뒰성을 μœ„ν•΄ λ‹€μ–‘ν•œ κΈ°λŠ₯을 가지고 μžˆμ–΄ λ°μ΄ν„°μ˜ 전솑에 μ‹œκ°„μ΄ 더 걸릴 수 μžˆλ‹€. UDP μ†ŒμΌ“μ— λΉ„ν•΄ 전솑 속도가 느릴 수 μžˆλ‹€.

  • μ—°κ²° 지ν–₯μ„±: TCP μ†ŒμΌ“μ€ μ—°κ²° 지ν–₯적이닀. μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ 사이에 연결이 ν˜•μ„±λ˜μ–΄μ•Όλ§Œ 데이터λ₯Ό 주고받을 수 μžˆλ‹€. λ”°λΌμ„œ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— μ—°κ²°ν•˜κΈ° μœ„ν•΄ 좔가적인 단계가 ν•„μš”ν•˜λ©°, μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λŠ” μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•  수 μžˆλ‹€.

  • λ¦¬μ†ŒμŠ€ μš”κ΅¬: TCP μ†ŒμΌ“μ€ 신뒰성을 μœ„ν•΄ μ•½κ°„μ˜ μΆ”κ°€ λ¦¬μ†ŒμŠ€(λ©”λͺ¨λ¦¬, CPU)λ₯Ό μš”κ΅¬ν•œλ‹€. λ”°λΌμ„œ κ³ κ°λ‹΅κ²Œ μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ” 규λͺ¨κ°€ 큰 μ‹œμŠ€ν…œμ—μ„œλŠ” 좔가적인 λ¦¬μ†ŒμŠ€κ°€ ν•„μš”ν•  수 μžˆλ‹€.

5.4 TCP μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ˜ ν™œμš©κ³Ό μž₯단점 μš”μ•½

TCP μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ€ λ‹€μ–‘ν•œ λΆ„μ•Όμ—μ„œ 널리 ν™œμš©λ˜λ©°, μ‹ λ’°μ„±κ³Ό μ–‘λ°©ν–₯ ν†΅μ‹ μ˜ μž₯점을 가지고 μžˆλ‹€. μ›Ή μ„œλ²„ 톡신, μ±„νŒ… ν”„λ‘œκ·Έλž¨, 파일 전솑 λ“± μ—¬λŸ¬ 가지 μ‘μš© ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©λ  수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ UDP μ†ŒμΌ“μ— λΉ„ν•΄ 전솑 속도가 느리고, μ—°κ²° 지ν–₯μ„±κ³Ό 좔가적인 λ¦¬μ†ŒμŠ€ μš”κ΅¬κ°€ λ‹¨μ μœΌλ‘œ μž‘μš©ν•  수 μžˆλ‹€. λ”°λΌμ„œ 상황과 μš”κ΅¬μ‚¬ν•­μ— 맞게 TCP μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ„ ν™œμš©ν• μ§€ μ—¬λΆ€λ₯Ό κ³ λ €ν•΄μ•Ό ν•œλ‹€.

λŒ“κΈ€