찾다
Javajava지도 시간그림과 텍스트로 자세히 설명된 Java 네트워크 프로그래밍

이 글에서는 네트워크 관련 이론과 간단한 Java 네트워크 프로그래밍 예제를 소개합니다.

이 글에서는 주로 컴퓨터 네트워크의 전반적인 아키텍처와 각 계층 효과를 소개합니다.

  • 컴퓨터 네트워크의 개념

  • OSI 참조 모델

  • TCP/IP 참조 모델

  • IP 프로토콜

  • TCP 프로토콜 및 포트

  • Java 네트워크 프로그래밍 입문 프로그램


컴퓨터 네트워크의 개념

네트워크는 서로 다른 노드들 사이를 연결을 통해 상호 연결하는 것입니다. 비유하자면, 컴퓨터 네트워크는 통신 회선을 통해 서로 다른 지리적 위치에 있는 컴퓨터를 연결하는 강력한 네트워크 시스템입니다. 이 네트워크에서 각 컴퓨터는 노드입니다.

OSI 참조 모델

OSI(Open System Interconnection)는 ISO 조직에서 연구하는 네트워크 아키텍처 집합입니다. 이 이름은 잘 선택되었습니다.
각 계층의 이름과 기능은 다음과 같이 이해되어야 합니다.

名称 功能
物理层 不要理解错了,这一层不包含什么网线、电缆的物理介质。这里只是规定网线和电缆的接口类型,信号电压等。使用bit传输
数据链路层 负责两个相邻节点间的路线,以帧为单位传输。典型设备交换机(Switch)
网络层 两台计算机传输数据可能会经过很多数据链路,网络层的作用就是选择最优的路线。典型设备就是路由器
传输层 提供两个端系统的会话的建立、维护和取消传输连接的功能。使用报文传输
会话层 管理进程间的会话过程,即建立、管理、终止进程间的会话。使用报文传输
表示层 对数据的加解密、解压缩和格式转换等。
应用层 这层就是和用户的具体应用交互。例如:收发E-mail等。

TCP/IP 참조 모델

OSI 네트워크이기 때문입니다. 구조가 계층화되어 너무 많고 너무 복잡해서 TCP/IP 프로토콜이 탄생했습니다. TCP/IP 프로토콜도 OSI의 계층적 아이디어에 의존하지만 4개의 ​​계층으로만 나누어집니다:

名称 功能
主机网络层 为上层提供一个访问接口
网络互联层 把IP数据包发送到目标主机。这一层使用的是IP协议,IP协议规定了数据包的格式,并且规定了为数据包寻找路由的流程。
传输层 使源主机和目标主机的进程可以进行会话。这一层定义了两种协议TCP和UDP协议。
应用层 TCP/IP模型将OSI参考模型中的会话层和表现层功能合并到应用层。

TCP 프로토콜을 기반으로 하는 주요 응용 프로그램은 다음과 같습니다.

• FTP: 네트워크에서 파일을 전송할 수 있는 파일 전송 프로토콜입니다.
• TELNET: 호스트 A에서 원격 호스트 B로의 로그인을 허용하는 가상 터미널 프로토콜입니다.
• HTTP: 하이퍼텍스트 전송 프로토콜(Hypertext Transfer Protocol)을 사용하면 네트워크에서 하이퍼텍스트를 전송할 수 있습니다.
• HTTPS: 하이퍼텍스트 전송 프로토콜 보안.
• POP3: 사용자가 Fortune 서버의 메일 및 메일 폴더에 액세스하고 운영할 수 있습니다.
• IMAP4: 메시징 액세스 프로토콜 버전 4를 사용하면 사용자가 Yuanyun 서버의 메일 및 메일 폴더에 액세스하고 작동할 수 있습니다.
• SMTP: 이메일 전송을 위한 프로토콜입니다.

UDP 프로토콜 기반 애플리케이션 계층 프로토콜:

• SNMP: Simple Network Management Protocol은 로컬 및 원격 네트워크 장치를 관리하는 표준화된 방법을 제공하며 분산형 중앙 집중식 관리입니다. 중앙 집중식 환경의 프로토콜.
• DNS: 도메인 이름 시스템 프로토콜, 호스트의 도메인 이름을 해당 IP 주소로 변환합니다.

IP 프로토콜

IP 네트워크(IP 프로토콜을 사용하는 네트워크)의 각 호스트는 고유한 IP 주소를 가지며, IP 주소는 네트워크의 각 호스트를 식별합니다. IP 주소는 32비트 이진수 시퀀스입니다. 예: 192.168.3.4. 네트워크 주소는 IP 주소와 서브넷 마스크를 AND하여 얻습니다. 서브넷 마스크가 255.255.255.0인 경우 네트워크 주소는 다음과 같습니다. 192.168.3.0

데이터 패킷 전송 프로세스

IP는 패킷 지향 프로토콜입니다. 즉, 데이터를 여러 개의 작은 패킷으로 나누어 별도로 전송합니다. IP 네트워크의 호스트는 로컬 네트워크의 다른 호스트(즉, 유사한 IP 주소를 가진 호스트)에만 직접 데이터 패킷을 보낼 수 있습니다. 호스트에는 실제로 서로 다른 성격의 두 가지 실제 주소가 있습니다. 호스트 A가 동일한 네트워크에 있는 다른 호스트 B에게 패킷을 보내면 ARP(Address Resolution Protocol)를 통해 상대방의 물리적 주소를 얻은 다음 해당 패킷을 상대방에게 전달합니다. ARP 프로토콜의 작동 메커니즘은 호스트 A가 네트워크에서 "주소 192.166.3.5를 가진 호스트를 찾는 중"이라는 ARP 메시지를 브로드캐스트하는 것입니다. 이 IP 주소를 가진 호스트 B는 응답하고 A에게 물리적 주소를 알려줍니다.

호스트 A가 다른 네트워크의 호스트 B로 패킷을 보내는 경우:
호스트 A는 ARP 프로토콜을 사용하여 로컬 네트워크에서 라우터의 물리적 주소를 찾아 패킷을 라우터로 전달합니다. 라우터는 데이터 패킷을 다음과 같이 처리합니다.

  1. 데이터 패킷의 수명 주기가 만료된 경우 데이터 패킷은 폐기됩니다.

  2. 라우팅 테이블을 검색하여 라우팅 테이블에 있는 호스트를 우선순위로 찾으면 해당 호스트로 데이터 패킷이 전송됩니다.

  3. 호스트 매칭에 실패하면 계속해서 라우팅 테이블을 검색해 서브넷의 라우팅 테이블을 매칭하고, 매칭되는 라우팅 테이블이 있으면 해당 라우터로 패킷을 전달한다.

  4. 동일한 서브넷의 라우터 일치에 실패하면 계속해서 라우팅 테이블을 검색하여 동일한 네트워크의 라우터를 찾으면 데이터 패킷이 전달됩니다. 라우터에.

  5. 위 매칭에 실패할 경우 기본 경로를 검색하여 기본 경로가 존재하면 기본 경로에 따라 데이터 패킷을 전송하고, 그렇지 않으면 데이터 패킷을 폐기합니다.
    순서도는 다음과 같습니다.
    그림과 텍스트로 자세히 설명된 Java 네트워크 프로그래밍

도메인 이름

IP는 숫자의 문자열이며 의미가 없습니다. 도메인 이름은 IP에 해당하는 의미 있는 문자열 또는 숫자입니다. 예: www.google.com
도메인 이름과 IP 간의 통신에는 도메인 이름을 IP로 변환하는 도메인 이름 확인 시스템이 필요합니다. DNS 서버는 이 문제를 해결할 수 있습니다.

URL(Uniform Resource Locator)

URL(Uniform Resource Location)은 네트워크에서 리소스의 위치를 ​​식별하기 위해 특별히 설정된 주소 지정 방법입니다. URL은 일반적으로

应用层协议://主机IP地址或域名/资源所在路径/资源名

세 부분으로 구성됩니다. 예: http://www.php.cn/ 여기서 http는 Hypertext Transfer Protocol을 나타내고, blog.csdn.net는 웹 서버의 도메인 이름이고, /article/details/은 웹페이지, 54962975 해당 웹페이지 파일입니다.

TCP 프로토콜 및 포트

IP 프로토콜이 데이터를 전송하면 데이터 전송 과정에서 다양한 문제가 발생합니다. 이로 인해 패킷이 손실되거나 잘못된 패킷 순서가 발생합니다. TCP 프로토콜을 사용하면 두 호스트의 프로세스가 패킷 손실이나 잘못된 패킷에 대한 걱정 없이 원활하게 통신할 수 있습니다. TCP는 패킷의 순서를 추적하고, 패킷이 엉망이면 올바른 순서로 다시 조립합니다. 패킷이 손실되면 TCP는 소스 호스트에게 패킷을 다시 보내도록 요청합니다.

포트

TCP 프로토콜을 사용하면 두 호스트의 프로세스가 원활하게 통신할 수 있지만 호스트에는 둘 이상의 프로세스가 있습니다. TCP는 포트를 사용하여 프로세스를 구별합니다. 포트는 물리적 장치가 아니라 프로세스를 식별하는 데 사용되는 논리적 주소입니다. 컴퓨터의 포트 범위는 0~65535이며, 그 중 포트 0~1023은 일반적으로 일부 서비스에 할당됩니다. 세부 내용은 다음과 같습니다.

服务 端口 协议
文件传输服务 21 FTP
远程登录服务 23 TELENET
邮件传输服务 25 SMTP
万维网超文本传输服务 80 HTTP
访问邮件远程邮件服务 110 POP3
互联网消息存取服务 143 IMAP4
安全的超文本传输服务 443 HTTPS
安全的远程登录服务 992 TELNETS
安全互联网消息存取服务 993 IMAPS

Java网络编程入门程序

Java网络程序都建立在TCP/IP协议基础上,在应用层实现。传输层向应用层提供了套接字Socket接口,Socket封装了下层的数据传细节,应用层的程序通过Socket来建立与远程主机的连接,以及数据传输,如下图所示:
그림과 텍스트로 자세히 설명된 Java 네트워크 프로그래밍

在Java中,有3种套接字类:java.net.Socketjava.net.ServerSocketjava.net.DatagramSocket 。其中SocketServerSocket 建立在TCP协议上,DatagramSocket 类建立在UDP协议基础上。我们创建EchoServer和EchoClient两个类,我们通过ServerSocketSocket来编写。

创建EchoServer类

在服务端通过一直监听端口,来接收客户程序的连接请求。在服务器程序中,先创建一个ServerSocket对象,在构造方法中指定监听的端口:

ServerSocket server = new ServerSocket(8080);

ServerSocket构造器负责在操作系统中将当前进程注册为服务进程。服务器程序调用ServerSocketaccept()方法来监听端口,等待客户端的连接,如果接收到连接,则accept()方法返回一个Socket对象,这个Socket对象与客户端的Socket对象形成了一条通信线路:

Socket socket = server.accept();

Socket提供了getInputStream()方法和getOutputStream()方法,分别返回输入流InputStream对象和输出流OutputStream对象。程序只需向输出流写入东西,就能向对方发送数据;只需从输入流读取数据,就能接收到数据。如下图:
그림과 텍스트로 자세히 설명된 Java 네트워크 프로그래밍
EchoServer 类代码如下:

/**
 * 服务端 服务端类
 *
 */public class EchoServer {


    private ServerSocket serverSocket;    
    public EchoServer(int port) {        
    try {            this.serverSocket = new ServerSocket(port);
            System.out.println("start server success,start port:"+port);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }    /**
     * 获取BufferedReader包装类
     * 
     * @param socket
     * @return
     * @throws IOException
     */
    private BufferedReader getReader(Socket socket) throws IOException {        
    return new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }    /**
     * 获取PrintWriter包装类,
     * 
     * @param socket
     * @return
     * @throws IOException
     */
    private PrintWriter getWriter(Socket socket) throws IOException {        
    // 每写一行自动刷新
        return new PrintWriter(socket.getOutputStream(), true);
    }    public void service() {        while (true) {
            Socket socket = null;            try {
                socket = serverSocket.accept();
                System.out.println("new connect,address is:" + socket.getInetAddress() + " port is:" + socket.getPort());
                BufferedReader reader = getReader(socket);
                PrintWriter writer = getWriter(socket);
                String msg = null;                
                while ((msg = reader.readLine()) != null) {                    
                // 读取一行
                    System.out.println("client request  msg: " + msg);
                    writer.println(echo(msg));                    
                    if ("bye".equalsIgnoreCase(msg)) {                        
                    break;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }finally{                
            if(socket!=null){                    
            try {                        
            //关闭会话连接
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }    private String echo(String msg) {        return "get request msg is '" + msg+"'";
    }    public static void main(String[] args) {        new EchoServer(8080).service();
    }
}

EchoServer类的最主要的方法就是service()方法,它不断登录客户的连接请求。当serverSocket.accept()返回一个Socket对象时,表示与一个客户端建立了连接。

创建EchoClient

在EchoClient程序中,为了与EchoClient通信,需要先创建一个Socket对象:

String host="localhost";int port = 8080;new Socket(host, port);

host表示Server进程所在服务器的地址,port表示Server进程监听的端口。当参数host为’localhost’时,表示服务端和客户端在同一台机器上。下面是EchoClient类的源码:

public class EchoClient {
    private Socket socket;    
    public EchoClient(String host,int port){        
    try {            this.socket = new Socket(host, port);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }    /**
     * 获取BufferedReader包装类
     * 
     * @param socket
     * @return
     * @throws IOException
     */
    private BufferedReader getReader(Socket socket) throws IOException {        
    return new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }    /**
     * 获取PrintWriter包装类,
     * 
     * @param socket
     * @return
     * @throws IOException
     */
    private PrintWriter getWriter(Socket socket) throws IOException {        
    // 每写一行自动刷新
        return new PrintWriter(socket.getOutputStream(), true);
    }    public void talk(){        try {
            BufferedReader reader = getReader(socket);
            PrintWriter writer = getWriter(socket);
            BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in));
            String msg = null;            
            while((msg=localReader.readLine())!=null){
                writer.println(msg);
                System.out.println("server response msg:"+reader.readLine());                
                if("bye".equalsIgnoreCase(msg)){                    
                break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{            
        if(socket!=null){                
        try {
                    socket.close();
                    System.out.println("has been disconnected");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }    public static void main(String[] args) {        
    new EchoClient("localhost", 8080).talk();
    }
}

在EchoClient类中最重要的是talk()方法,该方法不断读取用户从控制台输入的字符串,然后将它发送到EchoServer,在把EchoServer返回的数据打印在控制台。如果输入’bye’字符串,就会结束与EchoServer的通信,调用socket.close()方法端口连接。
具体运行如下图,一个是服务端一个是客户端的控制台:
그림과 텍스트로 자세히 설명된 Java 네트워크 프로그래밍

总结

简单介绍了一下网络的理论知识和TCP/IP协议。并使用Java实现了一个网络通信程序。

 以上就是Java网络编程由浅入深一图文详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!


성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
고급 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 또는 Gradle을 어떻게 사용합니까?고급 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 또는 Gradle을 어떻게 사용합니까?Mar 17, 2025 pm 05:46 PM

이 기사에서는 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 및 Gradle을 사용하여 접근 방식과 최적화 전략을 비교합니다.

적절한 버전 및 종속성 관리로 Custom Java 라이브러리 (JAR Files)를 작성하고 사용하려면 어떻게해야합니까?적절한 버전 및 종속성 관리로 Custom Java 라이브러리 (JAR Files)를 작성하고 사용하려면 어떻게해야합니까?Mar 17, 2025 pm 05:45 PM

이 기사에서는 Maven 및 Gradle과 같은 도구를 사용하여 적절한 버전 및 종속성 관리로 사용자 정의 Java 라이브러리 (JAR Files)를 작성하고 사용하는 것에 대해 설명합니다.

카페인 또는 구아바 캐시와 같은 라이브러리를 사용하여 자바 애플리케이션에서 다단계 캐싱을 구현하려면 어떻게해야합니까?카페인 또는 구아바 캐시와 같은 라이브러리를 사용하여 자바 애플리케이션에서 다단계 캐싱을 구현하려면 어떻게해야합니까?Mar 17, 2025 pm 05:44 PM

이 기사는 카페인 및 구아바 캐시를 사용하여 자바에서 다단계 캐싱을 구현하여 응용 프로그램 성능을 향상시키는 것에 대해 설명합니다. 구성 및 퇴거 정책 관리 Best Pra와 함께 설정, 통합 및 성능 이점을 다룹니다.

캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA (Java Persistence API)를 어떻게 사용하려면 어떻게해야합니까?캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA (Java Persistence API)를 어떻게 사용하려면 어떻게해야합니까?Mar 17, 2025 pm 05:43 PM

이 기사는 캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA를 사용하는 것에 대해 설명합니다. 잠재적 인 함정을 강조하면서 성능을 최적화하기위한 설정, 엔티티 매핑 및 모범 사례를 다룹니다. [159 문자]

Java의 클래스로드 메커니즘은 다른 클래스 로더 및 대표 모델을 포함하여 어떻게 작동합니까?Java의 클래스로드 메커니즘은 다른 클래스 로더 및 대표 모델을 포함하여 어떻게 작동합니까?Mar 17, 2025 pm 05:35 PM

Java의 클래스 로딩에는 부트 스트랩, 확장 및 응용 프로그램 클래스 로더가있는 계층 적 시스템을 사용하여 클래스로드, 링크 및 초기화 클래스가 포함됩니다. 학부모 위임 모델은 핵심 클래스가 먼저로드되어 사용자 정의 클래스 LOA에 영향을 미치도록합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경