그림과 텍스트로 자세히 설명된 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 프로토콜을 사용하여 로컬 네트워크에서 라우터의 물리적 주소를 찾아 패킷을 라우터로 전달합니다. 라우터는 데이터 패킷을 다음과 같이 처리합니다.
데이터 패킷의 수명 주기가 만료된 경우 데이터 패킷은 폐기됩니다.
라우팅 테이블을 검색하여 라우팅 테이블에 있는 호스트를 우선순위로 찾으면 해당 호스트로 데이터 패킷이 전송됩니다.
호스트 매칭에 실패하면 계속해서 라우팅 테이블을 검색해 서브넷의 라우팅 테이블을 매칭하고, 매칭되는 라우팅 테이블이 있으면 해당 라우터로 패킷을 전달한다.
동일한 서브넷의 라우터 일치에 실패하면 계속해서 라우팅 테이블을 검색하여 동일한 네트워크의 라우터를 찾으면 데이터 패킷이 전달됩니다. 라우터에.
위 매칭에 실패할 경우 기본 경로를 검색하여 기본 경로가 존재하면 기본 경로에 따라 데이터 패킷을 전송하고, 그렇지 않으면 데이터 패킷을 폐기합니다.
순서도는 다음과 같습니다.
도메인 이름
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中,有3种套接字类:java.net.Socket
、java.net.ServerSocket
和 java.net.DatagramSocket
。其中Socket
和 ServerSocket
建立在TCP协议上,DatagramSocket
类建立在UDP协议基础上。我们创建EchoServer和EchoClient两个类,我们通过ServerSocket
和Socket
来编写。
创建EchoServer类
在服务端通过一直监听端口,来接收客户程序的连接请求。在服务器程序中,先创建一个ServerSocket
对象,在构造方法中指定监听的端口:
ServerSocket server = new ServerSocket(8080);
ServerSocket
构造器负责在操作系统中将当前进程注册为服务进程。服务器程序调用ServerSocket
的accept()
方法来监听端口,等待客户端的连接,如果接收到连接,则accept()
方法返回一个Socket
对象,这个Socket
对象与客户端的Socket
对象形成了一条通信线路:
Socket socket = server.accept();
Socket提供了getInputStream()方法和getOutputStream()方法,分别返回输入流InputStream对象和输出流OutputStream对象。程序只需向输出流写入东西,就能向对方发送数据;只需从输入流读取数据,就能接收到数据。如下图: 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()方法端口连接。
具体运行如下图,一个是服务端一个是客户端的控制台:
总结
简单介绍了一下网络的理论知识和TCP/IP协议。并使用Java实现了一个网络通信程序。
以上就是Java网络编程由浅入深一图文详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

휴대 전화에서 XML을 PDF로 직접 변환하는 것은 쉽지 않지만 클라우드 서비스를 통해 달성 할 수 있습니다. 가벼운 모바일 앱을 사용하여 XML 파일을 업로드하고 생성 된 PDF를 수신하고 클라우드 API로 변환하는 것이 좋습니다. Cloud API는 Serverless Computing Services를 사용하고 올바른 플랫폼을 선택하는 것이 중요합니다. XML 구문 분석 및 PDF 생성을 처리 할 때 복잡성, 오류 처리, 보안 및 최적화 전략을 고려해야합니다. 전체 프로세스에는 프론트 엔드 앱과 백엔드 API가 함께 작동해야하며 다양한 기술에 대한 이해가 필요합니다.

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4

Java는 초보자와 숙련된 개발자 모두가 배울 수 있는 인기 있는 프로그래밍 언어입니다. 이 튜토리얼은 기본 개념부터 시작하여 고급 주제를 통해 진행됩니다. Java Development Kit를 설치한 후 간단한 "Hello, World!" 프로그램을 작성하여 프로그래밍을 연습할 수 있습니다. 코드를 이해한 후 명령 프롬프트를 사용하여 프로그램을 컴파일하고 실행하면 "Hello, World!"가 콘솔에 출력됩니다. Java를 배우면 프로그래밍 여정이 시작되고, 숙달이 깊어짐에 따라 더 복잡한 애플리케이션을 만들 수 있습니다.
