• java基础巩固11


    网络编程基础

    (1)如果一台计算机只有一个网卡,并且接入了网络,那么,它有一个本机地址127.0.0.1,还有一个IP地址,例如101.202.99.12,可以通过这个IP地址接入网络。
    如果一台计算机有两块网卡,那么除了本机地址,它可以有两个IP地址,可以分别接入两个网络。通常连接两个网络的设备是路由器或者交换机,它至少有两个IP地址,分别接入不同的网络,让网络之间连接起来。
    (2)每台计算机都需要正确配置ip地址和子网掩码,根绝这两个就可以计算网络号,如果两台计算机计算出的网络号相同,说明两台计算机在同一个网络上,可以直接通信。如果不同,那么两台计算机不在同一个网络,不能直接通信,他们之间必须通过路由器或者交换机这样的网络设备间接通信,我们把这种设备称为网关。
    (3)网关的作用就是链接多个网络,负责把来自一个网络的数据包发送到另一个网络,这个过程就叫作路由。
    (4)因为直接记忆IP地址非常困难,所以我们通常使用域名访问某个特定的服务。域名解析服务器DNS负责把域名翻译成对应的IP,客户端再根据IP地址访问服务器。有一个特殊的本机域名localhost,它对应的IP地址总是本机地址127.0.0.1。
    (5)网络模型:
    在这里插入图片描述

    常用协议

    (1)ip协议是一个分组交换协议,它不保证可靠传输。而TCP协议是传输控制协议,他是面向链接的协议,支持可靠传输和双向通信。TCP协议是建立在IP协议之上的,简单地说,IP协议只负责发送数据包,不保证顺序和正确性,而TCP协议负责控制数据包传输,它在传输数据之前需要先建立连接,建立连接后才能传输数据,传输完成后还需要断开连接。TCP协议之所以能够保证数据的可靠传输,是通过接收确认、超时重传这些机制实现的,而且,tcp协议云讯双向通信,即通信双方可以同时发送和接收数据。
    (2)TCP协议也是应用最广泛的协议,许多高级协议都是建立在TCP协议之上的,例如HTTP/SMTP等。
    (3)UDP协议是以中国魂数据报文协议,他是无连接协议,不保证可靠传输。因为UDP协议在通信钱不需要建立连接,因此它的传输效率比TCP高,而且UDP协议比TCP协议要简单的多。选择UDP协议时,传输的数据通常是能容忍丢失的,例如一些语音视频的应用会选择UDP协议。

    TCP编程

    (1)Socket是一个抽象概念,一个应用程序通过一个Scoket来建立一个远程连接,而Socket内部通过TCP/IP协议把数据传输到网络层。Socket、TCP和部分IP的功能都是由操作系统提供的,不同的编程语言只是提供了对操作系统调用的简单的封装。例如,Java提供的结果Socket相关的类就封装了操作系统提供的接口。
    (2)为什么需要Scoket进行网络通信,因为仅仅通过IP地址进行通信是不够的,同一台计算机同一时间会运行多个网络应用程序,例如浏览器、QQ、邮件客户端等。当操作系统接收到一个数据包的时候,只有IP地址,它无法判断发给哪个应用程序,所以操作系统抽象出Socket接口,每个应用程序需要对应到不同的Socket,数据包才能根据Socket正确地发送到对应的应用程序。
    (3)使用Socket进行网络编程时,本质上就是两个进程之间的网络通信,其中一个进程必须充当服务器端,他会主动监听某个指定的端口,另一个进程必须充当客户端,它会必须主动连接服务器的IP地址和指定端口,如果连接成功,服务端和客户端就成功建立了一个TCP连接,双方后续就可以随时发送和接收数据。因此,当Socket连接成功地在服务器端和客户端之间建立连接后:
    对服务器端来说,它的Socket是指定的IP地址和指定的端口号;
    对客户端来说,它的Socket是指它所在计算机的IP地址和一个由操作系统分配的随机端口号。
    (4)当Socket连接创建成功后,无论是服务器端还是客户端,我么那都是用Socket进行网络通信。因为TCP是一种基于流的协议,因此,Java标准库使用InputStream和OutPutStream来封装Socket的数据流,这样我们使用Socket的流,和普通的IO流相似。
    (5)如果不调用flush()方法,我们很可能会发现,客户单和服务器都收不到数据,这并不是Java标准库的设计问题,而是我们以流的形式写入数据的时候,并不是一写入就立刻发送到网络,而是先写入内存缓冲区,知道缓冲区满了以后,才会一次性发送到网络,这样设计的目的是为了提高传输效率。如果缓冲区的数据很少,而我们又想要把这些数据发送到网络,就必须调用flush()强制把缓冲区数据发送出去。

    HTTP编程

    (1)HTTP可翻译为超文本传输协议,它是基于TCP协议上的一种请求-响应协议。
    (2)HTTP请求的格式是固定的,它由HTTP Header和HTTP Body两部分构成,第一行总是请求方法、路径、HTTP版本。后续的每一行都是固定的Header:value格式,我们称为HTTP Header,服务器依靠某些特定的Header来是被客户端请求,例如:
    Host:表示请求的域名,因为一台服务器上可能有多个网站,因此有必要依靠Host来识别是发送给哪个网站的;
    User-Agent:表示客户端自身标识信息,不同的浏览器有不同的标识,服务器依靠User-Agent判断客户端类型时IE还是Chrome,是Firefox还是Python爬虫;
    Accept:表示客户端能处理的HTTP响应格式,*/*表示任意格式,text/*表示任意文本,image/png表示PNG格式的图片。
    Accept-Langauge:表示客户单接收的语言,多种语言按优先级排序,服务器依靠该字段给用户返回特定的语言的网页版本。
    (3)如果是GET请求,那么该HTTP请求只有HTTP Header,没有HTTP Body。如果是POST请求,那么该HTTP请求带有Body,以一个空行分隔。
    (4)此外,GET请求的参数必须附加在URL上,并以URLEncode方式编码,例如:http://www.example.com/?a=1&b=K%26R,参数分别是a=1和b=K&R。因为URL的长度限制,GET请求的参数不能太多,而POST请求的参数就没有长度限制,因为POST请求的参数必须放到Body中。并且,POST请求的参数不一定是URL编码,可以按任意格式编码,只需要在Content-Type中正确设置即可。

  • 相关阅读:
    解决Custom EmptyStringException: The string is empty
    【附源码】计算机毕业设计SSM三味书屋图书借阅与售卖系统
    获取该虚拟机的所有权失败,主机上的某个应用程序正在使用该虚拟机
    AVL树的模拟实现(c++)
    【ARM Coresight 系列文章 9.1 -- ITM 仪器化跟踪宏单元详细介绍】
    ubuntu20.04安装无线网卡驱动
    工业物联网蓝牙安全及基于标识算法的分布式鉴权技术研究
    LeetCode二叉树系列——145.二叉树的后序遍历
    ROS2——DDS(十三)
    基于springboot实现疫苗接种管理系统项目【项目源码】
  • 原文地址:https://blog.csdn.net/weixin_49131718/article/details/126510764