본문 바로가기

(Before)BitSchool

2014/05/21 javanetwork - 네트워크의 개요

반응형

java로 서버를 구축하진 않고 tcp/ip나 윈도우쪽을 이용해서 구축한다.


C/S 구조 (클라이언트/서버)

가장일반적인 구조

동기화가 중요하다.

채팅, 파일전송, 등등...


프록시 서버(중계서버)

클라이언트와 서버 사이에 프록시서버가 있다.


OSI 7Layer

1. 응용계층 - 작성한걸 구현 

2. 표현계층 - 응용계층에서 보낸 데이터를 다른시스템에서 읽을수 있게 지원

3. 세션계층 - 접속된 접속자 정보설정, 유지

4. 전송계층 - 네트워크상에서 신뢰성 있는 데이터의 전송을 보장, 정확한 프로세스에게 전달

   흐름제어 - 확인응답을 리턴

5. 네트워크계층 - 라우팅과 네트워크 어드레싱을 담당한다.

6. 데이터링크 계층 - 실질적인 물리적장비와 데이터의 연결을 제공하는 역할.

                           - 물리적 링크를 통한 신뢰성 있는 데이터 전송을 제공

(MAC Address - 통신하기위한 단말기에는 고유한 번호가 존재한다. IP보다 더 따지게 된다. LAN 카드에 있는 고유한 번호이다. )


7. 물리 계층 - 물리적 매체를 통해 bit 


연결지향 통신 - 채팅, 카톡 서로연결을 하고 서로의 반응을 바로바로 확인한다. 

비연결지향 통신 - 게임,방송, 문자 등.. 서로의 반응을 살피지않고 뿌린다.



TCP - 연결 지향적이고 데이터전송을 보장하는 프로토콜, 상대측까지 제대로 전달되었는지 acknowlegment를 주고 받음으로써 점검


수신윈도우 - 수신측에서 가용한 버퍼 공간이 얼마나 되는지를 송신자에게 알려주는데 사용한다.


UDP - 제대로 전달되었는지 확인하지는 않는 특성. 

       - 전송되는 순서에 상관없이 가장 빠른 전송을 지향한다.

       - 전송되는 데이터는 손실 될 수도 있고, 에러가 발생할 수도 있다.

       - 전송되는 데이터의 경계가 존재한다.

       - 한번에 전송되는 데이터의 크기는 제한된다.

IP 주소

- 32비트 4바이트로 구성 -> IPv4

- 0~255 사이의 숫자 지정

- 10진수로 표기하며, dot로 구분

- 127.0.0.1은 자신의 컴퓨터를 뜻함.

- 192.168.x.x는 사설 IP를 뜻함.


Ping

- IP 수준에서 연결성을 확인할 수 있는 도구

- ICMP 에코 요청 메시지를 전송

- 사용할 패킷 크기, 보낼 패킷수, 사용된 경로 기록 여부, 사용할 TTL 값, don't fragment 플래그 설정 여부를 지정할 수 있다.

- 서버의 상태 여부



Socket Type

-소켓의 형태를 지정한다.

-소켓을 통한 데이터 전송의 의미를 결정

(java 에서는 sock_raw타입을 지원하지 않는다.)


Sock_STREAM유형 (TCP)

- 스트림방식의 소켓 생성

- UNIX의 파이프개념과 동일

- 연결형(스트림)서비스 선택 시 사용


Sock_DGRAM유형 (UDP)

- 데이터그램방식의 소켓 생성

- 개별저긍로 주소가 쓰여진 패킷 전송시 사용


InetAddress 클래스

 - 도메인주소를 IP주소로 변환

- IP주소를 도메인으로 변환


nslookup 명령어



클라이언트 접속 대기

- TCP 서버 소켓 생성

-accept 메소드를 호출하여 클라이언트 접속대기

-서버에서 10001번 포트로 클라이언트



클라이언트 접속하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package inetAddress;
import java.io.IOException;
import java.net.*;
 
public class TCPServer {
 
    public static void main(String[] args) {
        // 핸드폰 개통
        // 포트 : 실제 통신을 하기 위해 사용되는 번호
        ServerSocket serversocket = null;
        
        try {
            //1) 소켓생성 --> 클라이언트와 통신 할 수 있는 소켓
            serversocket = new ServerSocket(10001);
            System.out.println("=== 서버 시작 ===");
            //accept메서드 : 대기함수 --> blocking
            // 클라이언트로 부터의 접속을 기다린다.
            
            Socket clientsocket = serversocket.accept(); //return을 안한다.
            // 클라이언트가 접속하면 return한다.
            
            InetAddress addr = clientsocket.getInetAddress()// 접속한 클라이언트의 주소
            
            System.out.println(addr.getHostAddress()+"님이 접속!!!");
            
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // throws는 메서드를 호출한 곳에 던진다. main안에서는 try를 사용해준다. 
    }
}
 

접속 : telnet 127.0.0.1 10001


socket으로 부터 input/outputStream구하기
echo 프로그램

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
 
 
public class TcpEchoServer {
 
    public static void main(String[] args) {
        
        ServerSocket serversocket = null;  // static이라 new가 필요없다.
        
        try {
            //1) 소켓생성 --> 클라이언트와 통신 할 수 있는 소켓
            serversocket = new ServerSocket(10001);
            System.out.println("=== 서버 시작 ===");
            //accept메서드 : 대기함수 --> blocking
            // 클라이언트로 부터의 접속을 기다린다.
            
            Socket clientsocket = serversocket.accept(); //return을 안한다.
            // 클라이언트가 접속하면 return한다.
            
            InetAddress addr = clientsocket.getInetAddress(); // 접속한 클라이언트의 주소
            
            System.out.println(addr.getHostAddress()+"님이 접속!!!");
            //에코 서버 : 전달받은 테이터를 그대로 되돌려 주는 형태의 서버
            
            // java stream --> 흐름, 줄기
            InputStream input = clientsocket.getInputStream();  // 입력통로
            OutputStream out = clientsocket.getOutputStream();  // 출력통로
             
            // 출력
            PrintWriter pw = new PrintWriter(new OutputStreamWriter(out));    // 
            //입력
            BufferedReader br = new BufferedReader(new InputStreamReader(input));
            
            
            String msg = null;
            
            while(true){
                
                if((msg = br.readLine())==null)
                    break;
                
                System.out.println(msg);
                
                
                pw.println(msg);
                pw.flush(); // 버퍼비우기
                
                
            }
            
            pw.close();
            br.close();
            
            clientsocket.close();
            serversocket.close();
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
 
}
 



반응형