计算机网络及TCP网络应用程序开发
学习目标
1、了解计算机网络相关信息
2、掌握Python3编码转换的方法
3、掌握TCP客户端及服务器端开发流程及应用实践
4、socket套接字之send和recv原理剖析
5、掌握网络综合案例:多任务版TCP服务端程序应用实践
一、计算机网络概述
1、网络的概念
网络就是将具有独立功能的多台计算机通过通信线路和通信设备连接起来,在网络管理软件及网络通信协议下,实现资源共享和信息传递的虚拟平台。
2、为什么要学习网络
学习网络的目的就是能够编写基于网络通信的软件或程序,通常来说就是网络编程。

3、IP地址概述
思考一个问题,当我们在计算机中使用微信和你心中那个“她”聊天时,信息是如何精准的传递到她的计算机中的呢?

编辑切换为居中
答:是通过计算机的IP地址来实现的,IP地址是分配给网络设备上网使用的数字标签,它能够标识网络中唯一的一台设备,好比现实中每个人都有一个手机号。

4、IP地址的表现形式

IP地址一共有4位,第1位,1~223,第234位,0~255 IPv4地址是32位二进制数,通常用点分十进制表示,如192.168.0.1。I Pv6地址是128位二进制数,通常用冒号分隔的16进制表示,如2001:0db8:85a3:0000:0000:8a2e:0370:7334。
注意事项:
① IP地址分为两类 : IPv4和IPv6
② IPv4是目前使用的IP地址
③ IPv6是未来使用的IP地址
5、IP地址的作用
IP地址的作用是用于标识网络中的设备。通过IP地址,网络中的设备可以相互通信,实现数据的传输和交换。在互联网中,IP地址是唯一的,每个设备都有一个独特的IP地址。

6、端口和端口号的概念
☆ 计算机通信原理
问题:如果在一台电脑上使用飞秋给另外一台电脑上的飞秋发送数据并且另外的这台电脑还运行着多个软件,它是如何区分这多个软件把数据给飞秋的呢?

答:其实,每运行一个程序都会有一个端口,想要给对应的程序发送数据,找到对应的端口即可。端口就是传输数据的通道,好比教室的门,是数据传输必经之路。

而且每一个端口都会有一个对应的端口号(操作系统为了统一管理这么多端口,就对端口进行了编号,这就是端口号,端口号其实就是一个数字,好比我们现实生活中的门牌号),想要找到端口通过端口号即可,如:飞秋软件的默认端口号就是2345。接收方的飞秋应用程序会监听这个端口号,从而接收到发送方发送的数据。其他运行的软件则会使用不同的端口号进行通信,从而实现区分。

最终通信结果:通过ip地址找到对应的设备,通过端口号找到对应的端口,然后通过端口把数据给应用程序。

☆ 扩展:端口号扩展
① 知名端口号
知名端口号是指众所周知的端口号,范围从0到1023,这些端口号一般固定分配给一些服务,比如21端口分配给FTP(文件传输协议)服务,22端口分配给SSH(安全外壳协议,主要用于远程连接与文件传输),25端口分配给SMTP(简单邮件传输协议)服务,80端口分配给HTTP服务,443端口分配给HTTPS服务等等。
② 动态端口号
一般程序员开发应用程序使用端口号称为动态端口号。 动态端口号的范围是从1024到65535,当一个应用程序需要与另一个应用程序进行通信时,它会随机选择一个动态端口号作为源端口号,并将目标端口号设置为对方应用程序所使用的端口号。这样可以避免端口号冲突。当通信结束后,该动态端口号就会被释放,供其他应用程序使用。
注意:当运行一个程序默认会有一个端口号,当程序退出时,所占用的这个端口号就会被释放。
设置端口建议8000以后
7、TCP概述
☆ 为什么需要TCP协议
之前我们学习了IP地址和端口号,通过IP地址能够找到对应的设备,然后再通过端口号找到对应的端口,再通过端口把数据传输给应用程序,这里要注意,数据不能随便发送,在发送之前还要选择网络传输方式(传输协议),保证程序之间按照指定的传输规则进行数据的通信。

☆ TCP概述
TCP的英文全拼(Transmission Control Protocol)简称传输控制协议,它是一种面向连接的、可靠的、基于字节流的传输层通信协议。

TCP通信步骤:① 创建连接 ② 传输数据 ③ 关闭连接
TCP通信模型相当于生活中的’打电话‘,在通信开始之前,一定要先建立好连接,才能发送数据,通信结束要关闭连接。
☆ TCP的特点
① 面向连接
TCP协议是一种面向连接的协议,它需要在数据传输之前建立连接,数据传输完成后再关闭连接。这种面向连接的机制可以确保数据传输的顺序和完整性,并且可以避免网络拥塞和数据冲突等问题。

② 可靠传输
TCP协议提供了可靠的数据传输服务,可以确保数据的正确性和完整性。它使用确认、重传和流量控制等机制来保证数据传输的可靠性,从而避免数据丢失或损坏。
☆ TCP采用发送应答机制
通过TCP这种方式发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传送成功
☆ 超时重传
发送端发送一个报文之后就会启动定时器,如果指定时间内没有得到应答就会重新发送这个报文段
☆ 错误校验
TCP用一个校验和函数来校验数据是否有错误,在发送和接收时都要计算校验和
☆ 流量控制和阻塞管理
TCP协议可以根据网络状况和接收方的处理能力来控制数据传输的速度,从而避免网络拥塞和数据丢失等问题。它使用滑动窗口机制来实现流量控制,可以根据网络状况动态调整窗口大小。 TCP协议可以根据网络状况和拥塞程度来调整数据传输的速度,从而避免网络拥塞和数据丢失等问题。它使用拥塞窗口机制来实现拥塞控制,可以根据网络状况动态调整窗口大小。
扩展:UDP协议(不可靠传输协议)
TCP可靠协议(数据可以100%传输)
日常通信、数据传输一定要保证可靠性,使用TCP。
UDP不可靠协议(只能保证速度,但是没办法保证数据传输质量,发送5M => 接收3.75M)
有些情况下,我们对数据的质量没有要求,可以考虑使用UDP,如视频通话。
8、socket套接字
☆ 目前存在的问题
到目前为止我们学习了IP地址和端口号,使用这些我们就可以在茫茫的网络海洋中进行畅游了么? 答案是否定的!

☆ socket套接字
那我们需要什么工具呢?答:socket套接字工具,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,Socket是一组用于网络通信的API(应用程序接口),一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。
就好比现实中的电话,当知道了对方的电话号码后需要使用电话才能进行通讯,程序之间想要进行网络通信需要基于这个socket套接字,socket套接字就是程序间进行网络通讯的工具。

☆ socket使用场景
不夸张的说,只要跟网络相关的应用程序或者软件都使用到了socket。

二、Python3编码转换
1、为什么要学习编码转换
在计算机网络中,数据都是以二进制的形式进行传输的。所以在网络传输数据的时候,数据需要先编码转化为二进制(bytes)数据类型 I Love Python => 字符串 => 转换为二进制数据 => 网络中传输
2、数据的编码转换

数据转换方法说明:

提示:encoed()和decode()函数可以接受参数,encoding是指在编解码过程中使用的编码方案。 字符串编码:
二进制解码:
三、TCP客户端及服务器端开发实践
1、TCP网络应用程序开发分类
① TCP客户端应用程序开发 ② TCP服务器端应用程序开发 客户端程序是指运行在用户设备上的程序,服务端程序是指运行在服务器设备上的程序,专门为客户端提供数据服务。那如何记忆呢?
主动发起建立连接请求的是客户端程序,等待接受连接请求的是服务端程序。
2、TCP客户端程序开发流程及应用实践(五步走)
☆ 开发流程介绍

TCP客户端程序开发流程及应用实践通常可以分为五步走,具体如下:
1、创建Socket对象:客户端程序需要使用Socket API创建一个Socket对象,以便与服务器进行连接和通信。创建Socket对象的代码通常如下:
其中,socket.AF_INET表示使用IPv4协议进行通信,socket.SOCK_STREAM表示使用TCP协议进行通信。
2、连接服务器:客户端程序需要使用Socket API调用connect()函数连接到服务器,以便进行数据的传输和通信。连接服务器的代码通常如下:
其中,server_address表示服务器的地址和端口号。
3、发送请求:客户端程序需要向服务器发送请求,以便获取服务器的响应数据。请求的格式通常由应用程序自己定义,可以使用XML、JSON等格式进行数据的传输和解析。发送请求的代码通常如下:
其中,request_data表示发送的请求数据,使用encode()函数将字符串转换为字节流进行发送。
4、接收响应:客户端程序需要等待服务器的响应,并使用recv()函数接收服务器返回的数据。响应数据的格式通常由应用程序自己定义,可以使用XML、JSON等格式进行数据的传输和解析。接收响应的代码通常如下:
其中,1024表示一次最多接收的字节数,使用decode()函数将接收到的字节流转换为字符串进行处理。
5、关闭连接:客户端程序在完成数据传输后,需要使用Socket API关闭连接,并释放相关的资源。关闭连接的代码通常如下:
以上是TCP客户端程序开发流程及应用实践的五个步骤,通过这些步骤可以实现客户端与服务器之间的数据传输和通信。
☆ socket类的介绍
① 导入socket模块import socket
② 创建客户端socket对象使用socket类 socket.socket(AddressFamily, Type)
客户端socket类的参数和方法说明:

开发客户端需要使用的函数:

☆ TCP客户端程序开发实践
使用网络调试查看,效果如下图所示:

3、TCP服务器端开发流程及应用实践(七步走)
☆ 服务器端

☆ 开发流程介绍

TCP服务器端开发流程及应用实践一般分为七个步骤,具体如下:
1.创建Socket对象:服务器程序需要使用Socket API创建一个Socket对象,以便监听客户端的连接请求。创建Socket对象的代码通常如下:
其中,socket.AF_INET表示使用IPv4协议进行通信,socket.SOCK_STREAM表示使用TCP协议进行通信。
2.绑定地址和端口号:服务器程序需要使用Socket API调用bind()函数将Socket对象绑定到一个特定的IP地址和端口号上,以便客户端可以连接到服务器。绑定地址和端口号的代码通常如下:
其中,server_address表示服务器的地址和端口号。
3.监听连接请求:服务器程序需要使用Socket API调用listen()函数开始监听客户端的连接请求,以便客户端可以连接到服务器进行通信。监听连接请求的代码通常如下:
其中,5表示最大连接数。
4.接受连接:服务器程序需要使用Socket API调用accept()函数接受客户端的连接请求,并返回一个新的Socket对象,以便服务器与客户端进行数据的传输和通信。接受连接的代码通常如下:
其中,client_socket表示与客户端进行通信的Socket对象,client_address表示客户端的地址和端口号。
5.接收请求:服务器程序需要使用Socket API调用recv()函数接收客户端发送的请求数据,并进行处理。请求数据的格式通常由应用程序自己定义,可以使用XML、JSON等格式进行数据的传输和解析。接收请求的代码通常如下:
其中,1024表示一次最多接收的字节数,使用decode()函数将接收到的字节流转换为字符串进行处理。
6.发送响应:服务器程序需要向客户端发送响应数据,以便客户端可以获取服务器的处理结果。响应数据的格式通常由应用程序自己定义,可以使用XML、JSON等格式进行数据的传输和解析。发送响应的代码通常如下:
其中,response_data表示发送的响应数据,使用encode()函数将字符串转换为字节流进行发送。
7.关闭连接:服务器程序在完成数据传输后,需要使用Socket API关闭连接,并释放相关的资源。关闭连接的代码通常如下:
以上是TCP服务器端程序开发流程及应用实践的七个步骤,通过这些步骤可以实现服务器与客户端之间的数据传输和通信。
☆ socket类的介绍
客户端socket类的参数和方法说明:

开发客户端需要使用的函数:
客户端socket类的参数和方法说明:

开发服务器端需要使用的函数:

☆ TCP服务器端程序开发实践
这段代码是一个简单的TCP服务器程序,主要实现了接收服务器端的数据,并返回一个确认消息:
首先,导入Python标准库中的 socket 模块,用于实现TCP套接字的编程。
然后,在if name == 'main':语句块中,创建了一个TCP服务器端套接字对象 tcp_server_socket,并使用bind()方法将其绑定到本地IP地址和端口号8888上,使用listen()方法设置最大连接数为128,即最多可以同时处理128个客户端的连接请求。
接着,使用accept()方法阻塞等待客户端的连接请求,当客户端连接成功后,该方法会返回一个新的客户端套接字对象 conn_socket 和客户端IP地址和端口号 ip_port。
然后,使用recv()方法接收客户端的数据,该方法的参数是接收数据的最大长度,返回值是一个字节流。使用decode()方法将字节流解码为字符串后打印出来。 接下来,使用send()方法向客户端发送一个确认消息,使用字符编码转换将字符串转换为字节流再发送。
最后,使用close()方法分别关闭服务器端套接字 tcp_server_socket 和客户端套接字对象 conn_socket,释放资源。
4、TCP服务器端开发面向对象版本
下面再通过一个实例来实现一一个基于TCP协议的简单的Web服务器。
首先,该代码导入了Python的socket模块,用于实现TCP套接字的编程。
然后,定义了一个 WebServer 类,该类包含 __init __() 方法用于对象初始化,start() 方法用于启动WebServer监听客户端连接,以及handle_client_request() 方法用于接受和处理客户端的请求。
在 init() 方法中,该服务器首先创建了一个TCP套接字对象 tcp_server_socket,并使用 bind() 方法将其绑定到本地IP地址及端口号8090上,然后使用 listen() 方法进行监听客户端的连接。
在 handle_client_request() 方法中,服务器接收客户端的请求消息,然后发送响应消息。
在 start() 方法中,服务器不断循环等待客户端的连接,接收连接后调用 handle_client_request() 方法进行请求处理。
最后,在程序执行入口中,实例化 WebServer 类生成对象,并调用 start() 方法启动WebServer。
这段代码的作用是在本地启动一个WebServer服务器端,并监听8080端口上的客户端连接。当有客户端连接到服务器后,服务器将接收客户端的请求消息并返回响应消息。
5、扩展:TCP服务器端开发之多客户端
这段代码实现了一个简单的TCP服务器,可以收发文本消息。
首先,该代码导入Python的socket模块,用于实现TCP套接字的编程。 然后,创建一个TCP套接字对象 tcp_server_socket,并使用 bind() 方法将其绑定到本地IP地址及端口号8090上,使用 listen() 方法设置最大连接数为128,即最多可以同时处理128个客户端的连接请求。
接着,在一个无限循环中等待客户端连接,在每次客户端连接成功之后,使用 accept() 方法接受连接请求,返回一个新的客户端套接字对象 new_socket 和客户端IP地址和端口号 ip_port。
接下来,通过一个while循环不断地接收客户端发送过来的消息,使用 recv() 方法接收消息,使用 decode() 方法将接收到的字节流转换为字符串进行处理,并使用 print() 方法打印消息内容。
然后,通过 input() 函数让服务器输入响应消息,将响应消息使用 encode() 方法转换为字节流后,使用 send() 方法发送给客户端。 当客户端断开连接时,会抛出 ConnectionResetError 异常,这时我们使用 break 语句跳出循环,等待下一个客户端连接。
最后,当出现异常时,通过 try... except... 语句来捕获异常并退出服务器监听状态,并使用 close() 方法关闭服务器套接字。 总之,这段代码使用了Python的 socket 模块实现了TCP服务器的监听功能,能够接收来自客户端的文本消息,并向客户端发送响应消息。
6、TCP网络应用程序开发注意点
1.当TCP客户端程序想要和TCP服务端程序进行通信的时候必须要先建立连接。
2.TCP客户端程序一般不需要绑定端口号,因为客户端是主动发起建立连接的。
3.否则客户端找不到这个TCP服务端程序。TCP服务端程序必须绑定端口号。
4.listen后的套接字是被动套接字,只负责接收新的客户端的连接请求,不能收发消息。
5.当TCP客户端程序和TCP服务端程序连接成功后,TCP服务器端程序会产生一个新的套接字,收发客户端消息使用该套接字。
6.关闭accept返回的套接字意味着和这个客户端已经通信完毕。
7.当客户端的套接字调用close后,服务器端的recv会解阻塞,返回的数据长度为0。服务端可以通过返回数据的长度来判断客户端是否已经下线,反之,服务端关闭套接字,客户端的recv也会解阻塞,返回的数据长度也为0。
端口复用:
这段代码与前一段代码类似,是一个简单的TCP服务器程序。与前一段代码不同的是,在创建服务器端套接字对象之后,设置了端口复用。详细解释一下:
首先,导入Python标准库中的 socket 模块,用于实现TCP套接字的编程。
然后,在if name == 'main':语句块中,创建了一个TCP服务器端套接字对象 tcp_server_socket,并使用bind()方法将其绑定到本地IP地址和端口号8888上,使用listen()方法设置最大连接数为128,即最多可以同时处理128个客户端的连接请求。
接着,使用setsockopt()方法设置了端口复用选项。端口复用是指一个端口可以被多个应用程序占用,这样可以避免端口资源的浪费。在这里,使用SOL_SOCKET和SO_REUSEADDR选项来设置端口复用。
接下来,使用accept()方法阻塞等待客户端的连接请求,当客户端连接成功后,该方法会返回一个新的客户端套接字对象 conn_socket 和客户端IP地址和端口号 ip_port。
然后,使用recv()方法接收客户端的数据,该方法的参数是接收数据的最大长度,返回值是一个字节流。使用decode()方法将字节流解码为字符串后打印出来。
接下来,使用send()方法向客户端发送一个确认消息,使用字符编码转换将字符串转换为字节流再发送。
最后,使用close()方法分别关闭服务器端套接字 tcp_server_socket 和客户端套接字对象 conn_socket,释放资源。 总之,这段代码与前一段代码类似,是一个简单的TCP服务器程序,它除了设置了端口复用之外,并且能够接收客户端的数据,并返回一个确认消息。