- Java网络(精简版)
一、网络编程基础
-
什么是计算机网络?
计算机网络是指两台或更多的计算机组成的网络,在同一个网络里,任意两台计算机都可以直接通信,因为所有的计算机都遵从同一种网络协议。
-
网络编程主要问题:
- 如何准确的定位网络上一台或多台主机
- 找到主机后如何可靠高效的进行数据传输
-
编写网络通讯程序有两种做法
- TCP:基于传输控制协议
- UDP:基于用户数据报协议
-
网络协议简介:
-
IP
:Internet Protocol,分组交换协议。只负责发送数据包,不保证可靠传输。 -
TCP
: Transport Control Protocol,传输控制协议。建立在 IP协议之上, 负责控制数据包传输,但是在传输数据之前需要先建立连接。
-
UDP
: User Datagram Protocol,数据报文协议。UDP协议在通信之前不需要建立连接,属于无连接协议;传输效率高、使用简单,但数据传输不可靠,常用于对数据丢失容忍度较高的场景,如视频、音频会议。
-
-
端口说明:
UDP端口和 TCP端口虽然都使用 0 ~ 65535,但他们是两套独立的端口,一个应用程序通过TCP协议占用了 1234端口,不影响另一个应用程序通过 UDP协议占用 1234端口。
-
TCP与 UDP的对比:
\ TCP UDP 可靠性 可靠 不可靠 连接性 面向连接 无连接 报文 面向字节流 面向报文 传输效率 低 高 双工性 全双工 一对一、一对多、多对多 流量控制 滑动窗口 无 拥塞程度 慢开始、拥塞避免、快恢复 无 传输速率 慢 快 应用场景 效率要求低、准确性要求高 效率要求高、准确性要求低 名词解释:
- 面向字节流:应用程序和TCP的交互是一次一个数据块(大小不等),TCP把这些数据块看成是一连串无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就会把它分割成多块传送。
- 面向报文:应用层交给 UDP多长的报文,UDP就发送多长的报文,即一次发送一个报文。因此应用程序必须选择大小合适的报文。报文太长,则IP层需要分片,降低效率。
- 全双工:指在发送数据的同时也能够接收数据,两者同步进行。
- 半双工:指一个时间段内只有一个动作发生。
-
TCP/IP协议说明:
因为 TCP/IP协议使用广泛,所以现在常用 TCP/IP来泛指互联网协议,而不仅仅是单指这两个协议。
-
IP地址说明:
-
在互联网中,IP地址用于标识网络接口(Network Interface)。
-
每台接入互联网的计算机至少拥有一个 IP地址,具体决定于网卡数量。
-
本机 IP地址为:
127.0.0.1
,也就是 hosts映射文件中的localhost
。 -
公网 IP可以被直接访问,内网 IP只能在内网访问,如 192.168.0.8。
-
IPv4
:采用 32位地址,分为 4组 8位数据8位 : 8位 : 8位 : 8位
范围:0 ~ 255,地址总数有 232(大约 42亿)个,目前已耗尽。
-
IPv6
:采用 128位地址,分为 8组 16位数据16位 : 省略6部分 : 16位
范围:0000~FFFF,地址总数 2138(大约 340万亿亿亿亿),现阶段用不完。
-
-
每台计算机的网卡都有 3个关键配置:
-
IP地址
-
子网掩码
-
网关 IP地址
-
-
网关说明:
- 是什么?路由器或者交换机。
- 作用:负责连接多个网络,把一个网络的数据包发送到另一个网络(路由过去)。
-
计算机网络号:
-
简介:
拥有相同计算机网络号的设备处于同一个网络之中,可以直接通信;否则只能借助网关等设备进行间接通信。
-
获得方式:根据每台计算机的 IP地址、子关掩码进行计算。
IP = 101.202.99.2 Mask = 255.255.255.0 Network = IP & Mask = 101.202.99.0
-
-
域名说明
- 直接记忆 IP地址非常困难。
- 域名是 IP地址的抽象表达形式。
- DNS:Domain Name Server,域名解析服务器负责把域名解析成客户端可以访问的 IP地址。
nslookup
指令:Name Server Lookup,解析域名。
❯ nslookup www.thinkstu.com Server: 8.8.8.8 Address: 8.8.8.8#53 Non-authoritative answer: Name: www.thinkstu.com Address: 39.107.99.33
-
OSI网络模型 与 TCP/IP网络模型
OSI(七层)
:Open System Interconnect,ISO组织定义的计算机互联标准模型,目的是简化网络各层的 *** 作、提供标准接口便于实现和维护。但 OSI只是理论模型,未被实际运用。TCP/IP(五层)
:广泛运用,成为事实上的标准。
-
浏览器访问网页原理:
- 浏览器希望访问某个网站
- 两者通过 80端口或者 443端口建立 TCP连接
- 浏览器向服务器发送 HTTP请求
- 服务器收到请求,返回 HTTP响应(包含网页内容)
- 浏览器解析内容(渲染 HTML页面)
-
Java中的网络功能类:
- **应用层:**URL、URLConnection
- **传输层:**Socket、ServerSocket、DatagramPacket、DatagramSocket、MulticastSocket
- **IP层 :**InetAddress
-
Java网络编程的主要方式:
- 基于 URL网络连接。
- 基于套接字 Socket通信。
- 基于 UDP数据报通信。
二、TCP编程
-
Socket简介
Socket = IP地址 + 端口
。- IP对应主机,端口对应主机上的监听程序。
- 应用程序通过 Socket建立连接,具体网络功能由 *** 作系统底层实现,Java只提供封装。
- 这里说的是 *** 作系统层面的 Socket,不是 Java封装的 Socket类。
- 端口号由 *** 作系统分配,范围是 0 ~ 65535 (216-1)。
- 小于 1024的端口属于特权端口,需要管理员权限。
- 大于 1024的端口可以任意使用。
- 每个 Socket都持有输入流、输出流。
-
TCP编程简介:
- 服务器端:主动监听指定端口;Socket = 自身IP地址 + 指定端口号。
- 客户端:主动连接服务器;Socket = 自身IP地址 + *** 作系统随机分配的端口号。
-
Java类介绍:
ServerSocket
:用于服务端程序Socket
:用于服务端与客户端程序
-
Java Socket类
构造方法:
- Socket(String host, int port) 使用指定端口和主机,向服务器发起连接,若成功创建socket对象,否则抛出异常。
- Socket(InetAddress address, int port) 使用InetAddress对象所表示的端口和IP地址,向服务器发起连接,若成功创建socket对象,否则抛出异常。
常用方法:
public InputStream getInputStream ( ) public OutputStream getOutputStream ( ) public void close ( ) public InetAddress getInetAddress ( ) public int getPort ( ) public int getLocalPort ( ) public void setSoTimeout ( int timeout )
-
Java ServerSocket类
构造方法:
- public ServerSocket ( int port ):在指定的端口创建一个倾听套接字,默认可接收50个客户端连接。
- public ServerSocket ( int port, int backlog )支持指定数目的连接
- public ServerSocket ( int port, int backlog, InetAddress bindAddr ):bindAddr用于绑定服务器端程序所使用的IP地址。
常用方法:
- public Socket accept ( ) :监听客户端连接请求,等待客户端的连接。accept ( ) 方法调用后,服务器程序将处于堵塞状态,直到监听到客户端连接,返回一个新创建的Socket对象。接下来利用这个返回的Socket对象与客户端进行数据收发。
- public void **setSoTimeout **( int timeout ) :设置accept ( )方法等待连接的时间为 timeout毫秒。若时间已到,还没有客户机连接,则抛出InterruptedIOException异常,accept ( )方法不再阻塞,该 Socket可继续使用。若timeout值为0,则表示accept ( )永远等待。注:该方法必须在倾听Socket创建后,在accept ( )之前调用才有效。
- public void close ( ):关闭Socket。
-
服务器端编程
SocketServer
:监听 6666端口。ss.accept ( )
:堵塞,无限期监听客户连接;每当有新的客户端连接进来后,就创建新的 Socket实例。Thread
:并发处理。
public class Server { public static void main(String[] args) throws IOException { ServerSocket ss = new ServerSocket(6666); while(true){ Socket socket = ss.accept ( ); Thread t = new Handler(socket); t.start ( ); }}} class Handler extends Thread { Socket socket; public Handler(Socket sock) {this.socket = socket;} @Override public void run ( ) {} }
-
客户端编程
- 建立连接,等待消息。
- 连接失败会直接抛出异常,可以在异常中写入 *** 作。
public class Client { public static void main(String[] args) throws IOException { Socket sock = new Socket("localhost", 6666); try (InputStream input = sock.getInputStream ( )) { handle(input); } sock.close ( ); } private void handle(InputStream input) throws IOException {} }
-
Socket输入流、输出流
- 客户和服务器通过 OutputStream和 InputStream对象进行通信
- 输出流
flush ( )
方法能够让数据立马得到刷新。
三、UDP编程
-
Java类简介:
- 网络连接:
DatagramSocket
- 数据存储:
DatagramPacket
- 网络连接:
-
服务器端:
DatagramSocket
:监听 6666端口。DatagramPacket
:buffer存储数据;getOffset ( )、getLength ( )指定起始位置和长度。- 服务器可以通过 DatagramPacket对象获取客户端地址。
packet.getSocketAddress ( ) //获取客户端地址
-
客户端:与服务器端大体一致细微不同。
- 创建 DatagramSocket实例时不需要指定端口, *** 作系统自动分配空闲端口。
setSoTimeout(1000)
:超时时间为 1秒。当客户端接发送数据包后,等待响应时长为 1秒,节省客户端资源(默认永远等待,浪费资源)。connect ( )
:UDP协议属于无连接协议,这里并非真的连接,而是 Java内置安全检查机制的要求。其会在客户端 DatagramSocket实例中保存服务器端的 IP和端口号,确保当前实例只能往指定的地址和端口发送数据包,不能往其他地址和端口发送。- 如果客户端希望向两个不同的服务器发送 UDP包,必须创建两个
DatagramSocket
实例。 - 如果客户端认为通信结束,可以调用
disconnect ( )
断开连接。
四、Email详解 1️⃣. 发送 Email
-
简介:发送邮件,需要导 pom包。
-
三个名词:
MUA
:Mail User Agent,用户邮件代理(主要编程此)MTA
:Mail Transfer Agent,转发邮件代理(现成)MDA
:Mail Delivery Agent,接受邮件代理(现成)
-
端口说明:
MUA 到 MTA发送邮件的协议是 SMTP协议(Simple Mail Transport Protocol),使用标准端口 25,也可以使用加密端口 465或 587。
-
SMTP协议简介:
建立在TCP之上,任何程序发送邮件都必须遵守 SMTP协议。
Java提供
JavaMail
API接口,实现了 SMTP协议。 -
具体实现略。
-
简介:
从 MDA服务器上抓取邮件到本地,所使到用的协议可以是 POP3或者 IMAP。
-
POP3协议:
Post Office Protocol version 3,建立在TCP连接之上。
标准端口 110,加密端口 995。
-
IMAP协议:
Internet Mail Access Protocol,建立在TCP连接之上。
标准端口 143,加密端口 993。
-
POP3协议 与 IMAP协议:
- 使用方法类似。
- IMAP协议:本地所有 *** 作都会自动同步到服务器上,允许用户在邮件服务器的收件箱中创建文件夹。
- POP3协议:正好相反。
-
具体实现略。
五、其他 Java类
-
URL
提供方法openStream ( ),读取 URL对象所指定的资源。
-
URLConnection
提供的信息比 URL类多,除了可以获取资源数据外,还可以提供资源长度、资源发送时间、资源最新更新时间、资源编码、资源的标题等许多信息。当与 URL建立连接时,首先要在一个URL对象上通过方法 openConnection ( )生成对应的URLConnection对象。
-
URL
与URLConnection
区分- URL:方法openStream ( ) 只能从网络上读取的数据。
- URLConnection:可以在应用程序和URL资源之间进行交互,既可以从URL中读取数据,也可以向URL中发送数据
-
InetAddress
(构造方法不公开,对象通过静态方法获取)
- InetAddress[ ] getAllByName ( String host ):在给定主机名的情况下,根据系统上配置的名称服务返回其IP地址所组成的数组。
- InetAddress getByAddress ( byte[ ] addr ):在给定原始IP地址的情况下,返回 InetAddress 对象。
- InetAddress getByAddress ( String host, byte[ ] addr ):根据提供的主机名和IP地址创建InetAddress。
- InetAddress getByName ( String host ):在给定主机名的情况下确定主机的IP地址。
- InetAddress getLocalHost ( ):返回本地主机地址。
附录
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)