페이지

2015. 1. 19.

[JAVA] Day10. java.net

java.net package



거의 사용되지 않는다 ㅠㅠ

자바 언어적인적인 측면보다는 네트워크 기술적인 용어 중심으로 알아둘 것!

불특정 다수의 네트워크망 = 인터넷
특정집단의 네트워크망 = 인트라넷
인터넷 + 인트라넷 = 익스트라넷




Network


 - Network란 다른 장치로 데이터를 이동시킬 수 있는 컴퓨터들과 주변 장치들의 집합이다.
 - Network의 연결된 모든 장치들을 Node라고한다.
 - 다른 Node에게 하나 이상의 Service를 해주는 Node를 Host라 부른다.
 - 하나의 컴퓨터에서 다른 컴퓨터로 데이터를 이동시킬 때 복합한 계층을 통해 전송되는데, 이런 대표적인 모델이 OSI7 Layer Model이다.
 - OSI 계층 모델은 모두 7계층으로 이루어졌다.
 - 데이터 통신을 이해하는데 OSI7 Layer Model은 상당한 역할을 하지만, Internet기반의 표준 모델로 사용하는 TCP/IP계층 모델을 주로 사용하고 있다.
 - 자바에서 이야기하는 네트워크 프로그래밍은 TCP/IP 모델을 사용하고 있다.




Internet Address


 - 모든 호스트는 Internet Address(Host 또는 IP address)라 불리는 유일한 32비트 숫자로 구성된 address체계를 이용하여 서로를 구분할 수 있다.
 - IP address는 32비트 숫자를 한번에 모두를 표현하는 것이 힘들기 때문에, 8비트씩 끊어서 표현하고, 각자리는 1바이트로 0~255까지의 범위를 갖게 된다.
 - 32비트의 address체계를 IPv4라 한다.
 - 오늘날 IPv4는 포화 상태이고, 이를 극복하고자 나온것이 IPv6이다.
 - IPv6는 128비트의 address체계를 관리하고 있으며, 16비트씩 8부분으로 나누어 16진수로 표시한다.
 - 각 호스트는 Domain 이름을 컴퓨터가 사용하는 address로 바꾸어 주어야 한다. 이렇게 IP address를 Domain 이름으로 바꾸어 주는 시스템을 DNS이라 한다.






Port와 Protocol


 - Port는 컴퓨터의 주변장치를 접속하기 위한 물리적인 포트와 프로그램에서 사용되는 접속 장소인 논리적인 포트가 있다.
 - 포트번호는 인터넷번호 할당 허가 위원회(IANA)에 의해 예약된 Port번호를 가진다.
 - 예약된 Port번호의 예로는 80(http), 21(ftp), 22(ssh), 23(telnet)등이 있다.
 - 0~1023은 예약된 포트 번호이고, 그 나머지 0~65535까지 유저가 할당하여 사용할 수 있다.

 - Protocol은 client와 server간의 통신규약이다.
 - 통신규약이란 상호 간의 접속이나 절단방식, 통신방식, 주고받을 데이터의 형식, 오류검출 방식, 코드변환방식, 전송속도 등에 대하여 정의한 것을 말한다.
 - 대표적인 인터넷 표준 프로토콜에는 TCP와 UDP가 있다.



TCP와 UDP


 - TCP/IP 계층 모델은 4계층의 구조를 가지고 있다.
 - Application, Transfer, Network, Data Link 계층이 있다.
 - 이 중 Transfer 계층에서 사용하는 프로토콜에는 TCP와 UDP가 있다.




TCP


 - Transmission Control Protocol은 신뢰할 수 있는 Protocol로서,
 - 데이터를 상대 측까지 제대로 전달되었는지 확인 메시지(ACK)를 주고 받음으로써 데이터의 송수신 상태를 점검한다.
 - 대표적으로 전화 시스템

UDP


 - User Datagram Protocol은 신뢰할 수 없는 프로토콜로서, 데이터를 보내기만 하고 확인 메시지를 주고 받지 않기 때문에 제대로 전달했는지 확인하지 않는다.
 - 대표적으로 편지 또는 위성 중계


InetAddress class


import java.net.*;
import java.util.*;
class  InetAddress3{
    public static void main(String[] args)throws Exception {
        String url = null;
        Scanner s = new Scanner(System.in);
        System.out.print("웹 사이트 주소 입력 ==> ");
        url = s.nextLine();
        InetAddress [] addr = InetAddress.getAllByName(url);
        System.out.println("==================================");
        System.out.println(url+"는 "+addr.length+"개의 IP주소를 갖고 있습니다.");
        for(int i = 0; i < addr.length; i++){
            System.out.println("IP 번호 = " + addr[i].getHostAddress());
        }}}





url과 uri의 차이점?

잘 알기!!!!



URL은 Uniform Resource Locator

URI는 Uniform Resource Identifier








예1>
http://terms.naver.com/entry.nhn

URL : 프로토콜(http)을 포함한 전체 주소
http://terms.naver.com/entry.nhn


URI : ip와 포트를 제외한 실질적인 주소(변하지 않는 정적주소)(파일경로)
/entry.nhn


예2>
URL : 웹 상에서 서비스를 제공하는 각 서버들에 있는 파일들의 위치를 표시하기 위한 것으로 접속할 서비스의 종류,도메인명,파일의 위치 등을 포함한다.

e.g. http://127.0.0.1:7001/TestApps/test.jsp



URI : 존재하는 자원을 식별하기 위한 일반적인 식별자를 규정하기 위한 것으로 URL에서 HTTP프로토콜,호스트명,port 번호를 제외한 것이다.

e.g. /TestApps/test.jsp



//서버
import java.net.*;
import java.io.*;
import java.util.*;

public class TcpIpMultichatServer {
    HashMap clients;
   
    TcpIpMultichatServer() {
        clients = new HashMap();
        Collections.synchronizedMap(clients);
    }

    public void start() {
        ServerSocket serverSocket = null;
        Socket socket = null;

        try {
            serverSocket = new ServerSocket(7777);
            System.out.println("서버가 시작되었습니다.");

            while(true) {
                socket = serverSocket.accept();
                System.out.println("["+socket.getInetAddress() + ":"+socket.getPort()+"]"+"에서 접속하였습니다.");
                ServerReceiver thread = new ServerReceiver(socket);
                thread.start();
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
    } // start()

    void sendToAll(String msg) {
        Iterator it = clients.keySet().iterator();
       
        while(it.hasNext()) {
            try {
                DataOutputStream out =
                    (DataOutputStream)clients.get(it.next());
                out.writeUTF(msg);
            } catch(IOException e){}
        } // while
    } // sendToAll

    public static void main(String args[]) {
        new TcpIpMultichatServer().start();
    }

    class ServerReceiver extends Thread {
        Socket socket;
        DataInputStream in;
        DataOutputStream out;

        ServerReceiver(Socket socket) {
            this.socket = socket;
            try {
                in = new DataInputStream(socket.getInputStream());
                out = new DataOutputStream(socket.getOutputStream());
            } catch(IOException e) {}
        }

        public void run() {
            String name = "";
            try {
                name = in.readUTF();
                sendToAll("#"+name+"님이 들어오셨습니다.");

                clients.p
                    ut(name, out);
                System.out.println("현재 서버접속자 수는 " + clients.size() + "입니다.");
                while(in!=null) {
                    sendToAll(in.readUTF());
                }
            } catch(IOException e) {
                // ignore
            } finally {
                sendToAll("#"+name+"님이 나가셨습니다.");
                clients.remove(name);
                System.out.println("["+socket.getInetAddress()+":"+socket.getPort()+"]"+"에서 접속을 종료하였습니다.");
                System.out.println("현재 서버접속자 수는 "+ clients.size()+"입니다.");
            } // try
        } // run
    } // ReceiverThread
} // class





//클라이언트

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

public class TcpIpMultichatClient {
    public static void main(String args[]) {
        if(args.length!=1) {
            System.out.println("USAGE: java TcpIpMultichatClient 대화명");
            System.exit(0);
        }
        try {
            String serverIp = "아이피";
            // 소켓을 생성하여 연결을 요청한다.
            Socket socket = new Socket(serverIp, 7777);
            System.out.println("서버에 연결되었습니다.");
            Thread sender = new Thread(new ClientSender(socket, args[0]));
            Thread receiver = new Thread(new ClientReceiver(socket));
            sender.start();
            receiver.start();
        } catch(ConnectException ce) {
            ce.printStackTrace();
        } catch(Exception e) {}
    } // main

    static class ClientSender extends Thread {
        Socket socket;
        DataOutputStream out;
        String name;
        ClientSender(Socket socket, String name) {
            this.socket = socket;
            try {
                out = new DataOutputStream(socket.getOutputStream());
                this.name = name;
            } catch(Exception e) {}
        }
        public void run() {
            Scanner scanner = new Scanner(System.in);
            try {
                if(out!=null) {
                    out.writeUTF(name);
                }   
                while(out!=null) {
                    out.writeUTF("["+name+"]"+scanner.nextLine());       
                }
            } catch(IOException e) {}
        } }
   
    static class ClientReceiver extends Thread {
        Socket socket;
        DataInputStream in;
        ClientReceiver(Socket socket) {
            this.socket = socket;
            try {
                in = new DataInputStream(socket.getInputStream());
            } catch(IOException e) {}
        }
        public void run() {
            while(in!=null) {
                try {
                    System.out.println(in.readUTF());
                } catch(IOException e) {}
            }
        }
    }
}