TCP 프로 토 콜 과 UDP 프로 토 콜 의 원리 와 차이 점 을 깊이 이해 하 다.

네트워크 프로 그래 밍 은 세 가지 요소 가 있 는데 그것 이 바로 IP 주소,포트 번호 와 통신 프로 토 콜 이다.본 고 는 주로 TCP 와 UDP 라 는 두 가지 통신 프로 토 콜 과 프로 그래 밍 의 실현 을 다 루 고 있다.
우선 IP 주소,포트 번호,통신 프로 토 콜 에 관 한 지식 을 알 아야 합 니 다.
IP 주소
네트워크 에 있 는 컴퓨터 는 IP 주 소 를 사용 하여 유일한 표 지 를 하고 IP 주 소 는 IPv 4 와 IPv 6 두 가지 유형 이 있다.IPv 4 는 10 진법 또는 2 진법 표현 형식 을 사용 하고 10 진법 은 비교적 자주 사용 하 는 표현 형식 이다.예 를 들 어192.168.1.131,IPv 6 는 16 진법 표현 형식 을 사용 하여 보통 자주 사용 하지 않 는 다.
IP 주소 관련 정 보 를 어떻게 보 는 지:
윈도 시스템 에서 cmd 를 켜 고 명령ipconfig을 입력 하고 리 턴 을 누 르 면 볼 수 있 습 니 다.Linux 나 Mac 시스템 에서 단말 기 를 켜 고ifconfig명령 을 사용 하여 리 턴 을 누 르 면 볼 수 있 습 니 다.
포트 번호
포트 번 호 는 컴퓨터 에 있 는 응용 프로그램의 정수 숫자 레이 블 로 서로 다른 응용 프로그램 을 구분 하 는 데 사용 된다.0 ~ 1024시스템 에 의 해 사용 되 거나 보 존 된 포트 번호0 ~ 65535는 효과 적 인 포트 번호 이다.즉,우리 가 일부 프로그램 에 대해 포트 번 호 를 정의 하려 면1024 ~ 65535범위 내의 정수 숫자 를 선택해 야 한다.
예 를 들 어 예전 에 배 운 MySQL 의 포트 번 호 는 3306 이 고 SQLServer 의 포트 번 호 는 1433 이 며 Oracle 의 포트 번 호 는 1521 인 것 을 찾 아 보 았 다.
반드시 이 데이터베이스 에 대응 하 는 포트 번 호 를 깊 은 머 릿 속 에 숨 기 고 나중에 데이터 베 이 스 를 연결 할 때 포트 번 호 를 사용 해 야 한다.
통신 프로 토 콜
쉽게 말 하면 통신 협 의 는 네트워크 통신 의 규칙 으로 TCP 프로 토 콜 과 UDP 프로 토 콜 두 가지 로 나 뉜 다.
첫 번 째:TCP 프로 토 콜
영어 이름:Transmission Control Protocol
전송 제어 프로 토 콜
프로 토 콜 설명:TCP 는 연결 을 위 한 신뢰 할 수 있 고 바이트 흐름 을 바탕 으로 하 는 전송 층 통신 프로 토 콜 입 니 다.
예 를 들 어 전 화 를 하려 면 쌍방 이 모두 연결 해 야 대 화 를 할 수 있다.
특징:효율 이 낮 고 데이터 전송 이 안전 합 니 다.
두 번 째:UDP 프로 토 콜
영문 이름:사용자 데이터 그램 프로 토 콜
데이터 프로 토 콜
프로 토 콜 설명:UDP 는 연결 되 지 않 은 전송 층 을 위 한 통신 프로 토 콜 입 니 다.
예 를 들 어 문자 메 시 지 를 보 낼 때 쌍방 이 연결 할 필요 가 없다.But,데이터 신문 의 크기 는 64k 이내 로 제한 해 야 한다.
특징:효율 이 높 고 데이터 전송 이 안전 하지 않 아 가방 을 잃 어 버 리 기 쉽다.
4.3 요소 관계 도와 네트워크 모델 도
1.네트워크 프로 그래 밍 3 요소 관계 도
在这里插入图片描述
주:그림 의 포트 번호,IP 주 소 를 보 여 줍 니 다.진실 이 아 닙 니 다.
2.OSI 참조 모델 과 TCP/IP 참조 모델
在这里插入图片描述
5.TCP 프로 그래 밍
TCP 는 바이트 흐름 을 기반 으로 하 는 전송 층 통신 프로 토 콜 이기 때문에 TCP 프로 그래 밍 은 IO 흐름 을 기반 으로 한다.
클 라 이언 트 에 대해 우 리 는Socket클래스 를 사용 하여 대상 을 만들어 야 합 니 다.서버 측 에 대해 저 희 는ServerSocket을 사용 하여 대상 을 만 들 고 대상 호출accept()방법 으로 클 라 이언 트 의 방문 여 부 를 감청 해 야 합 니 다.
클 라 이언 트 와 서버 측 도해:
在这里插入图片描述
클 라 이언 트 와 서버 측 실현 절차:
전제:하나의 항목 을 만 들 고 프로젝트 에 두 개의 모듈(model)을 만 듭 니 다.하나의 모듈 은 클 라 이언 트 관련 코드 를 넣 고 하나의 모듈 은 서버 쪽 관련 코드 를 넣 습 니 다.
디 렉 터 리 구 조 는 아래 그림 과 같다.
在这里插入图片描述
클 라 이언 트:
1.Socket대상 을 만 들 고 서버 엔 드 프로그램의 포트 번호 와 서버 엔 드 호스트 의 IP 주 소 를 지정 합 니 다.
2.Socket의 대상 호출getOutputStream()방법 으로 바이트 출력 흐름 대상 을 가 져 옵 니 다.
3.바이트 출력 흐름write(byte[] buf)을 호출 하거나write(int b)서버 에 지정 한 데 이 터 를 보 냅 니 다.
4.흐름 을 닫 는 것 을 기억 하 세 요.
서버 쪽:
1.ServerSocket대상 을 만 들 고 이 프로그램의 포트 번 호 를 지정 합 니 다.포트 번 호 는 클 라 이언 트 가 지정 한 포트 번호 와 같 아야 합 니 다.
2.ServerSocket대상 의accept()방법 으로 클 라 이언 트 가 보 낸 요청 을 감청 하고 반환 값 은Socket대상 이다.
3.Socket대상 을 호출 하 는getInputStream()방법 으로 바이트 입력 흐름 대상 을 가 져 옵 니 다.
4.바이트 입력 스 트림 대상read(byte[] buf)또는read()방법 으로 데 이 터 를 얻 습 니 다.
5.흐름 을 닫 는 것 을 기억 하 세 요.
실례:
클 라 이언 트 가 서버 에 메 시 지 를 보 내 고 서버 에 표 시 됩 니 다.
클 라 이언 트 클래스(클 라 이언 트)

package cn.tkrnet.client;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {
        
        //  Socket  ,           IP  ,                
        //localhost    IP  
        Socket client = new Socket("localhost",9000);
        
        //     ,           
        OutputStream os = client.getOutputStream();
        
        os.write("Java is my friend !".getBytes());
        System.out.println("     ");

        //   
        os.close();
        client.close();
    }
}
서버 클래스(서버 쪽)

package cn.tkrnet.server;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        System.out.println("--       --");

        //  ServerSocket  ,                  
        ServerSocket server = new ServerSocket(9000);

        //    accept(),            
        Socket socket = server.accept();

        //       
        InputStream is = socket.getInputStream();

        //         
        int b = 0;
        while ((b =is.read()) != -1){
            System.out.print((char)b);
        }
        //   
        is.close();
        socket.close();
        server.close();
    }
}
알림:프로그램 을 실행 할 때 서버 쪽 의 프로그램 코드 를 먼저 실행 하고 클 라 이언 트 의 프로그램 코드 를 실행 해 야 합 니 다.클 라 이언 트 가 서버 에 요청 을 보 내 려 면 서버 쪽 이 열 려 있 는 상태 여야 하기 때 문 입 니 다.
서버 클래스(서버 쪽)실행 결과:
--서버 쪽 오픈-
클 라 이언 트 클래스(클 라 이언 트)실행 결과:
메시지 발송 됨
클 라 이언 트 클래스(클 라 이언 트)가 실 행 된 후 서버 클래스(서버 쪽)에서 정 보 를 받 고 실행 결과:
--서버 쪽 이 열 렸 습 니 다--Java is my friend!
실례 분석:
서버 측 이 시 작 된 후 서버 측의accept()방법 은 클 라 이언 트 가 서버 에 연 결 될 때 까지 감청 상태 에 있 었 고 서버 측 은 클 라 이언 트 가 보 낸 데 이 터 를 흐름 에서 읽 었 다.
솔직히 말씀 드 리 지만,이것 은 매우 무적 이 고 간단 한 단 방향 통신 실례 입 니 다.
6.UDP 프로 그래 밍
UDP 는 데이터 보 를 사용 하여 데이터 전송 을 하 는데 클 라 이언 트 와 서버 의 구분 이 없고 발송 자 와 수신 자 만 있 으 며 둘 중 어느 것 을 먼저 시작 해도 오류 가 발생 하지 않 지만 데이터 패 킷 을 잃 어 버 리 는 현상 이 발생 할 수 있 습 니 다.보 내 는 내용 은 글자 수 제한 이 있 으 며 크기 는 64k 이내 로 제한해 야 합 니 다.
발송 자 와 수신 자 실현 절차:
전제:프로젝트 를 만 들 고 프로젝트 에 두 개의 모듈(model)을 만 듭 니 다.하나의 모듈 은 발송 자 관련 코드 를 넣 고 하나의 모듈 은 수신 자 관련 코드 를 넣 습 니 다.
디 렉 터 리 구 조 는 아래 그림 과 같다.
在这里插入图片描述
발송 자:
1.생 성DatagramSocket대상 은 프로그램의 포트 번 호 를 지정 할 수도 있 고 지정 하지 않 을 수도 있 습 니 다.
2.보 낼 데 이 터 를 준비 합 니 다.
3.DatagramPacket대상 을 만 들 고 보 낸 데 이 터 를 포장 할 때 보 내 는 내용,얼마나 보 내 는 지,어디로 보 내 는 지,수신 자의 포트 번호 네 개의 인 자 를 지정 해 야 합 니 다.
4.DatagramSocket대상 을 호출 하 는send()방법 으로 데 이 터 를 보 냅 니 다.
5.흐름 을 닫 는 것 을 기억 하 세 요.
수신 자:
1.DatagramSocket대상 을 만 들 고 수신 자의 포트 번 호 를 지정 합 니 다.이것 은 반드시 지정 해 야 합 니 다.
2.발송 자가 보 낸 데 이 터 를 받 기 위해byte유형의 배열 을 만 듭 니 다.
3.대상 을 만 들 고 데 이 터 를 받 을 준 비 를 합 니 다.
4.DatagramPacket대상 을 호출 하 는DatagramSocket방법 은 데 이 터 를 수신 하 는 데 사용 된다.
5.receive()류 의 구조 방법 을 사용 하여String유형의 배열 의 데 이 터 를byte유형 으로 전환 시 켜 표시 합 니 다.
6.흐름 을 끄 세 요.
실례:
발송 자가 정 보 를 보 내 고 수신 자가 정 보 를 받 으 며 표시 합 니 다.
Sender 클래스(발송 자)

package cn.tkrnet.Sender;

import java.io.IOException;
import java.net.*;

public class Sender {
    public static void main(String[] args) throws IOException {

        //              ,           7770
        DatagramSocket ds = new DatagramSocket(7770);   //         
        System.out.println("---   ---");

        //       ,      
        byte[] b = "Java is my friend !".getBytes();

        //8800        ,netAddress.getByName("localhost")      IP  
        DatagramPacket dp = new DatagramPacket(b,b.length, InetAddress.getByName("localhost"),7788);

        ds.send(dp);    //     
        System.out.println("     ");
        //   
        ds.close();
    }
}
Receiver 클래스(수신 자)

package cn.tkrnet.receiver;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Receiver {
    public static void main(String[] args) throws IOException {
        System.out.println("---   ---");

        //          ,                     
        // (         7770,            7788)
        DatagramSocket ds = new DatagramSocket(7788);

        //          
        byte[] b = new byte[1024];
        DatagramPacket dp = new DatagramPacket(b,b.length);

        //    
        ds.receive(dp);
        System.out.println(new String(b,0,dp.getLength()));
        //   
        ds.close();
    }
}
알림:프로그램 을 실행 할 때 발송 자 프로그램 을 먼저 실행 하 든 수신 자 프로그램 을 먼저 실행 하 든 오류 가 발생 하지 않 지만 데이터 패 킷 을 잃 어 버 릴 수 있 습 니 다.일반적으로 우 리 는 수신 자의 프로그램 코드 를 먼저 실행 한 다음 에 발송 자의 프로그램 코드 를 실행 합 니 다.
Receiver 클래스(수신 자)실행 결과:
수신 자
Sender 클래스(발송 자)실행 결과:
발송 자-데이터 발송
Sender 클래스(발송 자)가 실 행 된 후 Receiver 클래스(수신 자)가 정 보 를 받 고 실행 결과:
---수신 자---Java is my friend!
실례 분석:
수신 자가 먼저 실행 을 시작 해 야 포트 번호 가 7788 인 프로그램 이 존재 하고 발송 자가 지정 한 포트 번호 7788 로 데 이 터 를 보 낼 수 있 으 며 수신 자가 데 이 터 를 받 을 수 있 습 니 다.
솔직히 이것 도 슈퍼 무적 간단 한 단 방향 통신 사례 다.
7.총화
TCP 프로 토 콜 과 UDP 프로 토 콜 의 원리 와 차이 점 을 깊이 이해 하 는 이 글 은 여기까지 소개 합 니 다.더 많은 TCP 프로 토 콜 과 UDP 프로 토 콜 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 지원 바 랍 니 다!

좋은 웹페이지 즐겨찾기