1
0
0

03-python网络编程

2026-06-16
2026-06-20

网络编程

思维导图

python高级编程03.png

TCP

面向连接、可靠的、基于字节流的通信管道

  • 协议 - TCP
  • IP - 网络环境内计算机的唯一标识
  • 端口号 - 计算机内程序的运行标识
    1781603863433.png
客户端
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()

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!