Java网络编程学习复习总结(二)-2021-05-31

OSI 和 TCP/IP模型对比

在这里插入图片描述
在这里插入图片描述

TCP协议和UDP协议关系比较

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

在网络通讯中,TCP方式就类似于拨打电话,使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据。而UDP方式就类似于发送短信,使用这种方式进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得。

这两种传输方式都在实际的网络编程中使用,重要的数据一般使用TCP方式进行数据传输,而大量的非核心数据则可以通过UDP方式进行传递,在一些程序中甚至结合使用这两种方式进行数据传递。

由于TCP需要建立专用的虚拟连接以及确认传输是否正确,所以使用TCP方式的速度稍微慢一些,而且传输时产生的数据量要比UDP稍微大一些。

总结
TCP是面向连接的,传输数据安全,稳定,效率相对较低。
UDP是面向无连接的,传输数据不安全,效率较高。

TCP协议

TCP(Transfer Control Protocol)是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通讯协议。
特点:面向连接、点到点的通信、高可靠性、占用系统资源多,效率低。
所谓面向连接,就是当计算机双方通信时必需经过先建立连接,然后传送数据,最后拆除连接三个过程。

TCP在建立连接时又分三步走:

第一步,是请求端(客户端)发送一个包含SYN即同步(Synchronize)标志的TCP报文,SYN同步报文会指明客户端使用的端口以及TCP连接的初始序号。

第二步,服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgement)。

第三步,客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。然后才开始通信的第二步:数据处理。

这就是所说的TCP的三次握手(Three-way Handshake)。

UDP协议

UDP(User Datagram Protocol)一种无连接的传输层通信协议,提供面向事务的简单不可靠信息传送服务。
UDP协议,称为数据报通信方式。在这种方式中,每个数据发送单元被统一封装成数据报包的方式,发送方将数据报包发送到网络中,数据报包在网络中去寻找它的目的地。

特点:非面向连接,传输不可靠,可能丢失
发送不管对方是否准备好,接收方收到也不确认
可以广播发送
非常简单的协议,开销小

Java网络编程常用类

类 InetAddress
此类表示互联网协议 (IP) 地址。

Java中的InetAddress是一个代表IP地址的封装。IP地址可以由字节数组和字符串来分别表示,InetAddress将IP地址以对象的形式进行封装,可以更方便的操作和获取其属性。InetAddress的构造函数不是公开的(public),所以需要通过它提供的静态方法来获取。

IP 地址是 IP 使用的 32 位或 128 位无符号数字,它是一种低级协议,UDP 和 TCP 协议都是在它的基础上构建的。IP 地址的体系结构是由 RFC 790:Assigned Numbers、 RFC 1918:Address Allocation for Private Internets、RFC 2365:Administratively Scoped IP Multicast 和 RFC 2373:IP Version 6 Addressing Architecture 定义的。InetAddress 的实例包含 IP 地址,还可能包含相应的主机名(取决于它是否用主机名构造或者是否已执行反向主机名解析)。

类 InetAddress常用方法
在这里插入图片描述
查看下面代码关于InetAddress创建对象的用法

package com.NetworkCommunication;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class TestIntaddress {
    public static void main(String[] args) throws UnknownHostException {
        //使用getLocalHost方法创建InetAddress对象
        InetAddress addr = InetAddress.getLocalHost();
        System.out.println(addr.getHostAddress());//返回本机IP地址
        System.out.println(addr.getHostName());//返回本机名称

        //根据域名得到InetAddress对象
        addr = InetAddress.getByName("www.baidu.com");
        System.out.println(addr.getHostAddress());//返回www.baidu.com的ip地址:39.156.66.18
        System.out.println(addr.getHostName());//返回www.baidu.com的名称www.baidu.com

        //根据IP得到InetAddress对象
        addr = InetAddress.getByName("39.156.66.18");
        System.out.println(addr.getHostAddress());//返回baidu的ip地址39.156.66.18
        System.out.println(addr.getHostName());
        //输出的是IP而不是域名,原因:如果ip地址不存在或者DNS服务器不允许进行ip地址和域名的映射
        //getHostName()就直接返回这个IP地址

    }
}

类 InetSocketAddress
包含IP和端口信息,常用于Socket通信。此类实现 IP 套接字地址(IP 地址 + 端口号),不依赖任何协议。
构造方法与常用方法
在这里插入图片描述
查看下面关于InetSocketAddress的常用方法

package com.NetworkCommunication;

import java.net.InetSocketAddress;

public class TestInetSocketAddress {
    public static void main(String[] args) {
        InetSocketAddress inetSocketAddress1 = new InetSocketAddress("127.0.0.1",8080);
        InetSocketAddress inetSocketAddress2 = new InetSocketAddress("localhost",8086);
        System.out.println(inetSocketAddress1.getAddress());//获取InetAddress
        System.out.println(inetSocketAddress1.getHostName());//获取hostname
        System.out.println(inetSocketAddress1.getPort());//获取端口号

        System.out.println(inetSocketAddress2.getAddress());
        System.out.println(inetSocketAddress2.getHostName());
        System.out.println(inetSocketAddress2.getPort());
    }
}

URL类
IP地址唯一标识了Internet上的计算机,而URL则标识了这些计算机上的资源。类 URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。

为了方便程序员编程,JDK中提供了URL类,该类的全名是java.net.URL,有了这样一个类,就可以使用它的各种方法来对URL对象进行分割、合并等处理。

在这里插入图片描述
URL的常用构造方法
在这里插入图片描述
URL常用的方法
在这里插入图片描述
查看下面代码:

package com.NetworkCommunication;

import java.net.MalformedURLException;
import java.net.URL;
public class TestURL {
    public static void main(String[] args) throws MalformedURLException {
        URL u = new URL("http://www.google.cn:80/webhp#aa?canhu=33");
        System.out.println("获取与此url关联的协议的默认端口:" + u.getDefaultPort());
        System.out.println("getFile:" + u.getFile()); // 端口号后面的内容
        System.out.println("主机名:" + u.getHost()); // www.google.cn
        System.out.println("路径:" + u.getPath()); // 端口号后,参数前的内容
        // 如果www.google.cn:80则返回80.否则返回-1
        System.out.println("端口:" + u.getPort());
        System.out.println("协议:" + u.getProtocol());
        System.out.println("参数部分:" + u.getQuery());
        System.out.println("锚点:" + u.getRef());

        URL u1 = new URL("http://www.abc.com/aa/");
        URL u2 = new URL(u, "2.html"); // 相对路径构建url对象
        System.out.println(u2.toString()); // http://www.abc.com/aa/2.html
    }
}
//程序的执行结果:
获取与此url关联的协议的默认端口:80
getFile:/webhp
主机名:www.google.cn
路径:/webhp
端口:80
协议:http
参数部分:null
锚点:aa?canhu=33
http://www.google.cn:80/2.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C_Vampirer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值