Java/Java์ ์ ์
Chapter 16 - ๋คํธ์ํน
vividswan
2022. 5. 25.
Chapter 16 - ๋คํธ์ํน
1. ๋คํธ์ํน(Networking)
- ๋ ๋ ์ด์์ ์ปดํจํฐ๋ฅผ ์ผ์ด๋ธ๋ก ์ฐ๊ฒฐํ์ฌ ๋คํธ์ํฌ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ
- ์ธํฐ๋ท์ ์ด์ฉํ๋ ๋ค์ํ ๋คํธ์ํฌ ์ดํ๋ฆฌ์ผ์ด์
๋ค์ด ๋์ด๋จ
- ์๋ฐ์์ ์ ๊ณตํ๋ java.net ํจํค์ง๋ฅผ ์ฌ์ฉํด์ ๋คํธ์ํฌ ์ดํ๋ฆฌ์ผ์ด์
์ ๋ฐ์ดํฐ ํต์ ๋ถ๋ถ ์์ฑ ๊ฐ๋ฅ
1.1 ํด๋ผ์ด์ธํธ/์๋ฒ(client/server)
- ์ปดํจํฐ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ญํ ๋ก ๊ตฌ๋ถํ๋ ๊ฐ๋
- ํ๋์จ์ด์ ์ฌ์์ผ๋ก ๊ตฌ๋ถํ๋ ๊ฒ์ด ์๋
- ์๋ฒ๋ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ์ปดํจํฐ
- ์ผ๋ฐ์ ์ผ๋ก ๋ค์์ ํด๋ผ์ด์ธํธ์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณต
- ํ์ผ ์๋ฒ, ๋ฉ์ผ ์๋ฒ, ์ดํ๋ฆฌ์ผ์ด์
์๋ฒ ๋ฑ์ด ์กด์ฌ
- ํด๋ผ์ด์ธํธ๋ ์๋น์ค๋ฅผ ์ฌ์ฉํ๋ ์ปดํจํฐ
- ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ฒญ๋ฐ์ ์์
์ ์๋ฒ๊ฐ ์ฒ๋ฆฌํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์๋น์ค
- ์๋ฒ๋ ์๋ฒ ํ๋ก๊ทธ๋จ, ํด๋ผ์ด์ธํธ๋ ์๋ฒ ํ๋ก๊ทธ๋จ๊ณผ ์ฐ๊ฒฐํ ์ ์๋ ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋จ์ด ํ์
- ๋คํธ์ํฌ ๊ตฌ์ฑ ์ ์ ์ฉ ์๋ฒ๋ฅผ ๋๋ ๊ฒ์ ์๋ฒ ๊ธฐ๋ฐ ๋ชจ๋ธ
- ์๋ฒ ๊ตฌ์ถ ๋น์ฉ๊ณผ ๊ด๋ฆฌ ๋น์ฉ์ด ๋ค์ง๋ง ๊ด๋ฆฌ์ ๋ณด์์ด ์ฉ์ดํ๊ณ ์์ ์ ์ธ ์๋น์ค
- ๋ณ๋์ ์ ์ฉ ์๋ฒ ์์ด ๊ฐ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ ์ญํ ์ ๋์์ ์ํํ๋ ๊ฒ์ด P2P ๋ชจ๋ธ(peer-to-peer)
- ์๋ฒ ๊ตฌ์ถ ๋ฐ ์ด์ฉ ๋น์ฉ์ ์ ๊ฐํ ์ ์๊ณ ์์ ํ์ฉ์ ๊ทน๋ํํ ์ ์์ง๋ง ์์์ ๊ด๋ฆฌ๊ฐ ์ด๋ ต๊ณ ๋ณด์์ด ์ทจ์ฝ
1.2 IP ์ฃผ์(IP address)
- ์ปดํจํฐ(ํธ์คํธ)๋ฅผ ๊ตฌ๋ณํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ณ ์ ํ ๊ฐ
- ์ธํฐ๋ท์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ปดํจํฐ๊ฐ ๊ฐ์ง
- 4 byte(32bit)์ ์ ์๋ก ๊ตฌ์ฑ
- ๋คํธ์ํฌ ์ฃผ์์ ํธ์คํธ ์ฃผ์๋ก ๋๋์ด์ง
- ๊ฐ๊ฐ ์ฐจ์งํ๋ bit ์๋ ๊ตฌ์ฑ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง
- ๊ฐ์ ๋คํธ์ํฌ์ ํฌํจ๋์ด ์๋ค๋ฉด ๋คํธ์ํฌ ์ฃผ์๊ฐ ๋์ผ
- IP ์ฃผ์์ ์๋ธ๋ท ๋ง์คํฌ๋ฅผ ๋นํธ ์ฐ์ฐ์(&)๋ก ์ฐ์ฐํ๋ฉด IP ์ฃผ์์์ ๋คํธ์ํฌ ์ฃผ์๋ง์ ๋ฝ์๋ผ ์ ์์
- ํธ์คํธ ์ฃผ์๊ฐ 0์ธ ๊ฒ์ ๋คํธ์ํฌ ์์ , 255๋ ๋ธ๋ก๋์บ์คํธ ์ฃผ์
1.3 InetAddress
- ์๋ฐ์์ IP ์ฃผ์๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ํด๋์ค
- IP ์ฃผ์, ๋๋ฉ์ธ๋ช
์ ์ง์ ๋ ๋ชจ๋ ํธ์คํธ์ IP ์ฃผ์, ํธ์คํธ์ ์ด๋ฆ ๋ฑ๋ฑ์ ํ์ธํ ์ ์๋ค.
1.4 URL(Uniform Resource Locator)
- ์ธํฐ๋ท์ ์กด์ฌํ๋ ์ฌ๋ฌ ์๋ฒ๋ค์ด ์ ๊ณตํ๋ ์์์ ์ ๊ทผํ ์ ์๋ ์ฃผ์๋ฅผ ํํ
- 'ํ๋กํ ์ฝ://ํธ์คํธ๋ช
:ํฌํธ๋ฒํธ/๊ฒฝ๋ก๋ช
/ํ์ผ๋ช
?์ฟผ๋ฆฌ์คํธ๋ง#์ฐธ์กฐ'์ ํํ
- ํ๋กํ ์ฝ : ์๋ฒ์ ํต์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํต์ ๊ท์ฝ
- ํธ์คํธ๋ช
: ์์์ ์ ๊ณตํ๋ ์๋ฒ ์ด๋ฆ
- ํฌํธ ๋ฒํธ : ํต์ ์ ์ฌ์ฉ๋๋ ์๋ฒ์ ํฌํธ ๋ฒํธ
- ๊ฒฝ๋ก๋ช
: ์ ๊ทผํ๋ ค๋ ์์์ด ์ ์ฅ๋ ์๋ฒ์์ ์์น
- ํ์ผ๋ช
: ์ ๊ทผํ๋ ค๋ ์์์ ์ด๋ฆ
- ์ฟผ๋ฆฌ : URL์์ '?' ์ดํ์ ๋ถ๋ถ
- ์ฐธ์กฐ : URL์์ '#' ์ดํ์ ๋ถ๋ถ
- ์๋ฐ์์๋ URL์ ๋ค๋ฃจ๊ธฐ ์ํด URL ํด๋์ค๋ฅผ ์ ๊ณต
URL url = new URL("{{URL ์ฃผ์}}")
์ ๊ฐ์ ํ์์ผ๋ก ์ธ์คํด์ค ์์ฑ
1.5 URLConnection
- ์ดํ๋ฆฌ์ผ์ด์
๊ณผ URL ๊ฐ์ ํต์ ์ฐ๊ฒฐ์ ๋ํ๋ด๋ ํด๋์ค์ ์ต์์ ํด๋์ค (์ถ์ ํด๋์ค)
- ์์ ํด๋์ค๋ก HttpURLConnection, JarURLConnection
- openConnection()์ HttpURLConnection์ ๋ฐํ
- openConnection()์ URL ํด๋์ค์ ๋ฉ์๋
- ์ฐ๊ฒฐํ๊ณ ์ ํ๋ ์์์ ์ ๊ทผํ๊ณ ์ฝ๊ณ ์ฐ๊ธฐ๋ฅผ ํ ์ ์์
- ํค๋์ ํ๋๊ฐ, ์ฐ๊ฒฐ ์ข
๋ฃ ์๊ฐ ์ง์ , content ๊ฐ์ฒด ๋ฐํ, ํ์ฉ ๊ถํ ๋ฐํ ๋ฑ๋ฑ ...
- URL ๊ฐ์ฒด ์์ฑ ์ URL์ด ์ ํจํ์ง ์์ผ๋ฉด Malformed - URLException์ด ๋ฐ์
- URL์ openStream() ๋ฉ์๋๋ openConnection์ ํธ์ถํด์ URLConnection์ ์ป์ ๋ค์ getInputStream()์ ํธ์ถํ ๊ฒ๊ณผ ๊ฐ๋ค.
2. ์์ผ ํ๋ก๊ทธ๋๋ฐ
- ์์ผ์ ์ด์ฉํ ํ๋ก๊ทธ๋๋ฐ
- ์์ผ์ ํ๋ก์ธ์ค ๊ฐ์ ํต์ ์ ์ฌ์ฉ๋๋ ์์ชฝ ๋๋จ์ ์๋ฏธ
- ๋ ์ฌ๋์ด ํต์ ํ๊ธฐ ์ํด ํ์ํ ์ ํ๊ธฐ์ ๋น์ทํ๋ค.
- ์๋ฐ์์๋ java.net ํจํค์ง๋ฅผ ํตํด ์์ผ ํ๋ก๊ทธ๋๋ฐ์ ์ง์
2.1 TCP์ UDP
- TCP/IP ํ๋กํ ์ฝ์ ์ด๊ธฐ์ข
์์คํ
๊ฐ์ ํต์ ์ ์ํ ํ์ค ํ๋กํ ์ฝ
- TCP์ UDP ๋ชจ๋ TCP/IP ํ๋กํ ์ฝ์ ํฌํจ (OSI 7๊ณ์ธต์ ์ ์ก๊ณ์ธต์ ํด๋น)
- TCP
- ์ฐ๊ฒฐ ๊ธฐ๋ฐ (์ฐ๊ฒฐ ํ ํต์ , 1:1 ํต์ )
- ๋ฐ์ดํฐ์ ๊ฒฝ๊ณ๋ฅผ ๊ตฌ๋ถ ์ ํจ
- ์ ๋ขฐ ์๋ ๋ฐ์ดํฐ ์ ์ก (์์, ์์ ์ฌ๋ถ ๋ณด์ฅ, ํจํท ๊ด๋ฆฌํด ์ค ํ์ X)
- UDP ๋ณด๋ค ๋๋ฆผ
- Socket, ServerSocket ํด๋์ค์ ๊ด๋ จ
- UDP
- ๋น์ฐ๊ฒฐ๊ธฐ๋ฐ (์ฐ๊ฒฐ ์์ด ํต์ , 1:1, 1:n, n:n ํต์ ๋ฐฉ์)
- ๋ฐ์ดํฐ์ ๊ฒฝ๊ณ๋ฅผ ๊ตฌ๋ถ
- ์ ๋ขฐ์ฑ ์๋ ๋ฐ์ดํฐ ์ ์ก (์์ ๋ฐ๋ ์ ์์, ์์ ์ฌ๋ถ ํ์ธ X, ํจํท ๊ด๋ฆฌํด ์ฃผ์ด์ผ ํจ)
- TCP ๋ณด๋ค ์ ์ก์๋ ๋น ๋ฆ
- DatagramSocket, DatagramPacket, MulticastSocket ํด๋์ค์ ๊ด๋ จ
2.2 TCP ์์ผ ํ๋ก๊ทธ๋๋ฐ
- ํต์ ๊ณผ์
- ์๋ฒ ํ๋ก๊ทธ๋จ์ ํน์ ํฌํธ์์ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ ์์ฒญ์ ์ฒ๋ฆฌํ ์๋ฒ ์์ผ์ ์ค๋น
- ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋จ์ ์ ์ํ ์๋ฒ์ IP ์ฃผ์, ํฌํธ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ผ์ ์์ฑ ํ ์๋ฒ์ ์ฐ๊ฒฐ
- ์๋ฒ ์์ผ์ ํด๋ผ์ด์ธํธ ์์ฒญ์ด ์ฌ ์ ์๋ฒ์ ์๋ก์ด ์์ผ์ ์์ฑ ํ ํด๋ผ์ด์ธํธ์ ์์ผ๊ณผ ์ฐ๊ฒฐ
- ํด๋ผ์ด์ธํธ ์์ผ๊ณผ ์์ฑ๋ ์๋ฒ์ ์์ผ์ ์๋ฒ ์์ผ๊ณผ ๊ด๊ณ์์ด ์ผ๋์ผ ํต์
- ์๋ฒ ์์ผ์์๋ ์ค์ง์ ์ธ ํต์ X
- ์๋ก์ด ์์ผ์ ์์ฑํ์ฌ ์ฐ๊ฒฐํด ์ฃผ๋ ์ญํ
- ์๋ฒ ์์ผ์ ํฌํธ๋ฅผ ๋
์ (๋ค๋ฅธ ์์ผ๋ค์ ํ๋์ ํฌํธ ๊ณต์ ๊ฐ๋ฅ)
- ํ๋กํ ์ฝ์ด ๋ค๋ฅด๋ฉด ํฌํธ๋ฅผ ๊ณต์ ๊ฐ๋ฅ
- ํฌํธ๋ ํธ์คํธ๊ฐ ์ธ๋ถ์ ํต์ ์ ํ๊ธฐ ์ํ ํต๋ก์ด๋ฉฐ 0~65536์ ๋ฒ์
- ๊ธฐ์กด์ ์ฌ์ฉํ๋ ๋ฒํธ๋ค์ ํผํ๊ธฐ ์ํด 1023๋ฒ ์ด์์ ๋ฒํธ ์ค ์ฌ์ฉํ์ง ์๋ ํฌํธ๋ฅผ ๊ณจ๋ผ์ ์ฌ์ฉ
- ์์ผ์ ์
๋ ฅ ์คํธ๋ฆผ๊ณผ ์ถ๋ ฅ ์คํธ๋ฆผ์ ์๋ํธ ์์ผ์ ์คํธ๋ฆผ๋ค๊ณผ ๊ต์ฐจ ์ฐ๊ฒฐํ์ฌ ํต์
- ์์ผ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ํด๋์ค
- Socket : ํ๋ก์ธ์ค ๊ฐ์ ํต์ ์ ๋ด๋น, InputStream๊ณผ OutputStream์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์ด ์คํธ๋ฆผ์ ํตํด ํต์
- ServerSocket : ํฌํธ์ ์ฐ๊ฒฐ๋์ด ์ธ๋ถ์ ์ฐ๊ฒฐ ์์ฒญ์ด ์ค๋ฉด Socket์ ์์ฑ ํ ํต์ ์ด ์ด๋ฃจ์ด์ง๊ฒ ํ๋ฉฐ ํฌํธ๋ฅผ ๋
์ (ํ๋กํ ์ฝ์ด ๋ค๋ฅด๋ฉด ๊ณต์ ๊ฐ๋ฅ)
- ServerSocket
- ์์ฑ์์ ์ฌ์ฉํ ํฌํธ ๋ฒํธ๋ฅผ ์ง์
accept()
๋ฉ์๋ -> ๋๊ธฐ ์ํ๋ก ๋ง๋ ํ ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋จ์ ์ฐ๊ฒฐ ์์ฒญ์ด ์ค๋ฉด ์๋ก์ด ์์ผ์ ์์ฑํด์ ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋จ์ ์์ผ๊ณผ ์ฐ๊ฒฐ
- setSoTimeout(int timeout)์ ์ฌ์ฉํด์ ์๋ฒ ์์ผ์ ๋๊ธฐ์๊ฐ ์ง์ ๊ฐ๋ฅ (์ฒ๋ถ์ ์ผ์ด ๋จ์, 0์ผ ์ ์ ํ ์๊ฐ ์์ด ๋๊ธฐ, ๋๊ธฐ ์๊ฐ ๊ฒฝ๊ณผ ํ SocketTimeoutException ๋ฐ์)
- ์๋ฒ์์ ์์
์ด ๋๋๋ฉด ์์ผ๊ณผ ์คํธ๋ฆผ์ ๋ซ์์ผ ํ๋ค.
- ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ ๊ณผ์
- ์๋ฒ ํ๋ก๊ทธ๋จ์ ์คํ
- ์๋ฒ ์์ผ์ ์์ฑ
- ์๋ฒ ์์ผ์ ๋๊ธฐ ์ํ๋ก ๋ง๋ฆ
- ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋จ์์ ์์ผ์ ์์ฑํ์ฌ ์๋ฒ ์์ผ์ ์ฐ๊ฒฐ์ ์์ฒญ
- ์๋ฒ ์์ผ์ ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋จ์ ์ฐ๊ฒฐ ์์ฒญ์ ๋ฐ์ ์๋ก์ด ์์ผ ์์ฑ ๋ค ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋จ์ ์ฐ๊ฒฐ ์์ฒญ์ด ์ค๋ฉด ์๋ก์ด ์์ผ์ ์์ฑ ํ ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋จ์ ์์ผ๊ณผ ์ฐ๊ฒฐ
- Socket
- getPort() : ์๋ํธ ์์ผ์ ์์๋ผ ์ ์์
- getLocalPort() : ์์ผ ์์ ์ด ์ฌ์ฉํ๋ ํฌํธ๋ฅผ ์์๋ผ ์ ์์
- ์๋ฒ ์์ผ์ด ์๋ ์์ผ์ ์๋ฒ ์์ผ์ด ์ฌ์ฉํ๊ณ ์๋ ํฌํธ๋ฅผ ์ฌ์ฉํ ์ ์์
- ์ฌ๋ฌ ๊ฐ์ ์ฐ๋ ๋๋ฅผ ์์ฑํด์ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํ ์ ์๋ค.
- ํด๋ผ์ด์ธํธ์ ์๊ฐ ๋ง์ ๋๋ ์์ฒญ์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข์
- ์์ผ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ก์ ํ๋ ์์
๊ณผ ์์ ํ๋ ์์
์ ๋ณ๋์ ์ฐ๋ ๋๋ก ์ฒ๋ฆฌํ๋๋ก ํ ์ ์๋ค.
2.3 UDP ์์ผ ํ๋ก๊ทธ๋๋ฐ
- UDP ์์ผ ํ๋ก๊ทธ๋๋ฐ์์๋ DatagramSocket๊ณผ DatagramPacket์ ์ฌ์ฉ
- ์ฐ๊ฒฐ ์งํฅ์ ์ธ ํ๋กํ ์ฝ์ด ์๋๋ฏ๋ก ServerSocket์ด ํ์ X
- DatagramSocket์ ์์ผ์ผ๋ก ์ฌ์ฉํ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ DatagramPacket์ ๋ด์์ ์ ์ก
- DatagramPacket์ ํค๋์ ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ (ํค๋์ ์์ ํ ํธ์คํธ์ ์ ๋ณด๊ฐ ์ ์ฅ)
- ํด๋ผ์ด์ธํธ๊ฐ DatagramPacket์ ์์ฑํด์ DatagramSocket์ผ๋ก ์๋ฒ์ ์ ์กํ๋ฉด, ์๋ฒ๋ ์ ์ก๋ฐ์ DatagramPacket์ getAddress(), getPort()๋ฅผ ํธ์ถํด์ ํด๋ผ์ด์ธํธ์ ์ ๋ณด๋ฅผ ์ป์ด์ ์๋ฒ ์๊ฐ์ DatagramPacket์ ๋ด์์ ์ ์ก
'Java/Java์ ์ ์' ๊ด๋ จ๊ธ