Network 기본지식


Cisco : 세계최대 라우터 회사


NCSE :Cisco  네트워크 자격증


네트워크 입문자용 도서 추천

후니의 쉽게 쓴 시스코 네트워킹 

http://www.aladin.co.kr/shop/wproduct.aspx?ItemId=11083088



<네트워크와 운영체제>


네트워크(Network)

- 두 대 이상의 장치가 서로 연결되서 서로 작업을 할 수 있는 상태

- 서로 떨어져 있는 장치들의 연결이 네트워크이다.



운영체제


DOS(disk operating system)

- 한 대의 컴퓨터를 관리하는 시스템

- MS-DOS, Window 3.1, 95, XP, ME ... 7, 8, 10


NOS(network operating system)

- 여러대의 컴퓨터의 네트워크를 관리하는 시스템

- WindowsNT4.0, Linux ....

- 최근 나오는 운영체제는 어느정도 네트워크 관리 기능이 있다.



<서버와 클라이언트>


Client 클라이언트

- 손님

- 요청한다.

- 반드시 클라이언트가 먼저 요청한다.


Server 서버

- 서비스 제공자

- 응답한다.

- 클라이언트의 요청에 따라 응답한다.


역할에 따라 클라이언트가 되기도 하고 서버가 되기도 한다.


<도메인과 P2P>

도메인 : 하나의 서버의 역할이 확실히 정해져 있는 것을 도메인이라고 한다.

P2P : 내가 서버가 될 수도 있고 내가 클라이언트가 될 수 있는 것을 P2P라고 한다.




<최근 뜨는 언어>

Go : 스레드 처리에 강한 언어 (구글)

elang

Phython

스칼라



<네트워크에서 중요한 것>


1.프로토콜(Protocol)

- 회사간의 약속, 협정서, 규칙, 규약

- 정보를 서로 쉽게 공유하기 위한 약속


프로토콜 예시)


HTTP

Hyper Text Transfer Protocol : 하이퍼텍스트를 전송하기 위한 약속


Hyper Text = html : 문서와 다른 문서로 클릭만 하면 연결되어 보여짐


FTP 

File Transfer Protocol : 파일을 전손하기 위한 약속


IPX/SPX

Novel : 전세계적으로 매우 유명한 회사

Netware : novel사의 네트워크 운영체제

IPX/SPX 는 Netware의 프로토콜이다.

스타크래프트를 할 때 처럼 로컬네트워크끼리 

서로 연결하는 방법으로도 많이 사용했지만 원래 용도는

네트워크 프로토콜이다.


TCP/IP

매우 중요한 프로토콜



<TCP/IP>

OSI 7계층

- Open System Intercon-nection 에서의 약속




7계층 - 응용 계층

수신한 데이터로 서비스를 제공하거나 데이터를 송신하는 서비스를 하는 부분입니다.


6계층 - 표현 계층

데이터 자체가 표현되는 방법을 말한다. 데이터 압축이나 암호화가 이에 해당합니다.


5계층 - 세션 계층

단말기 사이의 연결을 구축하고 유지하며 종료시키는 역할을 한다. 또한 전달할 데이터를 동기화, 즉 데이터 교신 순서를 정합니다.


4계층 - 전송 계층 ★★★

네트워크 계층에 전달되는 데이터의 순서와 데이터의 에러를 찾아내고 필요하다면 다시 송수신을 한다. 경우에 따라 데이터를 분할하여 전송하고나 도착한 데이터를 역으로 조합합니다.


3계층 - 네트워크 계층 ★★★

두 지점간의 데이터 전송에 대해 경로 배정과 중계를 담당한다. 컴퓨터의 NIC(Network Interface Card)가 이에 해당하며 흔히 말하는 IP를 갖고 있습니다.


2계층 - 데이터 링크 계층

인접해 있는 단말기간에 데이터를 전달하는 역할과 제어를 담당한다. 데이터를 패킷으로 분할하고, 데이터 흐름을 조절하며, 전달 도중에 에러를 검사 및 발생했을 때 재전송을 합니다.


1계층 - 물리 계층

단말기간의 물리적인 교신 표준을 정의한다. 전기적인 신호 전압, 통신에 사용할 케이블 등 통신 장비들이 1계층에 해당합니다.


출처: http://serblin.tistory.com/2 [손석진의 프로그래밍]



데이터를 보내기 한 전달체계를 약속하고 프로그램이나 하드웨어를 만들 수 있도록 했다.

현재는 7계층이 모두 필요없기 때문에 요즘에는 TCP/IP 4계층으로 바뀌었다.

Java로 프로그램을 짜려면 전송계층과 네트워크계층을 알아야한다.



- (TCP/IP 는  수백개의 약속을 묶어서 대표적인 이름으로 부르는 것이다.)


4계층을 살펴보기 전에 7계층을 살펴보자.


전송계층은 다른 장치와이 연결은 당연하지만 제대로 전송이 되었는지 안정성을 체크한다.

전송계층에서 중요한 약속은 TCP, UDP 프로토콜이다.

네트워크계층은 다른장치와의 연결만을 신경쓴다. 네트워크계층의 중요한 약속이 IP이다.


전송계층 : TCP, UDP

네트워크 : IP


를 좀 더 알아보자.


먼저 TCP, UDP


<TCP, UDP>


TCP : 연결지향적

- 연결지향적 : 미리 연결을 해놓고 작업을 하는 방식이다.

- 전화장치와 비슷한다.

- 장점 : 데이터를 안전하게 주고 받을 수 있다.

- 단점 : 먼저 선을 연결해야하기 때문에 UDP와 비교해서 속도가 떨어진다.

- 1:1 통신에 많이 쓰인다.

- 중요한 정보일 때는 TCP이다.


UDP : 비연결지향적

- 비연결지향적 : 연결을 하지 않고 그냥 바로 데이터를 주고 받는다. 

필요할 때만 데이터를 주고 받고 필요하지 않으면 연결을 끊는다.

- 무전기와 비슷하다.

- 장점 : 필요할 때만 연결하기 때문에 주고 받는 속도가 빠르다.

- 단점 : 불안정하다.

- 불특정 다수를 향한, 주로 방송에 쓰인다.

- 정보가 약간은 손실되어도 괜찮거나, 대량의 파일을 처리할 때 쓴다.


최근에는 회선이 안정적이기 때문에 UDP를 많이 쓴다.

그래서 프로그램을 UDP를 많이 쓴다.



2 .ip, 포트, 소켓


보통네트워크를 만들면 서버용과 클라이언트용 두개를 한 쌍으로 만든다.

하지만 웹은 서버용만 만든다.

브라우저라는 클라이언트 프로그램이 있기 때문이다.


ip는 인터넷상에서 컴퓨터를 구별하게 해준다.

ip는 두가지가 있다. real IP와 virtual IP 이다.

IP는 충돌만 안나면 된다.


▶virtual IP 

사용자가 가상으로 지정하는 가짜 아이피 

한 지역에서만 사용하는 아이피 (주로 로컬네트워크)


▶RealIP 

인터넷 기관으로 받은 진짜 아이피 전세계적으로 사용하는 지정된 아이피



<Static IP 와 Dynamic IP>

▶Static IP

한번 입력하면 아이피가 바뀌지 않는다.

서버는 Static 고정아이피 서비스를 했다.


계속해서 아이피가 바뀐다.

000.000.000.000

32비트 주소 : 2에 32승 (IPV4 : IP버전 4)

40억개의 주소체계

예전에는 괜찮았지만 지금은 아이피가 모자르다.

IPV6 : IP버전 6 최근에 사용하는 주소체계

한국에서는 2개를 혼재해서 쓴다.



▶ Dynamic IP

내가 쓸때만 아이피를 부여받는다.


└ DHCP 서버

IP를 모아놓았다가 자동으로 다시 회수했다가 준다.


DNS(도메인 이름 서비스)

IP를 도메인으로 연결해준다.


<port 포트 >

모든 네트워크들은 통로를 하나씩 가지고 있는데

이를 포트라고 한다. 이 포트는 각 프로그램의 입구 번호,

아파트 동 호수라고 생각하면 된다.


<socket 소켓>

socket = IP+ Port + Data

내가 하고 싶은 것을 마음껏 하기 위해서는 소켓을 할 줄 알아야한다.

네트워크프로그램을 한다는 것은 소켓프로그램을 하는 것이다.


<스프링 : 프레임워크>

프로그램을 좀 더 빨리 쉽게 만들 수 있는 틀

웹을 조금 더 다른 방법으로 사용할 수 있도록해준다.

스프링을 이용해서 만들면 견고하고 안전하다.

한국에서 취업하기에는 좋다.



Network


1. 관련클래스 : java.net*


java.base > java.net



2. InetAddress

- IP를 객체화 시키는 클래스. 주도적으로 사용하는 클래스는 아니다.

- IP와 관련된 정보를 가져올 때 사용한다.

- is 메소드 : 주로 맞냐 아니냐를 묻는다.


<내 컴퓨터 ip주소 확인하기>

DOS 창을 열어서 ipconfig 를 열면 내컴퓨터 아이디 확인 할 수 있다.


예)

C:\Users\User>ipconfig

Windows IP 구성

무선 LAN 어댑터 로컬 영역 연결* 2:

   미디어 상태 . . . . . . . . : 미디어 연결 끊김

   연결별 DNS 접미사. . . . :

이더넷 어댑터 이더넷:

   연결별 DNS 접미사. . . . :

   링크-로컬 IPv6 주소 . . . . : fe80::4919:ff9:ac3e:d9de%9

   IPv4 주소 . . . . . . . . . : 70.12.113.140

   서브넷 마스크 . . . . . . . : 255.255.255.0

   기본 게이트웨이 . . . . . . : 70.12.113.1

무선 LAN 어댑터 Wi-Fi:

   미디어 상태 . . . . . . . . : 미디어 연결 끊김

   연결별 DNS 접미사. . . . :

터널 어댑터 로컬 영역 연결* 12:

   연결별 DNS 접미사. . . . :

   IPv6 주소 . . . . . . . . . : 2001:0:9d38:6abd:c1f:13bc:b9f3:8e73

   링크-로컬 IPv6 주소 . . . . : fe80::c1f:13bc:b9f3:8e73%5

   기본 게이트웨이 . . . . . . : ::

C:\Users\User>ping

사용법: ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v TOS]

            [-r count] [-s count] [[-j host-list] | [-k host-list]]

            [-w timeout] [-R] [-S srcaddr] [-c compartment] [-p]

            [-4] [-6] target_name

옵션:

    -t             중지될 때까지 지정한 호스트를 ping합니다.

                   통계를 보고 계속하려면 <Ctrl+Break>를 입력합니다.

                   중지하려면 <Ctrl+C>를 입력합니다.

    -a             주소를 호스트 이름으로 확인합니다.

    -n count       보낼 에코 요청의 수입니다.

    -l size        송신 버퍼 크기입니다.

    -f             패킷에 조각화 안 함 플래그를 설정(IPv4에만 해당)합니다.

    -i TTL          Time To Live

    -v TOS         서비스 종류(IPv4에만 해당. 이 설정은 더

                   이상 사용되지 않으며 IP 헤더의 서비스 종류 필드에 영향을

                   주지 않음)입니다.

    -r count       count 홉의 경로를 기록합니다(IPv4에만 해당).

    -s count       count 홉의 타임스탬프(IPv4에만 해당)입니다.

    -j host-list   host-list에 따라 원본 라우팅을 완화합니다(IPv4에만 해당).

    -k host-list   host-list에 따라 원본 라우팅을 강화합니다(IPv4에만 해당).

    -w timeout     각 응답의 대기 시간 제한(밀리초)입니다.

    -R             라우팅 헤더를 사용하여 역방향 라우팅도

                   테스트합니다(IPv6에만 해당).

                   RFC 5095에 따라 이 라우팅 헤더는 사용되지

                   않습니다. 이 헤더를 사용할 경우 일부 시스템에서 에코

                   요청이 삭제될 수 있습니다.

    -S srcaddr     사용할 원본 주소입니다.

    -c compartment 라우팅 컴파트먼트 ID입니다.

    -p             Hyper-V 네트워크 가상화 공급자 주소에 대해 ping을 수행합니다.

    -4             IPv4를 사용합니다.

    -6             IPv6을 사용합니다.


<상대컴퓨터와 연결되어 있는지 확인하기>

ping을 도스에 쳐보자.

ping : 상대 컴퓨터가 네트워크에 연결되어 있는지 확인.


ping 이 안되면 네트워크가 연결이 안되었거나 방화벽등 다른 이유로 막혀있는 것이다.


예)

C:\Users\User>ping 180.70.152.166

Ping 180.70.152.166 32바이트 데이터 사용:

180.70.152.166의 응답: 바이트=32 시간=36ms TTL=51

180.70.152.166의 응답: 바이트=32 시간=21ms TTL=51

180.70.152.166의 응답: 바이트=32 시간=10ms TTL=51

180.70.152.166의 응답: 바이트=32 시간=23ms TTL=51

180.70.152.166에 대한 Ping 통계:

    패킷: 보냄 = 4, 받음 = 4, 손실 = 0 (0% 손실),

왕복 시간(밀리초):

    최소 = 10ms, 최대 = 36ms, 평균 = 22ms


<아이피나 도메인 이름을 찾아줄 때>

nslookup

아이피나 도메인 이름을 찾아줄 때 사용


예)

C:\Users\User>nslookup

기본 서버:  nic.samsung.co.kr

Address:  203.241.132.34

> nslookup 125.209.222.141

서버:    [125.209.222.141]

Address:  125.209.222.141

DNS request timed out.

    timeout was 2 seconds.

DNS request timed out.

    timeout was 2 seconds.

*** 125.209.222.141에 대한 요청이 제한 시간을 초과했습니다.



Module java.base

Package java.net

Class InetAddress


를 가보면 생성자를 막아놓았다.

왜 막아 놓았을까?


싱글톤 Singleton 이기 때문에 인스턴스를 하나만 생성했다.


이렇게 클래스마다 특성이 다르기 때문에 API를 보아야한다.



package prjNetwork;

import java.net.InetAddress;

import java.net.UnknownHostException;

public class InetaddressTest {

    

    

    public static void main(String[] args) {

        

        try {

            InetAddress inet = InetAddress.getByName("google.co.kr");

            System.out.println(inet.getHostAddress());

            System.out.println(inet.getHostName());

        } catch (UnknownHostException e) {

            System.out.println("주소를 찾을 수 없습니다.");

        }

    }

}


※ 결과값


172.217.24.35

google.co.kr



package prjNetwork;

import java.net.InetAddress;

import java.net.UnknownHostException;

public class InetaddressTest {

    

    

    public static void main(String[] args) {

        

        try {

            //InetAddress클래스는 IP관련 정보를 가져올 때 사용한다.

            InetAddress inet = InetAddress.getByName("google.co.kr"); //

            System.out.println(inet.getHostAddress());        //호스트주소를 가져온다.

            System.out.println(inet.getHostName());            //사이트주소를 가져온다.

            

            System.out.println("----------------------------");

            inet = InetAddress.getByName("172.217.24.195"); //

            System.out.println(inet.getHostAddress());

            System.out.println(inet.getHostName());

            

            System.out.println("----------------------------");

            // Loopback 하나의 컴퓨터를 두 대의 컴퓨터처럼 사용하게 해준다.

            // LoopbackAddress 내컴퓨터 랜카드에서 제공하는 테스트를 위해 서버역할을 하는 가상도메인을 가져온다.

            // 로컬호스트는 내 컴퓨터에서 사용하는 가상도메인이다.

            inet = InetAddress.getLoopbackAddress();        //내컴퓨터 안의 서버용으로 쓰기 위한 가상도메인이다.

            System.out.println(inet.getHostAddress());

            System.out.println(inet.getHostName());

            

            

        } catch (UnknownHostException e) {

            System.out.println("주소를 찾을 수 없습니다.");

        }

    }

}



※ 결과값


172.217.24.35

google.co.kr

----------------------------

172.217.24.195

hkg12s13-in-f3.1e100.net

----------------------------



<소켓>

다른프로그램과의 통신을 시도하겠다는 의미

다른 컴퓨터의 프로그램과 소통할 수 있는 통로를 만들어 놓겠다.

소켓이 미리 선을 깔아 놓는 것이기 때문에 TCP방식을 쓴다는 이야기


<웹서버>

만약에 naver를 들어간다고 생각해보자.

우리는 어떻게 네이버의 화면을 볼 수 있을까?

웹서버가 있기 때문에 네이버의 프로그램에 들어갈 수 있다.

웹서버는 모두 포트가 있다.

웹서버의 기본포트는 80이다.


www.naver.com:80

누구에게나 공개가 되어있기 때문에 보통은 생략한다.


포트는 네트워크 프로그램에 달려있는 통로이자 문이다.




package prjNetwork;

import java.io.IOException;

import java.net.Socket;

import java.net.UnknownHostException;

public class SocketTest1 {

    public static void main(String[] args) {

        

        Socket socket = null;

        

        try {

            //소켓 : 다른프로그램과의 통신을 시도하겠다는 의미

            //다른 컴퓨터의 프로그램과 소통할 수 있는 통로를 만들어 놓겠다.

            //소켓이 미리 선을 깔아 놓는 것이기 때문에 TCP방식을 쓴다는 이야기

            //자바에서 소켓을 쓴다는 의미는 클라이언트가 된다는 뜻이다.

            socket = new Socket("www.naver.com";, 80);    

            System.out.println(socket);

        } catch (IOException e) {

            e.printStackTrace();

        }finally {

            try {

                socket.close();            //소켓을 닫아준다.

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    }

}



※ 결과값


Socket[addr=www.naver.com/202.179.177.21,port=80,localport=14573]



port=80

네이버의 포트번호 

(네이버 뿐 아니라 기본적으로 많이 쓰는 포트번호이다.)


localport=14573

내 컴퓨터의 포트번호

자동적으로 사용을 안하는 포트번호를 잡아준다.


www.naver.com

네이버의 주소


202.179.177.21,

네이버 서버주소


포트는 운영체제가 만들어놓은 문들(포트)을 가져다 쓴다.


아래 주소를 따라가보자.

C:\Windows\System32\drivers\etc

에는 운영체제에 네트워크 관련 파일들이 있다. 여기에서 services를 열어보자


...(중략)...

http               80/tcp    www www-http           #World Wide Web

hosts2-ns          81/tcp                           #HOSTS2 Name Server

hosts2-ns          81/udp                           #HOSTS2 Name Server

kerberos           88/tcp    krb5 kerberos-sec      #Kerberos

kerberos           88/udp    krb5 kerberos-sec      #Kerberos

hostname          101/tcp    hostnames              #NIC Host Name Server

iso-tsap          102/tcp                           #ISO-TSAP Class 0

rtelnet           107/tcp                           #Remote Telnet Service

...(중략)...


6만 여개 포트 중에서 쓰고 있는 포트 번호가 있다.

쓰고 있는 포트 번호를 제외하고 안쓰고 있는 포트번호를 부여받는다.




package prjNetwork;

import java.io.IOException;

import java.net.Socket;

import java.net.UnknownHostException;

public class SocketTest1 {

    public static void main(String[] args) {

        

        Socket socket = null;

        

        try {

            //소켓 : 다른프로그램과의 통신을 시도하겠다는 의미

            //다른 컴퓨터의 프로그램과 소통할 수 있는 통로를 만들어 놓겠다.

            //소켓이 미리 선을 깔아 놓는 것이기 때문에 TCP방식을 쓴다는 이야기

            //자바에서 소켓을 쓴다는 의미는 클라이언트가 된다는 뜻이다.

            socket = new Socket("www.naver.com";, 80);    

            System.out.println(socket);

            System.out.println("------------------------------------------------");

            

            //현재접속한 서버를 통해서 주소를 알 수 있다.

            System.out.println("서버주소 : " + socket.getInetAddress());

            System.out.println("서버주소 : " + socket.getInetAddress().getHostName());

            System.out.println("서버주소 : " + socket.getInetAddress().getHostAddress());

            System.out.println("서버주소 : " + socket.getPort());

            System.out.println("------------------------------------------------");

            

            //현재접속한 클라이언트(내 프로그램)를 통해서 주소를 알 수 있다.

            System.out.println("클라이언트주소 : " + socket.getLocalAddress());

            System.out.println("클라이언트주소 : " + socket.getLocalAddress().getHostName());

            System.out.println("클라이언트주소 : " + socket.getLocalAddress().getHostAddress());

            System.out.println("클라이언트주소 : " + socket.getLocalPort());

            

        } catch (IOException e) {

            e.printStackTrace();

        }finally {

            try {

                socket.close();            //소켓을 닫아준다.

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    }

}



※ 결과값


Socket[addr=www.naver.com/202.179.177.21,port=80,localport=14898]

------------------------------------------------

서버주소 : www.naver.com/202.179.177.21

서버주소 : www.naver.com

서버주소 : 202.179.177.21

서버주소 : 80

클라이언트주소 : /70.12.113.140

클라이언트주소 : DESKTOP-G1R697G

클라이언트주소 : 70.12.113.140

클라이언트주소 : 14898



package prjNetwork;

import java.io.BufferedReader;

import java.io.FileWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.net.Socket;

import java.net.UnknownHostException;

public class SocketTest2 {

    public static void main(String[] args) throws UnknownHostException, IOException {

        

        Socket socket = new Socket("www.multicampus.com";, 80);

        

        //받을 준비

        //서버가 보내서 입력된 데이터를 한 줄씩 읽는다.

        BufferedReader br =

                new BufferedReader(    //.getInputStream() 서버에서 무언가를 받을 때 쓰는 메서드

                        new InputStreamReader(socket.getInputStream(), "utf-8"));  

        

        //서버에게 무언가를 보낼준비.

        OutputStream out = socket.getOutputStream();

        //아래 ""의 값을 서버에 보낸다.

        out.write(("GET /index.html HTTT/1.0" + "\r\n\n").getBytes());

        out.flush();

        

        

        String line = null;

        while((line = br.readLine())!=null) {

            System.out.println(line);

        }

        

    }

}



※ 결과값


HTTP/1.1 404 Not Found

Date: Thu, 09 Nov 2017 02:33:59 GMT

Server:

Last-Modified: Fri, 12 Nov 2010 05:59:16 GMT

ETag: "d12-494d4ca5e5500"

Accept-Ranges: bytes

Content-Length: 3346

Connection: close

Content-Type: text/html

Content-Language: en

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=euc-kr" />

<link href="http://www.credu.com/Error/css/normal.css"; rel="stylesheet" type="text/css">

<script language="JavaScript"></script>

<title>Login</title>

</head>

<!-- ????? ÷?????? ???ε? ?????? ???? ??? -->

<script>

    function pop(url,name,w,h){ window.open(url,name,'width='+w+',height='+h+',scrollbars=yes, status=no') }

</script>

<body>

<table width="829" height="450" border="0" align="center" cellpadding="0" cellspacing="0">

  <tr>

    <td height="5" background="http://www.credu.com/Error/img/bg_top.gif"></td>;

  </tr>

<tr>

    <td background="http://www.credu.com/Error/img/bg.gif">;

      <table width="829" border="0" cellspacing="0" cellpadding="0" >

        <tr>        

        <td align="center">

        <!--///////////////////////////////////// $$ Start of ?????? /////////////////////////////////////////-->

        <table width="630" border="0" cellpadding="0" cellspacing="0">

          <tr>

            <td height="1" bgcolor="#d6e2ee"></td>

          </tr>

          <tr>

            <td bgcolor="#edf4fb">

            <table width="100%" border="0" cellspacing="0" cellpadding="0">

              <tr>

                <td><img src="http://www.credu.com/Error/img/Error_tit.gif"; width="630" height="90" alt=""></td>

              </tr>            

              <tr>

                <td style="padding-left:52; color:#62849e; font-family:????;"><img src="http://www.credu.com/Error/img/Error_dot.gif"; width="3" height="3" align="absmiddle" hspace="3"><strong>?????? ???????? ??? ?? ????? ???????? ???????.</strong></td>

              </tr>

              <tr>

                <td height="10"></td>

              </tr>

              <tr>

                <td style="font-size:11px; color:#888888; font-family:????; padding-left:61; line-height:17px"><!--- ???? ??????? ??????. --->

                ?????? ?????? ???? ??????? ??? ??? ????????? ??????.<br>

                ?????? ?????? ?????????? ?????? ??쿡 ???? ??? ???? ????帳???.

                </td>

              </tr>

              <tr>

                <td height="11"></td>

              </tr>

              <tr>

                  <td align="center">

                      <div class="Error_down">

                          <a href="http://www.credu.com/de_common/credu/popup/20090925/090925_report_error.html"; onclick="pop(href,'company',570,750); return false;"><img src="http://www.credu.com/Error/img/btn_Error_down.gif"; alt="???? ????????" border="0" /></a>

                      </div>

                  </td>

              </tr>

              <tr>

                <td height="5"></td>

              </tr>

              <tr>

                 <td align="center"><img src="http://www.credu.com/Error/img/Error_info.gif"; width="540" height="71"></td>

              </tr>

              <tr>

                <td align="center">&nbsp;<a href="mailto:webmaster@credu.com" onfocus="this.blur()"><img src="http://www.credu.com/Error/img/Error_btn_mail.gif" width="108" height="20" border="0" hspace="5" vspace="10"></a><a href="http://www.credu.com" onfocus="this.blur()"><img src="http://www.credu.com/Error/img/Error_btn_home.gif" border="0" vspace="10"></a></td>

              </tr>

              <tr>

                <td height="7"></td>

              </tr>

            </table>

            </td>

          </tr>

          <tr>

            <td height="2" bgcolor="#d6e2ee"></td>

          </tr>

         </table></td>

      </tr>

      <!--///////////////////////////////////// $$  END of ?????? /////////////////////////////////////////-->

    </table></td>

  </tr>

  <tr>

    <td height="4" background="http://www.credu.com/Error/img/bg_bottom.gif"></td>;

  </tr>

</table>

</body>

</html>





(3) URL, URLConnection

URL(Uniform Resource Locator)

실제 자원의 위치

해당 주소의 리소스를 가져다가 쓸 수 있게 해주는 클래스이다.

이 안에는 이미 소켓과 기본설정이 포함되어 있다.


package prjNetwork;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.UnsupportedEncodingException;

import java.net.MalformedURLException;

import java.net.URL;

public class URLTest {

    public static void main(String[] args) throws UnsupportedEncodingException, IOException {

        URL myurl = new URL("http://www.naver.com";);

        

        BufferedReader br =

                new BufferedReader(

                        new InputStreamReader(myurl.openStream(),"utf-8"));

        

        String line = null;

        while ((line=br.readLine()) != null) {

            System.out.println(line);

        }

            

    }

}



※ 결과값


<html>

<head><title>302 Found</title></head>

<body bgcolor="white">

<center><h1>302 Found</h1></center>

<hr><center> NWS </center>

</body>

</html>



4. 소켓방식


1) TCP


TCP : 연결지향적

- 연결지향적 : 미리 연결을 해놓고 작업을 하는 방식이다.

- 전화장치와 비슷한다.

- 장점 : 데이터를 안전하게 주고 받을 수 있다.

- 단점 : 먼저 선을 연결해야하기 때문에 UDP와 비교해서 속도가 떨어진다.

- 1:1 통신에 많이 쓰인다.

- 중요한 정보일 때는 TCP이다.


[참고]

https://ko.wikipedia.org/wiki/%EC%A0%84%EC%86%A1_%EC%A0%9C%EC%96%B4_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C



TCP방식의 대표적인 클래스를 살펴보자.

-Sockett

-ServerSoket




package prjNetwork;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.Socket;

public class TcpClient1 {

    public static void main(String[] args) {

        Socket client = null;

        

        try {

            //하나의 컴퓨터로 클라이언트생성

            client =new Socket("70.12.113.139", 6666);    //클라이언트가 6666포트로 접근 가능

            

            BufferedReader bw =    

                    new BufferedReader(

                            new InputStreamReader(client.getInputStream()));

            

            System.out.println(bw.readLine());

        }catch(Exception err) {

            err.printStackTrace();

        }finally {

            

        }

    }

}

package prjNetwork;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.net.ServerSocket;

import java.net.Socket;

public class TcpServer1 {

    public static void main(String[] args) {

        System.out.println("*******서버 실행 중");

        

        //서버용 소켓과 데이터용 소켓 두 개가 필요하다.

        ServerSocket server =null;

        Socket client = null;

        

        while(true) {    //서버는 꺼지면 안되기 때문에 무한 반복을 한다.

            try {

            

                //처음에 포트번호를 주고 클라이언트가 포트번호로 접속하도록 한다.

                //윈도우에서 1~1024번은 예약되어있으므로 예약된 번호는 피해서 적어야 한다.

                server = new ServerSocket(6666);

                client = server.accept();//클라이언트가 접속을 하는지 안하는지 감시하고

                                         //서버소켓에 가지고 있는 정보를 다른 소켓에 넘겨준다.

                

                System.out.println("앗~~~~누군가 접속했습니다.");

                System.out.println("접속자 : " + client.getInetAddress().getHostName());

                System.out.println("접속자 : " + client.getPort());

                

                BufferedWriter bw =

                        new BufferedWriter( new OutputStreamWriter(client.getOutputStream()));

                bw.write("클라이언트님께 영광의 박수!!!!!!!!.");//상대방 컴퓨터에 쓴다.

                bw.flush();

                

            

            } catch (IOException e) {

            

            }

            finally {

                try {

                    server.close();

                    client.close();

                }catch (IOException e) {}

            }

    

            }//While end    

    }

}



cmd 창을 이용해 클라이언트를 실행하고

이클립스에서는 서버를 실행해서

다른 컴퓨터와 연결해보면


※ 결과값



*******서버 실행 중

앗~~~~누군가 접속했습니다.

접속자 : 70-12-113-139.pools.spcsdns.net

접속자 : 51106



누군가가 접속한 것을 알 수 있다.



concurrency 시스템 : 동시에 여러명이 접속했을 때 해결 할 수 있는 시스템





package prjNetwork2;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.Socket;

import java.util.Scanner;

public class TcpClient2 extends Thread{

    private Scanner scan;

    private Socket client;

    

    @Override

    public void run() {

        try {

            scan = new Scanner(System.in);

        

            BufferedWriter bw =

                    new BufferedWriter(

                            new OutputStreamWriter(client.getOutputStream()));

            

            System.out.println("메시지 : ");

            String msg;

            while((msg=scan.nextLine())!=null) {

                if(msg.equals("stop")) {

                    break;

                    

                }

                bw.write(msg + "\r\n"); // \r 커서 위치를 맨 앞으로

                bw.flush();

            }

            

            

        }catch(Exception err) {

            System.out.println("전송실패 : " + err);

        }

    }

    void connection() {

        scan = new Scanner(System.in);

        

        System.out.println("접속할 서버 : ");

        String serverName = scan.next();

        

        System.out.println("접속할 포트 : ");

        int port = scan.nextInt();

        try {

            client = new Socket(serverName, port);

            start();

        }

        catch(Exception err) {

            System.out.println("소켓생성실패 : " + err);

        }

    }

    

    public static void main(String[] args) {

        new TcpClient2().connection();

    }

}




package prjNetwork2;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.ServerSocket;

import java.net.Socket;

class Chatter extends Thread{

    private Socket socket;    //소켓 인스턴스 변수 생성

    Chatter(Socket s){        //생성사 생성

        socket = s;            

        //소켓의 주소를 가져옴

        System.out.println(socket.getInetAddress() + " 접속함");    

        start();    //스레드 시작

    }

    

    @Override

    public void run() {    //사용자로 부터 데이터를 읽어와 출력

        while(true) {

            try {

                BufferedReader br =    

                        new BufferedReader(

                                new InputStreamReader(socket.getInputStream()));

            }catch(Exception err) {

                System.out.println(socket.getInetAddress()+"종료됨");

                try{

                    socket.close();

                } catch(IOException e) {

                    

                }

            }

        }

    }

}

public class TcpServer2 {

    private static final int SEVER_PORT = 3000;    //포트번호를 상수로 지정

    private static ServerSocket server;

    private static Socket client;

    

    public static void main(String[] args) {

        try {

            server = new ServerSocket(SEVER_PORT);

            System.out.println("*****서버실행 중");

        }catch(Exception err) {

            System.out.println("서버 소켓생성 실패 : " + err);

        }

        

        connection();

    }

    

    static void connection() {

        while(true) {

            try {

                client = server.accept();

                new Chatter(client);

            }

            catch(Exception err) {

                System.out.println("연결실패 : " + err);

                }try {

                    server.close();

                

                }catch(IOException e) {

                    try {

                        client.close();

                        return;    

                    } catch (IOException e1) {

                        // TODO Auto-generated catch block

                        e1.printStackTrace();

                    }

        

            }

        }

        

    }

}










+ Recent posts