Java网络编程(精简版)

Java网络编程(精简版),第1张

  • Java网络(精简版)

一、网络编程基础
  1. 什么是计算机网络?

    ​ 计算机网络是指两台或更多的计算机组成的网络,在同一个网络里,任意两台计算机都可以直接通信,因为所有的计算机都遵从同一种网络协议。

  2. 网络编程主要问题:

    • 如何准确的定位网络上一台或多台主机
    • 找到主机后如何可靠高效的进行数据传输
  3. 编写网络通讯程序有两种做法

    • TCP:基于传输控制协议
    • UDP:基于用户数据报协议
  4. 网络协议简介:

    • IP:Internet Protocol,分组交换协议。只负责发送数据包,不保证可靠传输。

    • TCP

      ​ Transport Control Protocol,传输控制协议。建立在 IP协议之上, 负责控制数据包传输,但是在传输数据之前需要先建立连接。

    • UDP

      ​ User Datagram Protocol,数据报文协议。UDP协议在通信之前不需要建立连接,属于无连接协议;传输效率高、使用简单,但数据传输不可靠,常用于对数据丢失容忍度较高的场景,如视频、音频会议。

  5. 端口说明:

    ​ UDP端口和 TCP端口虽然都使用 0 ~ 65535,但他们是两套独立的端口,一个应用程序通过TCP协议占用了 1234端口,不影响另一个应用程序通过 UDP协议占用 1234端口。

  6. TCP与 UDP的对比:

    \TCPUDP
    可靠性可靠不可靠
    连接性面向连接无连接
    报文面向字节流面向报文
    传输效率
    双工性全双工一对一、一对多、多对多
    流量控制滑动窗口
    拥塞程度慢开始、拥塞避免、快恢复
    传输速率
    应用场景效率要求低、准确性要求高效率要求高、准确性要求低

    名词解释:

    • 面向字节流:应用程序和TCP的交互是一次一个数据块(大小不等),TCP把这些数据块看成是一连串无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就会把它分割成多块传送。
    • 面向报文:应用层交给 UDP多长的报文,UDP就发送多长的报文,即一次发送一个报文。因此应用程序必须选择大小合适的报文。报文太长,则IP层需要分片,降低效率。
    • 全双工:指在发送数据的同时也能够接收数据,两者同步进行。
    • 半双工:指一个时间段内只有一个动作发生。
  7. TCP/IP协议说明:

    ​ 因为 TCP/IP协议使用广泛,所以现在常用 TCP/IP来泛指互联网协议,而不仅仅是单指这两个协议。

  8. 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万亿亿亿亿),现阶段用不完。

  9. 每台计算机的网卡都有 3个关键配置:

    • IP地址

    • 子网掩码

    • 网关 IP地址

  10. 网关说明:

  • 是什么?路由器或者交换机。
  • 作用:负责连接多个网络,把一个网络的数据包发送到另一个网络(路由过去)。
  1. 计算机网络号:

    • 简介:

      ​ 拥有相同计算机网络号的设备处于同一个网络之中,可以直接通信;否则只能借助网关等设备进行间接通信。

    • 获得方式:根据每台计算机的 IP地址、子关掩码进行计算。

    IP = 101.202.99.2
    Mask = 255.255.255.0
    Network = IP & Mask = 101.202.99.0
    
  2. 域名说明

    • 直接记忆 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
    
  3. OSI网络模型 与 TCP/IP网络模型

    • OSI(七层):Open System Interconnect,ISO组织定义的计算机互联标准模型,目的是简化网络各层的 *** 作、提供标准接口便于实现和维护。但 OSI只是理论模型,未被实际运用。
    • TCP/IP(五层):广泛运用,成为事实上的标准。

  4. 浏览器访问网页原理:

    • 浏览器希望访问某个网站
    • 两者通过 80端口或者 443端口建立 TCP连接
    • 浏览器向服务器发送 HTTP请求
    • 服务器收到请求,返回 HTTP响应(包含网页内容)
    • 浏览器解析内容(渲染 HTML页面)
  5. Java中的网络功能类:

    • **应用层:**URL、URLConnection
    • **传输层:**Socket、ServerSocket、DatagramPacket、DatagramSocket、MulticastSocket
    • **IP层 :**InetAddress
  6. Java网络编程的主要方式:

    • 基于 URL网络连接。
    • 基于套接字 Socket通信。
    • 基于 UDP数据报通信。

二、TCP编程
  1. Socket简介

    • Socket = IP地址 + 端口
    • IP对应主机,端口对应主机上的监听程序。
    • 应用程序通过 Socket建立连接,具体网络功能由 *** 作系统底层实现,Java只提供封装。
    • 这里说的是 *** 作系统层面的 Socket,不是 Java封装的 Socket类。
    • 端口号由 *** 作系统分配,范围是 0 ~ 65535 (216-1)。
    • 小于 1024的端口属于特权端口,需要管理员权限。
    • 大于 1024的端口可以任意使用。
    • 每个 Socket都持有输入流、输出流。

  2. TCP编程简介:

    • 服务器端:主动监听指定端口;Socket = 自身IP地址 + 指定端口号。
    • 客户端:主动连接服务器;Socket = 自身IP地址 + *** 作系统随机分配的端口号。
  3. Java类介绍:

    • ServerSocket:用于服务端程序
    • Socket:用于服务端与客户端程序
  4. 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 )
    
  5. 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。
  6. 服务器端编程

    • 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 ( ) {}
    }
    
  7. 客户端编程

    • 建立连接,等待消息。
    • 连接失败会直接抛出异常,可以在异常中写入 *** 作。
    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 {}
    }
    
  8. Socket输入流、输出流

    • 客户和服务器通过 OutputStream和 InputStream对象进行通信
    • 输出流flush ( )方法能够让数据立马得到刷新。


三、UDP编程
  1. Java类简介:

    • 网络连接:DatagramSocket
    • 数据存储:DatagramPacket
  2. 服务器端

    • DatagramSocket:监听 6666端口。
    • DatagramPacket:buffer存储数据;getOffset ( )、getLength ( )指定起始位置和长度。
    • 服务器可以通过 DatagramPacket对象获取客户端地址。
    packet.getSocketAddress ( )  //获取客户端地址
    

  3. 客户端:与服务器端大体一致细微不同。

    • 创建 DatagramSocket实例时不需要指定端口, *** 作系统自动分配空闲端口。
    • setSoTimeout(1000):超时时间为 1秒。当客户端接发送数据包后,等待响应时长为 1秒,节省客户端资源(默认永远等待,浪费资源)。
    • connect ( ):UDP协议属于无连接协议,这里并非真的连接,而是 Java内置安全检查机制的要求。其会在客户端 DatagramSocket实例中保存服务器端的 IP和端口号,确保当前实例只能往指定的地址和端口发送数据包,不能往其他地址和端口发送。
    • 如果客户端希望向两个不同的服务器发送 UDP包,必须创建两个DatagramSocket实例。
    • 如果客户端认为通信结束,可以调用disconnect ( )断开连接。


四、Email详解 1️⃣. 发送 Email
  1. 简介:发送邮件,需要导 pom包。

  2. 三个名词:

    • MUA:Mail User Agent,用户邮件代理(主要编程此)
    • MTA:Mail Transfer Agent,转发邮件代理(现成)
    • MDA:Mail Delivery Agent,接受邮件代理(现成)
  3. 端口说明:

    ​ MUA 到 MTA发送邮件的协议是 SMTP协议(Simple Mail Transport Protocol),使用标准端口 25,也可以使用加密端口 465或 587。

  4. SMTP协议简介:

    ​ 建立在TCP之上,任何程序发送邮件都必须遵守 SMTP协议。

    ​ Java提供 JavaMail API接口,实现了 SMTP协议。

  5. 具体实现略。

2️⃣. 接收 Email
  1. 简介:

    ​ 从 MDA服务器上抓取邮件到本地,所使到用的协议可以是 POP3或者 IMAP。

  2. POP3协议:

    Post Office Protocol version 3,建立在TCP连接之上。

    标准端口 110,加密端口 995。

  3. IMAP协议:

    Internet Mail Access Protocol,建立在TCP连接之上。

    标准端口 143,加密端口 993。

  4. POP3协议 与 IMAP协议:

    • 使用方法类似。
    • IMAP协议:本地所有 *** 作都会自动同步到服务器上,允许用户在邮件服务器的收件箱中创建文件夹。
    • POP3协议:正好相反。
  5. 具体实现略。


五、其他 Java类
  1. URL

    ​ 提供方法openStream ( ),读取 URL对象所指定的资源。

  2. URLConnection

    ​ 提供的信息比 URL类多,除了可以获取资源数据外,还可以提供资源长度、资源发送时间、资源最新更新时间、资源编码、资源的标题等许多信息。当与 URL建立连接时,首先要在一个URL对象上通过方法 openConnection ( )生成对应的URLConnection对象。

  3. URLURLConnection区分

    • URL:方法openStream ( ) 只能从网络上读取的数据。
    • URLConnection:可以在应用程序和URL资源之间进行交互,既可以从URL中读取数据,也可以向URL中发送数据
  4. 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 ( ):返回本地主机地址。

附录

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/877582.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存