一、概述
网络编程 也叫 网络通信,Socket(套接字)编程,就是用来实现 网络互联的 不同计算机上 运行的程序间 数据交互(传输)的
二、三大要素
1、IP地址
-
概述
全称IPAddress,是设备在网络中的 唯一标识
-
分类
1、IpV4:采用4字节,十进制形式
2、IpV6:采用16字节,十六进制形式
-
相关操作
1、win + R 打开DOC窗口,输入 cmd,回车
2、ipconfig / all:windows 系统 查看本机 ip
3、ifconfig:mac,linux系统 查看本机 ip
4、测试网络连接:ping 域名 或者 ip地址 -t,-t 就是一直发,不写发4个包,ctrl + c 结束
5、127.0.0.1 本地回环(回路)地址,代表本机;255.255.255.255 广播地址,类似群发
2、端口
-
概述
是程序在设备上的 唯一标识,是传输数据的通道
-
范围
0~65535
(细节:0~1023是 知名端口号,已被系统占用,或用作保留端口,设定时尽量规避这个范围,1024~65535是 动态端口号)
3、协议
-
概述
通信规则,即通信双方 应该遵循 什么样的规则 进行传输
-
TCP协议
全称Transmission Control Protocol,即 传输控制协议
建立连接:3次握手
1、客户端向服务端 发送请求,等待服务端确认。
2、服务端 收到请求后,回复客户端以确认连接请求。
3、客户端 收到确认后,再次发送请求确认服务端,服务端收到正确请求后,则连接建立成功
断开连接:4次挥手
1、当主机A(客户端 or 服务端)完成数据传输后, 提出停止TCP 连接的请求
2、主机B收到请求后对其作出响应,确认这一方向上的TCP连接将关闭
3、主机B端再提出反方向的连接关闭请求
4、主机A对主机B 的请求进行确认,双方向的关闭结束
特点
1、面向连接(三次握手)
2、安全(可靠)协议
3、传输效率 相对较低
4、采用 字节流 的方式发送数据,理论上无大小限制
5、区分 客户端 和 服务器端
-
UDP协议
1、面向无连接
2、不安全(不可靠)协议
3、传输效率 相对较高
4、采用(数据报包)发送数据,每个包大小不超过64KB
5、不区分 客户端 和 服务器端,是发送端 和 接收端
三、Socket套接字
- 概念:进程之间通信的工具
用法:
1、导入模块:import socket
2、创建socket对象:socket . socket ( AddressFamily,Type)
AddressFamily(地址族):internet进程间通信,用AF_INET
Type(套接字类型):SOCK_STREAM流式套接字,用于TCP协议
# 1、导入模块
import socket
# 2、创建服务器端 Socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
四、TCP开发流程
1、服务器端
bind(address):绑定地址( host,port )到socket套接字
listen(backlog):开始TCP监听,最大值可设置为128
accept( ):被动接受客户端连接,返回执行Socket,客户端IP地址
import socket # 导包
# 1、创建服务器端 Socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、绑定 IP 和 端口号
server_socket.bind(('127.0.0.1', 6666)) # 细节:元组包裹
# 3、设置监听,一般设置为 5,最小为 1,上限为 128
server_socket.listen(5)
print('服务器端,开启监听...')
# 4、开始监听,等待客户端连接。有连接就返回:负责和客户端交互的 Socket,客户端的IP信息
accept_socket, client_info = server_socket.accept()
# 5、向客户端发送数据,注意:二进制形式
accept_socket.send(b'Welcome to study socket!')
# 6、接收客户端的回执信息
recv_data = accept_socket.recv(1024) # 接受数量设置为1024
# 细节:把接收到的数据(二进制形式)转成字符串
recv_data_str = recv_data.decode(encoding='utf-8')
print(f'服务器端收到:{recv_data_str}')
# 7、释放资源
accept_socket.close() # 细节!不要忘记释放资源
2、客户端
发送信息:端名.send() # 注意传递的是二进制形式的信息
接收信息:端名.resv(字符数)
连接服务器端:端名.connect(('服务器端IP',端口号)) # 用元组包裹
import socket
# 1、创建客户端 Socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、连接服务器端,指定:服务器端IP,端口号(用元组包裹)
client_socket.connect(('127.0.0.1', 6666))
# 3、接收服务器端发送的数据
recv_data = client_socket.recv(1024)
# 细节:把接收到的数据(二进制形式)转成字符串
recv_data_str = recv_data.decode(encoding='utf-8')
print(f'客户端收到:{recv_data_str}')
# 4、向服务器端发送回执信息
client_socket.send('消息收到!'.encode(encoding='utf-8'))
# 5、释放资源
client_socket.close()
3、类型转换
编码:encode(字符串 转 二进制形式)
解码:decode(二进制形式 转 字符串)