๊ด€๋ฆฌ ๋ฉ”๋‰ด

IT’s Portfolio

[Java] Lecture - Day 19 ๋ณธ๋ฌธ

Development Study/Java

[Java] Lecture - Day 19

f1r3_r41n 2024. 6. 7. 12:34
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ–ฅ Basic Java - Day 19

๐Ÿ‘‰๐Ÿป [Chapter 14] ์ž๋ฐ” ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

TCP/IP

  • TCP(Transmission Control Protocol)
    • ๋‘ ์‹œ์Šคํ…œ ๊ฐ„์— ์‹ ๋ขฐ์„ฑ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ „์†ก์„ ๊ด€์žฅํ•˜๋Š” ํ”„๋กœํ† ์ฝœ
    • ์žฌ์ „์†ก์— ์˜ํ•œ ์˜ค๋ฅ˜์ œ์–ด, ์˜ค๋”๋ง, ํ๋ฆ„์ œ์–ด, ์—ฐ๊ฒฐํ˜• ํ†ต์‹ 
    • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ
      • ์ด๋ฉ”์ผ, FTP, HTTP
  • UDP(User Datagram Protocol)
    • ์žฌ์ „์†ก, ํ๋ฆ„์ œ์–ด๊ฐ€ ์—†๋Š” ๋น„์—ฐ๊ฒฐํ˜• ํ†ต์‹ 
  • IP(Internet Protocol)
    • ํŒจํ‚ท ๊ตํ™˜ ๋„คํŠธ์›Œํฌ์—์„œ ์†ก์‹  ํ˜ธ์ŠคํŠธ์™€ ์ˆ˜์‹  ํ˜ธ์ŠคํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ฒƒ์„ ๊ด€์žฅํ•˜๋Š” ํ”„๋กœํ† ์ฝœ

IP ์ฃผ์†Œ

  • ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ์œ ์ผํ•˜๊ฒŒ ์‹๋ณ„๋  ์ˆ˜ ์žˆ๋Š” ์ปดํ“จํ„ฐ ์ฃผ์†Œ
    • ์ˆซ์ž๋กœ ๊ตฌ์„ฑ๋œ ์ฃผ์†Œ
  • ์ˆซ์ž๋กœ ๋œ ์ฃผ์†Œ๋Š” ๊ธฐ์–ตํ•˜๊ธฐ ์–ด๋ ค์šฐ๋ฏ€๋กœ www.naver.com๊ณผ ๊ฐ™์€ ๋ฌธ์ž์—ด๋กœ ๊ตฌ์„ฑ๋œ ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ” ์‚ฌ์šฉ
    • DNS(Domain Name System)
      • ๋ฌธ์ž์—ด๋กœ ๊ตฌ์„ฑ๋œ ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ์ˆซ์ž๋กœ ๊ตฌ์„ฑ๋œ IP ์ฃผ์†Œ๋กœ ์ž๋™ ๋ณ€ํ™˜
  • ํ˜„์žฌ 32๋น„ํŠธ์˜ IPv4๊ฐ€ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Œ
    • IP ์ฃผ์†Œ ๊ณ ๊ฐˆ๋กœ ์ธํ•ด 128๋น„ํŠธ์˜ IPv6๋ฅผ ์ ์  ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ

InetAddress ํด๋ž˜์Šค

  • ์ธํ„ฐ๋„ท ์ฃผ์†Œ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง
  • java.net.InetAddress
boolean equals(InetAddress other)   // ํ˜„ ๊ฐ์ฒด๊ฐ€ other ๊ฐ์ฒด์™€ ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๋ฉด true, ์•„๋‹ˆ๋ฉด false ๋ฐ˜ํ™˜
byte[] getAddress() // ์ฃผ์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” 4๊ฐœ์˜ ์š”์†Œ๋ฅผ ๊ฐ€์ง„ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด ๋ฐ˜ํ™˜
String getHostAddress() // ์ฃผ์†Œ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด ๋ฐ˜ํ™˜
String getHostName()    // ์ปดํ“จํ„ฐ ์ด๋ฆ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด ๋ฐ˜ํ™˜
static InetAddress getLocalHost() throws UnknownHostException   // ํ˜„์žฌ ์ปดํ“จํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” InetAddress ๊ฐ์ฒด ๋ฐ˜ํ™˜
static InetAddress GetByName(String hostName) throws UnknownHostException   // hostName์œผ๋กœ ์ง€์ •๋œ ์ปดํ“จํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” InetAddress ๊ฐ์ฒด ๋ฐ˜ํ™˜
static InetAddress[] getAllByName(String hostName) throws UnknownHostException  // hostName์œผ๋กœ ์ง€์ •๋œ ๋ชจ๋“  ์ปดํ“จํ„ฐ(ํ•˜๋‚˜์˜ ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ ์—ฌ๋Ÿฌ ๋Œ€์˜ ์ปดํ“จํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” InetAddress ๊ฐ์ฒด๋“ค์˜ ๋ฐฐ์—ด ๋ฐ˜ํ™˜
  • ์ฃผ์š” ๋ฉ”์†Œ๋“œ
import java.net.*;

public class SocketExam01 {
    public static void main(String[] args) throws UnknownHostException {
        InetAddress address1 = InetAddress.getLocalHost();
        System.out.println("Local Name: " + address1.getHostName());
        System.out.println("Local IP: " + address1.getHostAddress());

        InetAddress address2 = InetAddress.getByName("www.naver.com");
        System.out.println("www.naver.com Name&IP: " + address2);

        InetAddress[] all = InetAddress.getAllByName("google.com");
        for(InetAddress t:all) System.out.println(t);
    }
}
  • ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ ์˜ˆ์ œ

ํฌํŠธ

  • ํ†ต์‹ ์„ ์„ ํ†ตํ•ด ์ˆ˜์‹ ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ปดํ“จํ„ฐ ๋‚ด์˜ ์—ฌ๋Ÿฌ ํ†ต์‹  ํ”„๋กœ๊ทธ๋žจ ์ค‘์—์„œ ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์— ์ „๋‹ฌ๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๋ฒˆํ˜ธ
    • IP ์ฃผ์†Œ๋Š” ๋„คํŠธ์›Œํฌ ์ƒ์˜ ์ปดํ“จํ„ฐ ๋˜๋Š” ์‹œ์Šคํ…œ์„ ์‹๋ณ„ํ•˜๋Š” ์ฃผ์†Œ
    • ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ†ต์‹ ํ•  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์‹๋ณ„
  • ๋ชจ๋“  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ํ•˜๋‚˜ ์ด์ƒ์˜ ํฌํŠธ ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • ์ž˜ ์•Œ๋ ค์ง„ ํฌํŠธ(well-known ports)
    • ์‹œ์Šคํ…œ์ด ์‚ฌ์šฉํ•˜๋Š” ํฌํŠธ ๋ฒˆํ˜ธ
    • ์ž˜ ์•Œ๋ ค์ง„ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํฌํŠธ ๋ฒˆํ˜ธ
      • 0๋ถ€ํ„ฐ 1023 ์‚ฌ์ด์˜ ํฌํŠธ ๋ฒˆํ˜ธ
        • SSH 22, HTTP 80, FTP 21
    • ๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Œ
      • ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ ๋‚ดํฌ

์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • ์†Œ์ผ“(socket)
    • TCP/IP ๋„คํŠธ์›Œํฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ํ†ต์‹  ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋„๋ก ์ง€์›ํ•˜๋Š” ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ 
      • ๋‘ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐ„์˜ ํ†ต์‹  ์—ฐ๊ฒฐ์˜ ๋๋‹จ(endpoint)
      • ์†Œ์ผ“๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์Œ
      • ์†Œ์ผ“์€ ํŠน์ • IP, ํฌํŠธ ๋ฒˆํ˜ธ์™€ ๊ฒฐํ•ฉ
  • ์ž๋ฐ”๋Š” ์†Œ์ผ“ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์›
    • ์†Œ์ผ“ ์ข…๋ฅ˜: ์„œ๋ฒ„ ์†Œ์ผ“ ๊ณผ ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“

Socket ํด๋ž˜์Šค, ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“

  • ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“์— ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค
  • java.net ํŒจํ‚ค์ง€์— ํฌํ•จ
Socket()  // ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ์ƒํƒœ์˜ ์†Œ์ผ“์„ ์ƒ์„ฑ
Socket(InetAddress address, int port) // ์†Œ์ผ“์„ ์ƒ์„ฑํ•˜๊ณ , ์ง€์ •๋œ IP ์ฃผ์†Œ์™€ ํฌํŠธ ๋ฒˆํ˜ธ์—์„œ ๋Œ€๊ธฐํ•˜๋Š” ์›๊ฒฉ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์†Œ์ผ“์— ์—ฐ๊ฒฐ
Socket(String host, int port) // ์†Œ์ผ“์„ ์ƒ์„ฑํ•˜์—ฌ ์ง€์ •๋œ ํ˜ธ์ŠคํŠธ์™€ ํฌํŠธ ๋ฒˆํ˜ธ์— ์—ฐ๊ฒฐํ•จ. ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์ด null์ธ ๊ฒฝ์šฐ๋Š” ๋ฃจํ”„๋ฐฑ(loopback) ์ฃผ์†Œ๋กœ ๊ฐ€์ •
  • ์ƒ์„ฑ์ž
void bind(SocketAddress bindpoint)  // ์†Œ์ผ“์— ๋กœ์ปฌ IP ์ฃผ์†Œ์™€ ๋กœ์ปฌ ํฌํŠธ ์ง€์ •
void close()  // ์†Œ์ผ“์„ ๋‹ซ์Œ
void connect(SocketAddress endpoint)  // ์†Œ์ผ“์„ ์„œ๋ฒ„์— ์—ฐ๊ฒฐ
InetAddress getInetAddress()  // ์†Œ์ผ“์— ์—ฐ๊ฒฐ๋œ ์„œ๋ฒ„ IP ์ฃผ์†Œ ๋ฐ˜ํ™˜
InputStream getInputStream()  // ์†Œ์ผ“์— ์—ฐ๊ฒฐ๋œ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ ๋ฐ˜ํ™˜. ์ด ์ŠคํŠธ๋ฆผ์„ ์ด์šฉํ•˜์—ฌ ์†Œ์ผ“์ด ์ƒ๋Œ€ํŽธ์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Œ
InetAddress getLocalAddress() // ์†Œ์ผ“์ด ์—ฐ๊ฒฐ๋œ ๋กœ์ปฌ ์ฃผ์†Œ ๋ฐ˜ํ™˜
int getLocalPort()  // ์†Œ์ผ“์˜ ๋กœ์ปฌ ํฌํŠธ ๋ฒˆํ˜ธ ๋ฐ˜ํ™˜
int getPort() // ์†Œ์ผ“์— ์—ฐ๊ฒฐ๋œ ์„œ๋ฒ„์˜ ํฌํŠธ ๋ฒˆํ˜ธ ๋ฐ˜ํ™˜
OutputStream getOutputStream()  // ์†Œ์ผ“์— ์—ฐ๊ฒฐ๋œ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ ๋ฐ˜ํ™˜. ์ด ์ŠคํŠธ๋ฆผ์— ์ถœ๋ ฅํ•˜๋ฉด ์†Œ์ผ“์ด ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก
boolean isBound() // ์†Œ์ผ“์ด ๋กœ์ปฌ ์ฃผ์†Œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด true ๋ฐ˜ํ™˜
boolean isConnected() // ์†Œ์ผ“์ด ์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด true ๋ฐ˜ํ™˜
boolean isClosed()  // ์†Œ์ผ“์ด ๋‹ซํ˜€์žˆ์œผ๋ฉด true ๋ฐ˜ํ™˜
void setSoTimeout(int timeout)  // ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ํƒ€์ž„์•„์›ƒ ์‹œ๊ฐ„ ์ง€์ •. 0์ด๋ฉด ํƒ€์ž„์•„์›ƒ ํ•ด์ œ
  • ์ฃผ์š” ๋ฉ”์†Œ๋“œ

ํด๋ผ์ด์–ธํŠธ์—์„œ ์†Œ์ผ“์œผ๋กœ ์„œ๋ฒ„์— ์ ‘์†ํ•˜๋Š” ์ฝ”๋“œ

Socket clientSocket = new Socket("128.12.1.1", 5550);
  • ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“ ์ƒ์„ฑ ๋ฐ ์„œ๋ฒ„์— ์ ‘์†
    • Socket ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด 128.12.1.1 ์ฃผ์†Œ์˜ 5550 ํฌํŠธ์— ์ž๋™ ์ ‘์†
BufferedReader in = new BufferedReader(
    new InputStreamReader(clientSocket.getInputStream())
);
BufferedWriter out = new BufferedWriter(
    new OutputStreamWriter(clientSocket.getOutputStream())
);
  • ์†Œ์ผ“์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ž…์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
out.write("hello\n");
out.flush();
  • ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก
    • flush() ํ˜ธ์ถœ ์‹œ ์ŠคํŠธ๋ฆผ ์†์— ๋ฐ์ดํ„ฐ๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š๊ณ  ๋ชจ๋‘ ์ „์†ก
String line = in.readline();    // ํ•œ ํ–‰์˜ ๋ฌธ์ž์—ด ์ˆ˜์‹ 
  • ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ ์ˆ˜์‹ 
clientSocket.close();
  • ๋„คํŠธ์›Œํฌ ์ ‘์† ์ข…๋ฃŒ

ServerSocket ํด๋ž˜์Šค, ์„œ๋ฒ„ ์†Œ์ผ“

  • ์„œ๋ฒ„ ์†Œ์ผ“์— ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค
  • java.net ํŒจํ‚ค์ง€์— ํฌํ•จ
  • ServerSocket์€ ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
  • ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” Socket ๊ฐ์ฒด๋ฅผ ๋ณ„๋„๋กœ ์ƒ์„ฑ
ServerSocket(int port)    // ์ง€์ •๋œ ํฌํŠธ ๋ฒˆํ˜ธ์™€ ๊ฒฐํ•ฉ๋œ ์†Œ์ผ“ ์ƒ์„ฑ
  • ์ƒ์„ฑ์ž
Socket accept()    // ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฌ๋‹ค ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์ˆ˜๋ฝํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ƒˆ Socket ๊ฐ์ฒด ๋ฐ˜ํ™˜
void close()    // ์„œ๋ฒ„ ์†Œ์ผ“ ๋‹ซ์Œ
InetAddress getInetAddress()    // ์„œ๋ฒ„ ์†Œ์ผ“์˜ ๋กœ์ปฌ IP ์ฃผ์†Œ ๋ฐ˜ํ™˜
int getLocalPort()    // ์„œ๋ฒ„ ์†Œ์ผ“์˜ ๋กœ์ปฌ ํฌํŠธ ๋ฒˆํ˜ธ ๋ฐ˜ํ™˜
boolean isBound()    // ์„œ๋ฒ„ ์†Œ์ผ“์ด ๋กœ์ปฌ ์ฃผ์†Œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด true ๋ฐ˜ํ™˜
boolean isClosed()    // ์„œ๋ฒ„ ์†Œ์ผ“์ด ๋‹ซํ˜€์žˆ์œผ๋ฉด true ๋ฐ˜ํ™˜
void setSoTimeout(int timeout)    // accept()๊ฐ€ ๋Œ€๊ธฐํ•˜๋Š” ํƒ€์ž„์•„์›ƒ ์‹œ๊ฐ„ ์ง€์ •. 0์ด๋ฉด ๋ฌดํ•œ์ • ๋Œ€๊ธฐ
  • ์ฃผ์š” ๋ฉ”์†Œ๋“œ

์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์™€ ํ†ต์‹ ํ•˜๋Š” ๊ณผ์ •

ServerSocket serverSocket = new ServerSocket(5550);
  • ์„œ๋ฒ„ ์†Œ์ผ“ ์ƒ์„ฑ
    • ์„œ๋ฒ„๋Š” ์ ‘์†์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํฌํŠธ๋กœ 5550 ์„ ํƒ
Socket socket = serverSocket.accept();
  • ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ ‘์†์„ ๊ธฐ๋‹ค๋ฆผ
    • accept() ๋ฉ”์†Œ๋“œ๋Š” ์—ฐ๊ฒฐ ์š”์ฒญ์ด ์˜ค๋ฉด ์ƒˆ๋กœ์šด Socket ๊ฐ์ฒด ๋ฐ˜ํ™˜
    • ์ ‘์† ํ›„ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„ Socket ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์™€ ํ†ต์‹ 
BufferedReader in = new BufferedReader(
    new InputStreamReader(socket.getInputStream())
);
BufferedWriter out = new BufferedWriter(
    new OutputStreamWriter(socket.getOutputStream())
);
  • ๋„คํŠธ์›Œํฌ ์ž…์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ

์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ์ฑ„ํŒ…

  • ๊ฐ„๋‹จํ•œ ์ฑ„ํŒ… ํ”„๋กœ๊ทธ๋žจ
    • ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ 1:1๋กœ ์ฑ„ํŒ…
    • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์„œ๋กœ ํ•œ๋ฒˆ์”ฉ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉด์„œ ๋ฌธ์ž์—ด ์ „์†ก
      • ๋ฌธ์ž์—ด ๋์— "\n"์„ ๋ง๋ถ™์—ฌ ๋ณด๋‚ด๊ณ  ๋ผ์ธ ๋‹จ์œ„๋กœ ์ˆ˜์‹ 
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ bye๋ฅผ ๋ณด๋‚ด๋ฉด ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ
import java.io.*;
import java.net.*;
import java.util.*;

public class ServerExam01 {
    public static void main(String[] args) {
        BufferedReader in = null;
        BufferedWriter out = null;

        ServerSocket listener = null;
        Socket s = null;

        Scanner sc = new Scanner(System.in);

        try {
            listener = new ServerSocket(9999);  // ์„œ๋ฒ„ ์†Œ์ผ“ ์ƒ์„ฑ
            System.out.println("Waiting for connection...");

            s = listener.accept();  // ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์—ฐ๊ฒฐ ์š”์ฒญ ๋Œ€๊ธฐ
            System.out.println("Connected...");

            in = new BufferedReader(
                    new InputStreamReader(s.getInputStream())
            );
            out = new BufferedWriter(
                    new OutputStreamWriter(s.getOutputStream())
            );

            while(true) {
                String inMsg = in.readLine();
                if(inMsg.equalsIgnoreCase("bye")) {
                    System.out.println("Disconnecting...");
                    break;
                }
                System.out.println("Client: "+inMsg);
                System.out.print("Send>>");
                String outMsg = sc.nextLine();
                out.write(outMsg+"\n");
                out.flush();
            }
        } catch(IOException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        } finally {
            try {
                sc.close();
                if(s!=null) s.close();
                if(listener!=null) listener.close();
            } catch(IOException e2) {
                System.out.println(e2.getMessage());
                e2.printStackTrace();
            }
        }
    }
}
  • Server ์ฝ”๋“œ
import java.io.*;
import java.net.*;
import java.util.*;

public class ClientExam01 {
    public static void main(String[] args) {
        BufferedReader in = null;
        BufferedWriter out = null;

        Socket s = null;

        Scanner sc = new Scanner(System.in);

        try {
            s = new Socket("localhost", 9999);  // ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“ ์ƒ์„ฑ. ์„œ๋ฒ„์— ์—ฐ๊ฒฐ

            in = new BufferedReader(
                    new InputStreamReader(s.getInputStream())
            );
            out = new BufferedWriter(
                    new OutputStreamWriter(s.getOutputStream())
            );

            while(true) {
                System.out.print("Send>>");
                String outMsg = sc.nextLine();  // ํ‚ค๋ณด๋“œ์—์„œ ํ•œ ํ–‰ ์ฝ๊ธฐ
                out.write(outMsg+"\n"); // ํ‚ค๋ณด๋“œ์—์„œ ์ฝ์€ ๋ฌธ์ž์—ด ์ „์†ก
                out.flush();    // out์˜ ์ŠคํŠธ๋ฆผ ๋ฒ„ํผ์— ์žˆ๋Š” ๋ชจ๋“  ๋ฌธ์ž์—ด ์ „์†ก
                if(outMsg.equalsIgnoreCase("bye")) break;
                String inMsg = in.readLine();   // ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ํ•œ ํ–‰ ์ˆ˜์‹ 
                System.out.println("Server: "+inMsg);
            }
        } catch(IOException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        } finally {
            try {
                sc.close();
                if(s!=null) s.close();
            } catch(IOException e2) {
                System.out.println(e2.getMessage());
                e2.printStackTrace();
            }
        }
    }
}
  • Client ์ฝ”๋“œ

์ˆ˜์‹ ๊ณ„์‚ฐ ์„œ๋ฒ„

  • ๋ฌธ์ œ ๊ฐœ์š”
    • ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๋Š” 1:1 ํ†ต์‹ 
    • ์„œ๋ฒ„๋ฅผ ๋จผ์ € ์‹คํ–‰์‹œํ‚ค๊ณ  ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹คํ–‰์‹œ์ผœ ์„œ๋ฒ„์— ์ ‘์†
    • ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ˆ˜์‹์„ ์ž…๋ ฅ๋ฐ›์•„ ์„œ๋ฒ„๋กœ ์ „์†ก
    • ์—ฐ์‚ฐ์ž๋Š” +, -, *์˜ 3๊ฐ€์ง€๋งŒ ํ—ˆ์šฉํ•˜๊ณ  ์ •์ˆ˜ ์—ฐ์‚ฐ๋งŒ ๊ฐ€๋Šฅ
    • ์„œ๋ฒ„๊ฐ€ ์‹์„ ๋ฐ›์œผ๋ฉด ์‹์„ ์„œ๋ฒ„์˜ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๊ณ , ๊ณ„์‚ฐํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก
    • ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋‹ต์„ ํ™”๋ฉด์— ์ถœ๋ ฅ
    • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” ์ „์†กํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ค๊ณ  "\n"์„ ๋ง๋ถ™์—ฌ ์ „์†กํ•˜๋ฉฐ, ๋ผ์ธ ๋‹จ์œ„๋กœ ์†ก์ˆ˜์‹ 
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ "bye"๋ฅผ ๋ณด๋‚ด๋ฉด ์–‘์ชฝ ๋ชจ๋‘ ์ข…๋ฃŒ
import java.io.*;
import java.util.*;
import java.net.*;

public class ServerExam02 {
    public static void main(String[] args) {
        BufferedReader in = null;
        BufferedWriter out = null;

        ServerSocket listener = null;
        Socket s = null;

        try {
            listener = new ServerSocket(9999);
            System.out.println("Waiting for connection...");

            s = listener.accept();
            System.out.println("Connected...");

            in = new BufferedReader(
                    new InputStreamReader(s.getInputStream())
            );
            out = new BufferedWriter(
                    new OutputStreamWriter(s.getOutputStream())
            );

            while(true) {
                String inMsg = in.readLine();
                if (inMsg.equalsIgnoreCase("bye")) {
                    System.out.println("Disconnecting...");
                    break;
                } else {
                    System.out.println(inMsg);
                    String re = calc(inMsg);
                    if (re.equalsIgnoreCase("Error")) {
                        out.write("Incorrect Calculation Expression...\n");
                        out.flush();
                    } else {
                        out.write(re + "\n");
                        out.flush();
                    }
                }
            }
        } catch(IOException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        } finally {
            try {
                if(s!=null) s.close();
                if(listener!=null) listener.close();
            } catch(IOException e2) {
                System.out.println(e2.getMessage());
                e2.printStackTrace();
            }
        }
    }

    protected static String calc(String exp) {
        StringTokenizer st = new StringTokenizer(exp, " ");
        if(st.countTokens()!=3) return "Error";
        int n1 = Integer.parseInt(st.nextToken());
        String c = st.nextToken();
        int n2 = Integer.parseInt(st.nextToken());
        String re = switch(c) {
            case "+" -> Integer.toString(n1+n2);
            case "-" -> Integer.toString(n1-n2);
            case "*" -> Integer.toString(n1*n2);
            default -> "Error";
        };
        return re;
    }
}
  • Server ์ฝ”๋“œ
import java.util.*;
import java.net.*;
import java.io.*;

public class ClientExam02 {
    public static void main(String[] args) {
        BufferedReader in = null;
        BufferedWriter out = null;

        Socket s = null;

        Scanner sc = new Scanner(System.in);

        try {
            s = new Socket("localhost", 9999);

            in = new BufferedReader(
                    new InputStreamReader(s.getInputStream())
            );
            out = new BufferedWriter(
                    new OutputStreamWriter(s.getOutputStream())
            );

            while(true) {
                System.out.print("Expression(๋นˆ์นธ ํฌํ•จ ์ž…๋ ฅ, ex: 24 + 42)>>");
                String exp = sc.nextLine();
                out.write(exp+"\n");
                out.flush();

                if(exp.equalsIgnoreCase("bye")) break;

                System.out.println("Result: "+in.readLine());
            }
        } catch(IOException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        } finally {
            sc.close();
            try {
                if(s!=null) s.close();
            } catch(IOException e2) {
                System.out.println(e2.getMessage());
                e2.printStackTrace();
            }
        }
    }
}
  • Client ์ฝ”๋“œ

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์ˆ˜์‹ ๊ณ„์‚ฐ ์„œ๋ฒ„

package thread_calc;

import java.util.*;
import java.io.*;
import java.net.*;

public class ServerExam03 {
    public static void main(String[] args) {
        ServerSocket listener = null;
        try {
            listener = new ServerSocket(9999);
            System.out.println("Waiting for connection...");
            while(true) {
                Socket s = listener.accept();
                CalcThread calcThread = new CalcThread(s);
                calcThread.start();
            }
        } catch(IOException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        } finally {
            try {
                if(listener!=null) listener.close();
            } catch(IOException e2) {
                System.out.println(e2.getMessage());
                e2.printStackTrace();
            }
        }
    }
}

class CalcThread extends Thread {
    private Socket s;
    CalcThread(Socket s) { this.s = s; }
    protected static String calc(String exp) {
        StringTokenizer st = new StringTokenizer(exp, " ");
        if(st.countTokens()!=3) return "Error";
        int n1 = Integer.parseInt(st.nextToken());
        String c = st.nextToken();
        int n2 = Integer.parseInt(st.nextToken());
        String re = switch(c) {
            case "+" -> Integer.toString(n1+n2);
            case "-" -> Integer.toString(n1-n2);
            case "*" -> Integer.toString(n1*n2);
            default -> "Error";
        };
        return re;
    }

    @Override
    public void run() {
        try {
            InetAddress addr = s.getInetAddress();
            String cAddr = addr.getHostAddress();
            System.out.println(cAddr + " is connected...");

            BufferedReader in = new BufferedReader(
                    new InputStreamReader(s.getInputStream())
            );
            BufferedWriter out = new BufferedWriter(
                    new OutputStreamWriter(s.getOutputStream())
            );
            while(true) {
                String inMsg = in.readLine();
                if(inMsg.equalsIgnoreCase("bye")) {
                    System.out.println(cAddr + ": is disconnected...");
                    break;
                }
                System.out.println(cAddr+": " +inMsg);
                String res = calc(inMsg);
                out.write(res+"\n");
                out.flush();
            }
        } catch(IOException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        } finally {
            try {
                if(s!=null) s.close();
            } catch(IOException e2) {
                System.out.println(e2.getMessage());
                e2.printStackTrace();
            }
        }
    }
}
  • Server ์ฝ”๋“œ
728x90
๋ฐ˜์‘ํ˜•

'Development Study > Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Java] Lecture - Day 18  (1) 2024.06.06
[Java] Lecture - Day 17  (1) 2024.06.06
[Java] Lecture - Day 16  (1) 2024.05.17
[Java] Lecture - Day 15  (0) 2024.04.26
[Java] Lecture - Day 14  (0) 2024.04.05
Comments