[Java] Network

클라우드·2024년 4월 12일
0

Java

목록 보기
15/20
post-thumbnail

1. Network 개요

1.1 Network, Internet

  • 컴퓨터 network는 컴퓨터를 포함해서 컴퓨터 간에 데이터를 주고 받을 수 있는 통신 링크의 집합을 지칭한다.
  • Internet은 Network of Network의 의미.
  • Network를 전 세계적으로 확장시켜 놓은 통신 링크의 집합체를 지칭하는 용어.
  • 따라서 Internet은 infrastructure를 지칭하는 용어
  • 이런 Internet을 사용하기 위해 필요한 것은 해당 infrastructure 위에서 동작하는 프로그램이 있어야 한다.
  • 이런 프로그램들을 통칭해서 service라고 한다.
  • Web Service, Email Service, 파일 전송 서비스
  • 일반적으로 특정 기준으로 Network를 구분해서 표현하는데 가장 많이 사용하는 구분은 네트워크의 크기이다.
  • LAN(Local Area Network), WAN(Wide Area Network), MAN(Matropolitan Area Network)

1.2 IP Address

  • 컴퓨터 네트워크에 각각 장치를 식별하기 위해 사용하는 논리적인 숫자값.
  • IP 주소는 32비트로 되어 있는 IPv4, 128비트로 되어있는 IPv6이 있다.
  • IPv4는 “.”으로 이루어진 4자리의 숫자로 구성 ⇒ 127.0.0.1
  • IPv6은 “:”으로 이루어진 8개의 16비트 숫자로 구성 ⇒ 2001:ab08:1267:…
  • 이런 IP Address는 논리적인 주소이다. ⇒ 변경될 수 있다.
  • 실제로 하나의 컴퓨터가 다른 컴퓨터를 찾아서 데이터를 전송할 때는 논리적인 주소만 가지고 데이터를 전달할 수 있을까?
  • 사실 물리적인 주소값이 필요하다.
  • 이런 물리적인 주소값을 MAC address라고 부르고 각 device마다 고유값을 가지고 있다.

1.3 Protocol

  • 컴퓨터 통신도 protocol이 설정되어 있어야 가능하다.
  • protocol 안에는 데이터를 전송하고 수신하는 방법, 오류 처리 방법, 보안, 암호화 규칙 등이 포함되어 있다.

1.4 Port

  • IP address가 지칭하는 것은 정확히 말하면 NIC(network interface card)를 의미하고 조금 더 확장하자면 해당 NIC가 붙어있는 컴퓨터(쇳덩어리)를 의미한다.
  • 당연히 IP address만을 가지고는 통신이 안된다.
  • 왜냐하면 데이터 통신은 process(프로그램) 간에 이루어지는 것이기 때문이다.
  • 그래서 어떤 프로그램과 데이터 통신을 할지 명시해야 하는데, 그때 해당 프로그램을 지칭하는 숫자를 대신 이용하게 된다. 이 숫자를 Port라고 한다.
  • 즉, 데이터 통신을 하기 위해서는 Protocol, IP address, Port 이렇게 3가지 요소가 있어야 한다.
  • Protocol :// IP address : Port

1.5 Network 프로그램이 너무 어렵다.

  • Socket 개념 등장

2. 기본적인 절차

  • Java Network는 기본적으로 CS 구조로 동작한다.
  • Client-Server 간에 데이터 통신을 기반으로 한다.
  • Client는 능동적으로 접속을 시도하는 program(process)
  • Server는 수동적으로 접속을 기다리고 있는 program(process)

서버 프로그램

package javanetworkexam;

import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class SimpleServer {
	
	public static void main(String[] args) {
		// 1. ServerSocket 객체를 생성한다.
		//     ServerSocket을 생성할 때 client가 접속해서 들어올 
		//     Port번호를 명시해야 한다.
		//     0~65535 사이의 값을 사용해야 한다.
		//     0~1023 까지는 Well Known Port라고 해서 이미 용도가
		//     정해져 있기 때문에 그 이후 값을 이용해야 한다.
		//     하나의 컴퓨터에서 동작하는 프로그램이 사용하는 Port번호는
		//     Unique해야 한다.
		try {
			ServerSocket serverSocket = 
					new ServerSocket(5555);
			System.out.println("서버소켓 객체 생성");
			
			Socket s = serverSocket.accept();  
			// 일단 대기(클라이언트가 접속할 때까지)
			System.out.println("accept()가 풀렸습니다.");
			
			// 이렇게 얻어진 socket에 대해서 Stream객체를 얻어낸다.
			PrintWriter out = new PrintWriter(s.getOutputStream());
			out.println("이것은 소리없는 아우성 - 서버가 전달했다.");
			// PrintWriter는 효율을 위해서 내부 buffer를 가지고 있다.
			// 명시적으로 flush를 이용해 데이터를 전달해야 한다.
			out.flush();
			
			
		} catch (Exception e) {
        
		}
		
		
	}
}

클라이언트 프로그램

package javanetworkexam;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;

public class SimpleClient {

	public static void main(String[] args) {
		// 클라이언트는 능동적으로 서버 프로세서(ServerSocket)에
		// 접속을 시도한다. 당연히 IP와 PORT를 알려줘야 한다.
		// IP는 당연히 목적지의 IP를 주소를 넣어야 한다.
		// 지금은 Server 프로그램이 같은 컴퓨터에 있기 때문에
		// IP주소를 현재 사용하고 있는 컴퓨터를 지칭하는 특별한 IP주소를 이용한다.
		// 127.0.0.1 이라는 IP를 이용한다.(혹은 이 IP에 할당된 localhost)
		
		// 접속을 시도해서 만약 접속이 성공하면 진짜 객체가 생성된다.
		// 접속이 실패하면 null이 return 된다.
		try {
			Socket s = new Socket("localhost",5555);
			System.out.println("접속 성공");
			
			InputStreamReader isr = 
					new InputStreamReader(s.getInputStream());
			
			BufferedReader br = new BufferedReader(isr);
			
			String msg = br.readLine();
			
			System.out.println(msg);
		} catch (Exception e) {

		}

	}
}

3. 간단한 Echo Program 구현

  • 지금까지 배운 내용을 기반으로 간단한 Echo Program을 각자 구현해 보자.
  • 사용된 FXML파일
  • 클라이언트용 FXML 파일
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.FlowPane?>
<?import javafx.scene.text.Font?>


<BorderPane fx:controller="EchoClientController" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1">
    <bottom>
        <FlowPane prefHeight="64.0" prefWidth="600.0" BorderPane.alignment="CENTER">
            <children>
                <TextField fx:id="userID" prefHeight="50.0" prefWidth="100.0">
                    <FlowPane.margin>
                        <Insets left="10.0" right="10.0" top="5.0" />
                    </FlowPane.margin>
                    <font>
                        <Font size="22.0" />
                    </font>
                </TextField>
                <TextField fx:id="userMsg" prefHeight="50.0" prefWidth="295.0">
                    <FlowPane.margin>
                        <Insets right="10.0" top="5.0" />
                    </FlowPane.margin>
                </TextField>
                <Button fx:id="sendMsg" mnemonicParsing="false" prefHeight="40.0" prefWidth="80.0" text="전송" />
                <Button fx:id="closeBtn" mnemonicParsing="false" prefHeight="40.0" prefWidth="80.0" text="종료">
                    <FlowPane.margin>
                        <Insets left="5.0" />
                    </FlowPane.margin>
                </Button>
            </children>
        </FlowPane>
    </bottom>
    <center>
        <TextArea fx:id="messageBox" prefHeight="308.0" prefWidth="600.0" BorderPane.alignment="CENTER">
            <BorderPane.margin>
                <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
            </BorderPane.margin>
        </TextArea>
    </center>
</BorderPane>
  • 서버용 FXML 파일
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.BorderPane?>


<BorderPane fx:controller="EchoServerController" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="386.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1">
    <bottom>
        <Button fx:id="startBtn" mnemonicParsing="false" prefHeight="57.0" prefWidth="286.0" text="서버시작" BorderPane.alignment="CENTER">
            <BorderPane.margin>
                <Insets bottom="5.0" top="5.0" />
            </BorderPane.margin>
        </Button>
    </bottom>
    <center>
        <TextArea fx:id="messageBox" prefHeight="332.0" prefWidth="541.0" BorderPane.alignment="CENTER">
            <BorderPane.margin>
                <Insets bottom="5.0" left="20.0" right="20.0" top="20.0" />
            </BorderPane.margin>
        </TextArea>
    </center>
</BorderPane>

4. Chatting 구현

  • Echo program을 확장해 방 1개짜리 Chatting program을 구현한다.
  • 공용객체를 사용하는 부분을 추가해야 한다.
profile
안녕하세요 :)

0개의 댓글