PYTHON NOTES · 09
理解网络通信要素,并使用 TCP、UDP Socket 编写客户端与服务端。
- Socket
- TCP/UDP
本文目录
Python Socket 网络编程
理解网络通信要素,并使用 TCP、UDP Socket 编写客户端与服务端。
1.网络通信三要素
1.1七层协议
应用层 表现层 会话层 传输层 网络层 数据链路 物理层
1.2 IP
识别网络设备的唯一地址 IPV4/IPV6
1.3 端口
每运行一个程序都会有一个端口,想要给对应的程序发送数据,找到对应的端口即可
1.4 协议
1.4.1 TCP协议
面向连接的、可靠的、基于字节流的传输层通信协议
三次握手:A:发送连接请求
B:确认连接,发送连接请求
A:确认连接
四次挥手:
A:发送关闭请求
B:确认关闭
B:发送关闭请求
A:确认关闭
1.4.2 UDP协议
面向连接的、不可靠的通信协议
2.Socket网络编程
2.1 客户端
1.实例化
2.连接服务器(IP,端口号)
3.发送消息
4.接收消息
5.关闭
import socket
# 1.#实例化
tcp_client= socket.socket()
# 2.#连接服务器 connect(ip,端口号)
tcp_client.connect(("127.0.0.1", 10087))
# 3.#发送消息 send(字节码)
message=input("请输入要发送的消息")
tcp_client.send(message.encode(encoding='utf-8'))
# 4.#接收消息 recv(接收字节数)
get_message=tcp_client.recv(1024)
print(get_message.decode(encoding='utf-8'))
# 5.#关闭客户端 close
tcp_client.close()
2.2 服务端
1.实例化
2.设置服务器ip和端口号
3.监听,设置最大接待量
4.接收用户(服务窗口、用户地址)
5.接收消息
6.发送消息
7.关闭服务窗口
8.关闭服务器
import socket
#创建服务器
sever_socket = socket.socket()
#给服务器选择 IP地址和端口
sever_socket.bind(("127.0.0.1", 11288))
#设置端口复用
sever_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
#设置最大连接数量,等待连接
sever_socket.listen(5)
while True: #阻塞服务器关闭
#等待客户端连接
client_socket, client_address = sever_socket.accept()
print("客户端已连接")
#接收客户端数据
recv_data = client_socket.recv(1024)
print("接收到的数据为:", recv_data.decode(encoding='utf-8'))
#发送数据给客户端
client_socket.send("欢迎来到聊天室".encode(encoding='utf-8'))
#关闭连接
client_socket.close()
#所有连接结束,关闭服务器
sever_socket.close()
2.3 端口号复用
# 参数1: 表示当前套接字 # 参数2: 设置端口号复用选项 # 参数3: 设置端口号复用选项对应的值 tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
3 拓展——综合案例
3.1 TCP服务端中转ollama
将服务器接收到的消息发送给ollama,将ollama传回的消息,传回给客户端
#服务器
import socket
import ollama
#创建服务器
sever_client=socket.socket()
#绑定ip和端口
sever_client.bind(("127.0.0.1", 10087))
#监听
sever_client.listen(5)
#接收客户端
client_socket, client_address = sever_client.accept()
print(f"用户{client_address}进入聊天室")
#接收消息
recv_message=client_socket.recv(1024)
print(f"用户{client_address}发送的消息为:{recv_message.decode(encoding='utf-8')}")
#连接ollama客户端-------------------------------------
ollama_client=ollama.Client(host="127.0.0.1:11434")
ollama_message=ollama_client.chat(model="qwen2:0.5b",
messages=[{"role": "user", "content": recv_message.decode(encoding='utf-8')}])
print(f"ollama回复的消息为:{ollama_message.message.content}")
#结束连接ollama-------------------------------------
#将消息发送给客户端
client_socket.send(ollama_message.message.content.encode(encoding='utf-8'))
#关闭服务窗口
client_socket.close()
#关闭服务器
3.2 服务端储存客户端上传图片
客户端:将图片以二进制的方式发送给服务端
服务端:新建一个文件夹用于储存图片,使用时间戳给图片命名避免重复
将二进制转为图片格式写进文件夹
#1.开启客户端
import socket
user_client=socket.socket()
#2.连接服务端
user_client.connect(("127.0.0.1",10087))
#3.发送图片
with open("bb.png","rb+") as f:
image=f.read()
user_client.send(image)
print("图片发送成功")
user_client.recv(1024)
user_client.close()
#1.创建客户端
import socket
import time
sever_client=socket.socket()
#2.连接服务器
sever_client.bind(("127.0.0.1", 10087))
#3.监听
sever_client.listen(5)
#4.接收客户端
client_socket, client_address = sever_client.accept()
print(f"用户{client_address}进入聊天室")
#5.接收消息
recv_message=client_socket.recv(10*1024*1024)
with open(file=f"sever_image/{time.time()}.png",mode= "wb") as f:
f.write(recv_message)
print(f"用户{client_address}发送的图片保存成功")
client_socket.send("图片保存成功".encode(encoding='utf-8'))
client_socket.close()
# sever_client.close()
3.3 UDP——飞秋客户端
1.实例化(将协议改为UDP协议)
2.发送消息 消息(ip,端口号)
import socket
#修改默认值为UDP
udp_client=socket.socket(type=socket.SOCK_DGRAM)
#发送消息->飞秋 '1:134871264:叶子:长乐西苑:32:{message}'
message=input("请输入要发送的消息:")
udp_client.sendto(f'1:134871264:叶子:长乐西苑:32:{message}'.encode(encoding='gbk'),("127.0.0.1", 2425))