Java网络编程干货

1.网络编程是什么 了解

在Java语言中,我们可以使用java.net包下的技术轻松开发出常见的网络应用程序,从而把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,

从而使众多的计算机可以方便地互相传递信息、共享硬件、软件、数据信息等资源。

想要实现网络互联的不同计算机上运行的程序间可以进行数据交换,那么就要涉及到网络编程的"三要素",这样就能解决以下的三个问题:

  1. 如何准确地定位网络上一台或多台主机IP地址

  2. 如何定位到主机上某个特定的应用端口号

  3. 找到主机后如何可靠高效地进行数据传输通讯协议

2.网络编程三要素 理解

2.1 IP地址

要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接收数据的计算机和识别发送的计算机,而IP地址就是这个标识号。

也就是设备的标识,简单说就是设备在网络中的地址,是唯一的标识。

目前,IP地址广泛使用的版本是IPv4,它是由4个字节大小的二进制数来表示,例如:0000-1010 0000-0000 0000-0000 0000-0001。

由于二进制形式表示的IP地址非常不便记忆和处理,因此通常会将IP地址写成十进制的形式,每个字节(8位)用一个十进制整数来(0-255)表示,数字间用符号"."分开,如"192.168.0.1"。

因为8位对应的十进制无符号整数为:0-255,所以-4.278.4.1是错误的IPv4地址。

随着计算机网络规模的不断扩大,对IP地址的需求也越来越多,IPv4这种用4个字节表示的IP地址面临枯竭,因此IPv6便应运而生了,IPv6使用16个字节表示IP地址,它所拥有的地址容量达到2128 个(算上全零的),这样就解决了网络地址资源数量不够的问题。16个字节写成8个16位的无符号整数,每个整数用四个十六进制位表示,每个数之间用冒号分开,如:3ffe:3201:1401:1280:c8ff:fe4d:db39:1984。

注意事项:

  1. 本机地址:127.0.0.1,主机名:localhost。

  2. 192.168.0.0--192.168.255.255为私有地址,属于非注册地址,专门为组织机构内部使用。

2.1.1 域名和DNS

2.1.1.1 域名

IP地址毕竟是数字标识,使用时不好记忆和书写,因此在IP地址的基础上又发展出一种符号化的地址方案,来代替数字型的IP地址。

每一个符号化的地址都与特定的IP地址对应。这个与网络上的数字型IP地址相对应的字符型地址,就被称为域名。

目前域名已经成为互联网品牌、网上商标保护必备的要素之一,除了识别功能外,还有引导、宣传等作用。如:www.baidu.com

2.1.1.2 DNS

在Internet上域名与IP地址之间是一对一(或者多对一)的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,

域名解析需要由专门的域名解析服务器来完成,DNS(Domain Name System域名系统)就是进行域名解析的服务器,域名的最终指向是IP。

2.2 端口号

IP地址用来标识一台计算机,但是一台计算机上可能提供多种网络应用程序,如何来区分这些不同的程序呢这就要用到端口。

在计算机中,不同的应用程序是通过端口号区分的。端口号是用两个字节(无符号)表示的,它的取值范围是0~65535,而这些计算机端口可分为3大类:

公认端口:0~1023。被预先定义的服务通信占用(如:HTTP占用端口80,FTP占用端口21,Telnet占用端口23等)

注册端口:1024~49151。分配给用户进程或应用程序。(如:Tomcat占用端口8080,MySQL占用端口3306,Oracle占用端口1521等)。

动态/私有端口:49152~65535。

IP地址好比每个人的地址(门牌号),端口好比是房间号。必须同时指定IP地址和端口号才能够正确的发送数据。接下来通过一个图例来描述IP地址和端口号的作用,如下图所示

2.3 通讯协议

通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则。

就像两个人想要顺利沟通就必须使用同一种语言一样,如果一个人只懂英语而另外一个人只懂中文,这样就会造成没有共同语言而无法沟通。

在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换。

2.3.1 OSI参考模型

世界上第一个网络体系结构由IBM公司提出(1974年,SNA),以后其他公司也相继提出自己的网络体系结构如:Digital公司的DNA,美国国防部的TCP/IP等,

多种网络体系结构并存,其结果是若采用IBM的结构,只能选用IBM的产品,只能与同种结构的网络互联。

为了促进计算机网络的发展,国际标准化组织ISO(International Organization for Standardization)于1977年成立了一个委员会,

在现有网络的基础上,提出了不基于具体机型、操作系统或公司的网络体系结构,

称为开放系统互连参考模型,即OSI/RM (Open System Interconnection Reference Model)。

OSI模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。OSI七层协议模型中约定了不同主机之间每层的数据传输协议。

2.3.2 TCP/IP参考模型

OSI参考模型的初衷是提供全世界范围的计算机网络都要遵循的统一标准,但是由于存在模型和协议自身的缺陷,迟迟没有成熟的产品推出。

TCP/IP协议在实践中不断完善和发展取得成功,作为网络的基础,Internet的语言,可以说没有TCP/IP协议就没有互联网的今天。

TCP/IP,即Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,是Internet最基本的协议、Internet国际互联网络的基础。

TCP/IP协议是一个开放的网络协议簇,它的名字主要取自最重要的网络层IP协议和传输层TCP协议。TCP/IP协议定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。

TCP/IP参考模型采用4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求,这4个层次分别是:网络接口层、互联网层(IP层)、传输层(TCP层)、应用层。

OSI模型与TCP/IP模型的对应关系如图所示:

OSI模型中的应用层、表示层、会话层对应TCP/IP协议的应用层

OSI模型中的传输层对应TCP/IP协议的传输层(TCP/UDP)

OSI模型中的网络层对应TCP/IP协议的网络层(IP)

OSI模型中的数据链路层、物理层对应TCP/IP协议的物理+数据链路层

那么TCP/IP协议和OSI模型有什么区别呢?

OSI网络通信协议模型,是一个参考模型,而TCP/IP协议是事实上的标准。TCP/IP协议参考了OSI 模型,但是并没有严格按照OSI规定的七层标准去划分,

而只划分了四层,这样会更简单点,当划分太多层次时,你很难区分某个协议是属于哪个层次的。

TCP/IP协议和OSI模型也并不冲突,TCP/IP协议中的应用层协议,就对应于OSI中的应用层,表示层,会话层。

TCP/IP中有两个重要的协议,传输层的TCP协议和互连网络层的IP协议,因此就拿这两个协议做代表,来命名整个协议族了,再说TCP/IP协议时,是指整个协议族。

3.网络编程基础类 掌握

3.1 InetAddress类

java.net.InetAddress用来封装计算机的ip地址及DNS(没有端口信息),包括一个主机名和一个URL地址,是java对ip地址的高层展示。

大多数类都用到这个类,包括Socket、ServerSocket、URL、DatagramSocket、DatagramPocket

3.1.1 常用静态方法

InetAddress getByName(String host); --传入主机名或ip地址得到对应的InetAddress对象,其中封装了ip地址和主机名

InetAddress getLocalHost(); --获取本机的InetAddress对象,其中封装ip地址和主机名

3.1.2 常用成员方法

String getHostAddress(); --获取ip地址

String getHostName(); --获取主机名

3.2 URL类

java.net.URL是统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。

互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

URL由4部分组成:协议、存放资源的主机域名、资源文件名和端口号。如果未指定该端口号,则使用协议默认的端口。

例如HTTP协议的默认端口为80。在浏览器中访问网页时,地址栏显示的地址就是URL。

URL标准格式为:<协议>://<域名或IP>:<端口>/<路径>。其中,<协议>://<域名或IP>是必需的,<端口>/<路径>有时可省略。如:https://www.baidu.com

为了方便程序员编程,JDK中提供了URL类,该类的全名是java.net.URL,该类封装了大量复杂的涉及从远程站点获取信息的细节,可以使用它的各种方法来对URL对象进行分割、合并等处理。

创建方式:new URL(String path);

获取协议方法:getProtlcol();

获取域名:getHost();

获取与URL关联协议的默认端口:getDefaultPort();

获取端口:getPort();

获取端口号后,参数前的内容:getPath();

获取端口号后所有的内容:getFile();

获取参数:getQuery();

获取锚点:getRef(); --输出"#"后面的内容

使用此类的InputStream openStream()方法,可打开此URL的一个链接,并返回一个用于从该连接读入的InputStream,实现简单的网络读取。

4.TCP和UDP协议 理解

4.1 Socket套接字概述

我们开发的网络应用程序位于应用层,TCP和UDP属于传输层协议,在应用层如何使用传输层的服务呢在应用层和传输层之间,则是使用套接Socket来进行分离。

套接字就像是传输层为应用层开的一个小口,应用程序通过这个小口向远程发送数据,或者接收远程发来的数据。

而这个小口以内,也就是数据进入这个口之后,或者数据从这个口出来之前,是不知道也不需要知道的,也不会关心它如何传输,这属于网络其它层次工作。

Socket实际是传输层供给应用层的编程接口。Socket就是应用层与传输层之间的桥梁。

使用Socket编程可以开发客户机和服务器应用程序,可以在本地网络上进行通信,也可通过Internet在全球范围内通信。

应用层-(Socket)-传输层-网络层-数据链路层-物理层

4.2 TCP协议和UDP协议

TCP协议和UDP协议是传输层的两种协议。Socket是传输层供给应用层的编程接口,所以Socket编程就分为TCP编程和UDP编程两类

4.2.1 TCP协议

使用TCP协议,须先建立TCP连接,形成传输数据通道,似于拨打电话

传输前,采用"三次握手"方式,属于点对点通信,是面向连接的,效率低。

仅支持单播传输,每条TCP传输连接只能有两个端点(客户端、服务端)。

两个端点的数据传输,采用的是"字节流"来传输,属于可靠的数据传输。

传输完毕,需释放已建立的连接,开销大,速度慢,适用于文件传输、邮件等。

4.2.2 UDP协议

采用数据报(数据、源、目的)的方式来传输,无需建立连接,类似于发短信。

每个数据报的大小限制在64K内,超出64k可以分为多个数据报来发送。

发送不管对方是否准备好,接收方即使收到也不确认,因此属于不可靠的。

可以广播发送,也就是属于一对一、一对多和多对一连接的通信协议。

发送数据结束时无需释放资源,开销小,速度快,适用于视频会议、直播等。

4.2.3 TCP协议和UDP协议的区别

是否连接:TCP面向连接,UDP面向非连接

传递可靠性:TCP可靠,UDP不可靠

连接对象个数:TCP(一对一),UCP(一对一,一对多,多对一)

传输方式:TCP面向字节流,UDP面向报文

传输速度:TCP慢,UDP快

应用场景:TCP适用于可靠传输(文件传输,邮件等);UDP适用于实时应用(视频会议,直播等)

4.3 三次握手和四次回收

客户端与服务端在使用TCP传输协议时要先建立一个"通道",在传输完毕之后又要关闭这"通道",前者可以被形象地成为"三次握手",而后者则可以被称为"四次挥手"。

通道的建立之三次握手:

  1. 在建立通道时,客户端首先要向服务端发送一个SYN同步信号。

  2. 服务端在接收到这个信号之后会向客户端发出SYN同步信号和ACK确认信号。

  3. 当服务端的ACK和SYN到达客户端后,客户端与服务端之间的这个"通道"就被建立。

通道的关闭之四次挥手:

  1. 在数据传输完毕之后,客户端会向服务端发出一个FIN终止信号。

  2. 服务端在收到这个信号之后会向客户端发出一个ACK确认信号。

  3. 如果服务端此后也没有数据发给客户端时服务端会向客户端发送一个FIN终止信号。

  4. 客户端在收到这个信号之后会回复一个确认信号,在服务端接收到这个信号之后,服务端与客户端的通道也就关闭了。

5.基于TCP协议的编程 掌握

5.1 TCP协议编程概述

套接字是一种进程间的数据交换机制,利用套接字(Socket)开发网络应用程序早已被广泛的采用,以至于成为事实上的标准。

在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client),而在第一次通讯中等待连接的程序被称作服务端(Server)。

一旦通讯建立,则客户端和服务器端完全一样,没有本质的区别。

套接字与主机地址和端口号相关联,主机地址就是客户端或服务器程序所在的主机的IP地址,端口地址是指客户端或服务器程序使用的主机的通信端口。

在客户端和服务器中,分别创建独立的Socket,并通过Socket的属性,将两个Socket进行连接,这样客户端和服务器通过套接字所建立连接并使用IO流进行通信。

5.2 Socket的概述

Socket类实现客户端套接字(Client客户端),套接字是两台机器之间通信的端点

Socket构造方法:public Socket(InetAddress ia,int p); 创建套接字并连接到指定ip地址的指定端口

Socket成员方法:

方法名 描述

public InetAddress getInetAddress() 返回此套接字连接到的远程 IP 地址。

public InputStream getInputStream() 返回此套接字的输入流(接收网络消息)。

public OutputStream getOutputStream() 返回此套接字的输出流(发送网络消息)。

public void shutdownInput() 禁用此套接字的输入流

public void shutdownOutput() 禁用此套接字的输出流。

public synchronized void close() 关闭此套接字(默认会关闭IO流)。

5.3 ServerSocket的概述

ServerSocket类用于实现服务器套接字(Server服务端)。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

ServerSocket类的构造方法:

方法名 描述

public ServerSocket(int port) 创建服务器套接字并绑定端口号

ServerSocket类的常用方法:

方法名 描述

public Socket accept() 侦听要连接到此套接字并接受它。

public InetAddress getInetAddress() 返回此服务器套接字的本地地址。

public void close() 关闭此套接字。

5.4 TCP单项通讯的实现

java语言的基于套接字编程分为服务端编程和客户端编程

5.4.1 服务器端实现步骤

创建ServerSocket对象,并绑定端口

通过accept方法监听客户端的请求

建立连接后,通过输入输出流进行读写操作

调用close方法关闭资源

5.4.2 客户端实现步骤

创建Socket对象,指定服务区ip和端口

建立连接后,通过输入输出流进行读写操作

通过输出输入流获取服务器返回信息

调用close方法关闭资源

注意:先启动服务器端,再启动客户端

5.5 TCP双向通讯的实现

5.5.1 服务器端实现步骤

  1. 创建ServerSocket对象,绑定监听端口;

  2. 通过accept()方法监听客户端请求;

  3. 使用输入流接收客户端发送的图片,然后通过输出流保存图片

  4. 通过输出流返回客户端图片收到。

  5. 调用close()方法关闭资源

5.5.2 客户端实现步骤

  1. 创建socket对象,指明需要连接的服务器地址和端口号;

  2. 建立连接后,通过输出流向服务器端发送图片;

  3. 通过输入流获取服务器的响应信息;

  4. 调用close()方法关闭资源

6.基于UDP协议的编程 掌握

6.1 UDP协议编程概述

在UDP通信协议下,两台计算机之间进行数据交互,并不需要先建立连接,发送端直接往指定的IP和端口号上发送数据即可,

但是它并不能保证数据一定能让对方收到,也不能确定什么时候可以送达

java.net.DatagramSocket类和java.net.DatagramPacket类是使用UDP编程中需要使用的两个类,并且发送端和接收端都需要使用这个俩类,并且发送端与接收端是两个独立的运行程序。

  1. DatagramSocket:负责接收和发送数据,创建接收端时需要指定端口号。

  2. DatagramPacket:负责把数据打包,创建发送端时需指定接收端的IP地址和端口。

6.2 DataGramSocket概述

DatagramSocket类作为基于UDP协议的Socket,使用DatagramSocket类可以用于接收和发送数据,同时创建接收端时还需指定端口号。

DatagramSocket类的构造方法:

方法名 描述

public DatagramSocket() 创建发送端的数据报套接字

public DatagramSocket(int port) 创建接收端的数据报套接字,并指定端口号

DatagramSocket类的常用方法:

方法名 描述

public void send(DatagramPacket p) 发送数据报。

public void receive(DatagramPacket p) 接收数据报。

public void close() 关闭数据报套接字。

6.3 DatagramPacket概述

DatagramPacket类负责把发送的数据打包(打包的数据为byte类型的数组),并且创建发送端时需指定接收端的IP地址和端口。

DatagramPacket类的构造方法:

方法名 描述

public DatagramPacket(byte buf[], int offset, int length) 创建接收端的数据报。

public DatagramPacket(byte buf[], int offset, int length, InetAddress address, int port) 创建发送端的数据报,并指定接收端的IP地址和端口号。

DatagramPacket类的常用方法:

方法名 描述

public synchronized byte[] getData() 返回数据报中存储的数据

public synchronized int getLength() 获得发送或接收数据报中的长度

6.4 基于UDP编程的实现

6.4.1 接收端实现步骤

创建DatagramSocket对象(服务端),并指定端口号

创建DatagramPacket对象(数据报)

调用receive方法,用于接收数据报

调用close方法关闭资源

6.4.2 发送端实现步骤

创建DatagramSocket对象(发送端)

创建DatagramPacket对象(数据报),并指定接收端ip地址和接口

调用send方法,发送数据报

调用close方法关闭资源

相关推荐
金融数据出海1 分钟前
Spring Boot对接马来西亚股票数据源API
java·spring boot·后端·金融
卡戎-caryon23 分钟前
【Linux网络与网络编程】08.传输层协议 UDP
linux·网络·udp
老哥不老24 分钟前
使用Apache POI实现Java操作Office文件:从Excel、Word到PPT模板写入
java·apache·excel
keli_Jun33 分钟前
Java常见面试问题
java·开发语言·spring boot
风象南1 小时前
SpringBoot中3种应用事件处理机制
java·spring boot·后端
我有医保我先冲1 小时前
C++笔记
java·c++·笔记
唐青枫2 小时前
php8 throw 表达式使用教程
php
我命由我123453 小时前
35.Java线程池(线程池概述、线程池的架构、线程池的种类与创建、线程池的底层原理、线程池的工作流程、线程池的拒绝策略、自定义线程池)
java·服务器·开发语言·jvm·后端·架构·java-ee
CopyLower4 小时前
分布式ID生成方案的深度解析与Java实现
java·开发语言·分布式