计算机网络及TCP网络应用程序开发
一、计算机网络概述
1、网络的概念
网络就是将具有独立功能的多台计算机通过通信线路和通信设备连接起来,在网络中管理软件及网络通信协议下,实现资源共享和信息传输的虚拟平台。
2、为什么要学习网络
学习网络的目的就是能够编写基于网络通信的软件或程序,通常来说就是网络编程。
3、IP地址概述
IP地址是分配给网络设备上网使用的数字标签,它能够标识网络中唯一的一台设备,好比现实中每个人都有一个手机号。
4、IP地址的表现形式
IP地址一共有4位,第1位,1~223,第234位,0~255
注意事项:
- IP地址分为两类:IPv4和IPv6
- IPv4是目前使用的IP地址
- IPv6是未来使用的IP地址
5、IP地址的作用
通过IP地址找到网络中唯一一台设备,然后可以根据这个设备进行数据通信。
6、Ubuntu中网络查询命令
命令名 | 说明 |
---|---|
ifconfig/ipconfig | 查看网卡信息 |
ping | 检查网络是否正常 |
ipconfig命令
- 192.168.33.36是在网络中的地址,windows电脑使用ipconfig(mac/linux使用ifconfig)可以查看网卡对应网络中的IP地址
- 127.0.0.1表示本机地址,提示:如果和自己电脑通信就可以使用改地址。
ping命令
- ping www.baidu.com 检查是否能上公网
- ping当前局域网的ip地址检查是否在同一局域网内
- ping 127.0.0.1检查本机网卡是否正常
ping命令其结果是连续的操作,如果想停止,我们可以使用快捷键Ctrl + C终止
7、端口和端口号的概念
1.计算机通信原理
每运行一个程序都会有一个端口,想要给对应的程序发送数据,找到对应的端口即可。端口就是传输数据的通道,是数据传输必经之路。
而且每一个端口都会有一个对应的端口号(操作系统为了统一管理这么多端口,就对端口进行了编号,这就是端口号,端口号其实就是一个数字,好比我们现实生活中的门牌号),想要找到端口通过端口号即可,如:飞秋软件的默认端口号就是2345。
最终通信结果:通过ip地址找到对应的设备,通过端口号找到对应的端口,然后通过端口把数据给应用程序。
2.扩展:端口号扩展
- 知名端口号
知名端口号是指众所周知的端口号,范围从0到1023,这些端口号一般固定分配给一些服务,比如21端口分配给FTP(文件传输协议)服务,22端口分配给SSH(安全外壳协议,主要用于远程连接与文件传输),25端口分配给SMTP(简单邮件传输协议)服务,80端口分配给HTTP服务,443端口分配给HTTPS服务等等。
- 动态端口号
一般程序员开发应用程序使用端口号称为动态端口号。
动态端口号的范围是从1024到65535,如果程序员开发的程序没有设置端口号,操作系统会在动态端口号这个范围内随机生成一个给开发的应用程序使用。
注意:当运行一个程序默认会有一个端口号,当程序退出时,所占用的这个端口号就会被释放。
8、socket套接字
socket套接字工具,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。
这就好比现实中的电话,当知道了对方的电话号码后需要使用电话才能进行通讯,程序之间想要进行网络通信需要基于这个socket套接字,socket套接字就是程序间进行网络通讯的工具。
socket使用场景
不夸张的说,只要跟网络相关的应用程序或者软件都使用到了socket。
9、TCP概述
1.概述
TCP的英文全拼(Transmission Control Protocol)简称传输控制协议,它是一种面向连接的、可靠的、基于字节流的传输层通信协议。
TCP通信步骤:①创建连接 ②传输数据 ③关闭连接
TCP通信模型相当于生活中的’打电话‘,在通信开始之前,一定要先建立好连接,才能发送数据,通信结束要关闭连接。
2.TCP的特点
①面向连接
通信双方必须先建立好连接才能进行数据的传输,并且双方都会为此连接分配必要资源用来记录连接的状态和信息。当数据传输完成后,双方必须断开此连接,以释放系统资源。
②可靠传输
1.TCP采用发送应答机制
通过TCP这种方式发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传送成功
2.超时重传
发送端发送一个报文之后就会启动定时器,如果指定时间内没有得到应答就会重新发送这个报文段
3.流量控制和阻塞管理
流量控制用来避免发送端发送过快而使得接收方来不及接收
3.扩展:UDP协议(不可靠传输)
UDP不可靠协议(只能保证速度,但是没办法保证数据传输质量,发送5M => 接收3.75M)
有些情况下,我们对数据的质量没有要求,可以考虑使用UDP,如视频通话。
二、Python3编码转换
1、为什么要学习编码转换
在计算机网络中,数据都是以二进制的形式进行传输的。所以在网络传输数据的时候,数据需要先编码转化为二进制(bytes)数据类型
I Love Python => 字符串 => 转换为二进制数据 => 网络中传输
2、数据的编码转换
数据转换方法说明:
函数名 | 说明 |
---|---|
encode | 编码 将字符串转化为字节码 |
decode | 解码 将字节码转化为字符串 |
提示:encoed()和decode()函数可以接受参数,encoding是指在编码过程中使用的编码方案。
字符串编码:
str.encode(encoding='utf-8')
二级制解码:
bytes.decode(encoding='utf-8')
三、TCP客户端及服务器端开发实践
1、TCP网络应用程序开发分类
① TCP客户端应用程序开发
② TCP服务器端应用程序开发
主动发起建立连接请求的是客户端程序,等待接受连接请求的是服务端程序。
2、TCP客户端程序开发流程及应用实践(五步走)
1.开发流程介绍
- 1.创建客户端套接字对象
- 2.和服务端套接字建立连接
- 3.发送数据(说话)
- 4.接受数据(接听)
- 5.关闭客户端套接字(挂电话)
2.socket类的介绍
# 导入socket模块
import socket
# 创建客户端socket对象使用socket类
socket.socket(AddressFamily, Type)
客户端socket类的参数和方法说明:
参数名 | 说明 |
---|---|
AddressFamily | IP地址类型,分为IPv4和IPv6 |
Type | 传输协议类型 |
开发客户端需要使用的函数:
方法名 | 说明 |
---|---|
connect | 和服务端套接字建立连接 |
send | 发送数据 |
recv | 接受数据 |
close | 关闭连接 |
3、TCP客户端程序开发实践
import socket
if __name__ == '__main__':
# 1、创建客户端套接字对象
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、和服务器端套接字建立连接(参数必须是一个元祖)
tcp_client_socket.connect(("192.168.31.181", 8080))
# 3、发送数据
tcp_client_socket.send('hell, itheima'.encode(encoding='utf-8'))
# 4、接收数据
recv_data = tcp_client_socket.recv(1024).decode('utf-8')
print(recv_data)
# 5、关闭客户端套接字
tcp_client_socket.close()
3、TCP服务器端开发流程及应用实践(七步走)
1.开发流程介绍
- 1.创建服务器端套接字对象
- 2.绑定IP地址和端口号
- 3.设置监听
- 4.等待接受客户端的连接请求
- 5.接受数据
- 6.发送数据
- 7.关闭套接字
2.socket类的介绍
① 导入socket模块
import socket
② 创建客户端socket对象使用socket类
socket.socket(AddressFamily, Type)
服务器端socket类的参数和方法说明:
参数名 | 说明 |
---|---|
AddressFamily | IP地址类型, 分为TPv4和IPv6 |
Type | 传输协议类型 |
开发服务器端需要使用的函数:
# 导入socket模块
import socket
# 创建服务器端socket对象使用socket类
socket.socket(AddressFamily, Type)
开发服务器端需要使用的函数:
方法名 | 说明 |
---|---|
bind | 绑定IP地址和端口号 |
listen | 设置监听 |
accept | 等待接受客户端的连接请求 |
send | 发送数据 |
recv | 接受数据 |
3.TCP服务器端程序开发实践
import socket
if __name__ == '__main__':
# 1、创建服务器端套接字对象
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、绑定IP地址与端口号
tcp_server_socket.bind(("", 8888))
# 3、开启监听
tcp_server_socket.listen(128)
# 4、等待接收客户端连接请求
conn_socket, ip_port = tcp_server_socket.accept()
print('客户端IP+端口:', ip_port)
# 5、接收数据
recv_data = conn_socket.recv(1024)
print('接收到的数据:', recv_data.decode())
# 6、发送数据
conn_socket.send("客户端的数据已经收到了".encode())
# 7、关闭套接字
conn_socket.close()
tcp_server_socket.close()
nn_socket, ip_port = tcp_server_socket.accept()
print(‘客户端IP+端口:’, ip_port)
# 5、接收数据
recv_data = conn_socket.recv(1024)
print(‘接收到的数据:’, recv_data.decode())
# 6、发送数据
conn_socket.send(“客户端的数据已经收到了”.encode())
# 7、关闭套接字
conn_socket.close()
tcp_server_socket.close()