1
0
0
03-python网络编程
网络编程
思维导图

TCP
面向连接、可靠的、基于字节流的通信管道
- 协议 - TCP
- IP - 网络环境内计算机的唯一标识
- 端口号 - 计算机内程序的运行标识

客户端
1.创建客户端
2.连接服务端
3.发送消息(字节)
4.等待服务器响应(阻塞)
5.停止客户端
import socket
# 1.实例化socket([ipv4/ipv6],[tcp/udp]) - 创建客户端
# tcp_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#传参的写法
tcp_client = socket.socket() # 省略参数的写法
# 2.连接服务器connect(ip,端口)
tcp_client.connect(('192.168.14.21',10086))
# 3.发送消息send(字节)
message = input('请输入你的聊天内容')
tcp_client.send(message.encode(encoding='utf-8'))
# 4.接收服务端消息(可选 - 阻塞代码)
server_message = tcp_client.recv(1024)
print(server_message.decode(encoding='utf-8'))
# 5.断开连接close
tcp_client.close()
服务端
1.创建服务端
2.绑定ip地址,端口号
3.设置最大连接数的监听
4.开始接入客户端,产生一个【新的聊天客户端】(阻塞)
5.给客户端发消息
6.接收客户端消息
7.停止【新的聊天客户端】
8.停止服务端
import socket
# 1.创建服务端
server_client = socket.socket()
# 2.绑定ip和端口号
server_client.bind(('192.168.14.21', 10086))
# 设置端口复用(当前的套接字,端口服用选项,布尔值)
server_client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 3.监听客户端的接入(数量)
server_client.listen(10)
# 排队和每一个人聊天---------------------------------
while True:
# 4.开始接入客户端(阻塞),返回(用于聊天的服务端)
client, address = server_client.accept()
# 5.服务端发给客户端送消息send
server_message = "欢迎加入聊天室~"
client.send(server_message.encode(encoding='utf-8'))
# 6.接收客户端发送的消息recv(内容大小)
client_message = client.recv(1024)
print(address, client_message.decode(encoding='utf-8'))
# 7.关闭与客户端的通道
client.close()
# 所有人聊天结束---------------------------------------
# 8.关闭服务端(符合业务严谨程度)
server_client.close()
# 用餐(客户端)
# 1.选餐厅
# 2.打饭
# 3.结束
# 食堂(服务端)
# 1.挑选商场(ip),商铺(端口号),开启营业
# 2.确定最大的营业窗口(listen)
# 3.开启窗口营业,等待顾客打饭(accept)
# 4.每来一个客人就可以进行一次交易(发消息,收消息)
# 5.顾客走了(client.close)
# 6.所有顾客走完了,打烊了(server_client.close)
UDP(客户端)
面向无连接(不可靠)
1.创建udp客户端
udp_client = socket.socket(type = socket.DGRAM)
2.发消息
udp_client.sendto(消息,(ip,端口))
eg:
飞秋消息的固定格式
"1:134871263:老潘:AI大模型西安3期:32:{message}"
飞秋发一条消息
udp_client.sendto(f'1:134871263:老潘:AI大模型西安3期:32:{message}'.encode(encoding='gbk'),('192.168.14.21',2425))
飞秋广播发送消息
udp_client.sendto(f'1:134871263:老潘:AI大模型西安3期:32:{message}'.encode(encoding='gbk'),('192.168.14.255',2425))
案例
tcp客户端 + tcp服务端
-------------------------------------------客户端
import socket
# 1.实例化socket([ipv4/ipv6],[tcp/udp]) - 创建客户端
# tcp_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#传参的写法
tcp_client = socket.socket() # 省略参数的写法
# 2.连接服务器connect(ip,端口)
tcp_client.connect(('192.168.14.21',10086))
# 3.发送消息send(字节)
message = input('请输入你的聊天内容')
tcp_client.send(message.encode(encoding='utf-8'))
# 4.接收服务端消息(可选 - 阻塞代码)
server_message = tcp_client.recv(1024)
print(server_message.decode(encoding='utf-8'))
# 5.断开连接close
tcp_client.close()
-------------------------------------------服务端
import socket
# 1.创建服务端
server_client = socket.socket()
# 2.绑定ip和端口号
server_client.bind(('192.168.14.21', 10086))
# 设置端口复用(当前的套接字,端口服用选项,布尔值)
server_client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 3.监听客户端的接入(数量)
server_client.listen(10)
# 排队和每一个人聊天---------------------------------
while True:
# 4.开始接入客户端(阻塞),返回(用于聊天的服务端)
client, address = server_client.accept()
# 5.服务端发给客户端送消息send
server_message = "欢迎加入聊天室~"
client.send(server_message.encode(encoding='utf-8'))
# 6.接收客户端发送的消息recv(内容大小)
client_message = client.recv(1024)
print(address, client_message.decode(encoding='utf-8'))
# 7.关闭与客户端的通道
client.close()
# 所有人聊天结束---------------------------------------
# 8.关闭服务端(符合业务严谨程度)
server_client.close()
tcp客户端 + [tcp服务端 + ollama服务端]
# 1.客户端发送tcp消息 - 用户询问了一个问题
# 2.服务端收到tcp消息 - ollama处理这个问题
# 客户端发消息(tcp)---->服务端 ---中转---> (ollama)
# ↓
# ↓
# ↓
# ↓
# 处理消息
# ↓
# ↓
# ↓
# ↓
# 客户端发消息(tcp)<----服务端<---中转<--- (ollama)
import socket
import ollama
# 1.创建服务端
server_client = socket.socket()
# 2.绑定ip+端口号
server_client.bind(('192.168.14.21', 10086))
# 3.设置监听数量(同时能有几个人聊天)
server_client.listen(10)
# 4.等待客户端接入,chat_client接入的客户端,address当前客户端的ip
chat_client,address = server_client.accept()
print(f'当前用新用户进入聊天{address}')
client_message = chat_client.recv(1024) # client_message是文字还是字节?
print(f"当前用户发送的消息是:{client_message.decode(encoding='utf-8')}")
# -----------------------------------------开始中转给ollama
# 5.建立ollama客户端
ollama_client = ollama.Client(host="127.0.0.1:11434")
ollama_message = ollama_client.chat(
model="deepseek-r1:1.5b",
messages=[{ "role":"user","content":client_message.decode(encoding="utf-8")}]
)
print(f"ollama响应的消息内容是:{ollama_message.message.content}")
# -----------------------------------------结束中转给ollama
# 6.响应消息给客户端
chat_client.send(ollama_message.message.content.encode(encoding="utf-8"))
# 7.结束客户端对话
chat_client.close()
# 8.结束服务端
server_client.close()
tcp客户端上传图片 + tcp服务端接收图片
# 需求:你写一个服务器,可以用于接收别人上传的图片,把别人上传的图片保存在本地
# -----------
# | |
# | 客户端 |
# | |
# -----------
# ↓
# ↓ 图片
# ↓
# -----------
# | |
# | 服务端 |
# | |
# -----------
# ↓
# ↓ 保存图片
# ↓
# -----------
# | |
# | 文件夹 |
# | |
# -----------
-------------------------------------------------客户端
# 1.明确图片在哪里(a.png),怎么拿到图片(文件读写)
# 2.怎么传输(tcp)
import socket
client = socket.socket()
client.connect(('192.168.14.21',10086))
with open(file="a.png",mode="rb+") as f:
# 读取图片内容
img_content = f.read()
# 发送图片内容给服务端
client.send(img_content)
client.recv(1024)
client.close()
-------------------------------------------------服务端
import socket
import time
server_client = socket.socket()
server_client.bind(('192.168.14.21', 10086))
server_client.listen(24)
while True:
# 建立与客户端通信的渠道
img_client, address = server_client.accept()
# 接收客户端传递的图片内容
img_content = img_client.recv(10 * 1024 * 1024)
# 创建图片文件,把内容写入
file_name = f"{time.time()}.png"
with open(file=f"server_image/{file_name}", mode="wb+") as f:
f.write(img_content)
print(f"{address}图片保存成功:{file_name}")
img_client.send(f"图片接收成功~".encode(encoding="utf-8"))
img_client.close()
# 虽然执行不到这里,保持良好的代码风格
server_client.close()
