主题
网络编程
一、网络编程三要素
1. ip地址
这是网络环境下每一台计算机的唯一标识,通过IP地址来找到指定的计算机
ipv4
xxx.xxx.xxx.xxx (0~255)
ipv6
2. 端口
用于标识进程的逻辑地址,通过端口来找到指定的进程(0~65535)
知名端口号(windows系统):0~1023
动态端口号:1024~65535
3. 协议
定义通信规则,符合协议则可以通信,否则无法正常通信
tcp协议:它是一种面向连接的、可靠的、基于字节流的传输层通信协议
- 建立连接:三次握手
- 传输数据
- 关闭连接:四次挥手
udp协议:它是一种无连接传输层协议
二、socket套接字
而进程之间想要进行网络通信需要基于 socket
python
# 导入socket模块
import socket
# 内容转换为字节encode
内容.encode(encoding = 'utf-8')
# 字节转换为内容decode
字节.decode(encoding = 'utf-8')三、TCP
1. 客户端
python
客户端
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()2. 服务端
python
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. UDP
客户端
python
import socket
# udp 连接
# 创建udp客户端 - SOCK - DGRAM
udp_client = socket.socket(type=socket.SOCK_DGRAM)
# udp发送消息(message.decode(),(IP,端口))sendto
# udp(飞秋特有格式)
message = input('请输入要发送的消息:')
# 点对点(要发送的ip)
# udp_client.sendto(f'1:134871264:兵马俑:2号坑位5排14位:32:{message}'.encode('gbk'), ('192.168.14.21', 2425))
# 广播模式(ip最后一位255)
udp_client.sendto(f'1:134871264:兵马俑:2号坑位5排14位:32:{message}'.encode('gbk'), ('192.168.14.255', 2425))服务端:飞秋
2. TCP + ollama
服务端
python
# 1. 客户端发送tcp消息 - 用户询问了一个问题
# 2. 服务端接收tcp消息 - ollama处理这个问题
# 客户端发消息(tcp) ---------> 服务端 ---中转---> ollama
# ↓
# 客户端发消息(tcp) <--------- 服务端 <--中转---- ollama
import socket
import ollama
# 创建服务端
server_client = socket.socket()
# 绑定ip+端口号
server_client.bind(('127.0.0.1', 10087))
# 设置监听那个数量
server_client.listen(10)
# 等待客户端接入,chat_client 是接入的子服务端
chat_client, address = server_client.accept()
print(f'新用户{address}接入客户端')
# 接收消息
client_message = chat_client.recv(1024)
print(f'用户{address}发来的消息是:{client_message.decode(encoding="utf-8")}')
# 建立ollama客户端
ollama_client = ollama.Client(host='127.0.0.1:11434')
ollama_massage = ollama_client.chat(
model='deepseek-r1:1.5b',
messages=[{'role': 'user', 'content': client_message.decode(encoding="utf-8")}]
)
print(f'ollama返回的消息是:{ollama_massage.message.content}')
# 响应消息给客户端
chat_client.send(ollama_massage.message.content.encode(encoding="utf-8"))
# 关闭聊天
chat_client.close()
# 关闭服务端
server_client.close()3. TCP图片服务器
需求:写一个服务器,可以用来接收别人上传的图片,把别人上传的图片保存在本地
客户端
python
import socket
# 创建客户端
client = socket.socket()
# ip+端口
client.connect(('127.0.0.1', 10087))
with open(file='img.png', mode='rb+') as f:
# 读取图片内容
img_content = f.read()
# 发送图片给服务端
client.send(img_content)
# 接受服务端返回的消息
server_message = client.recv(1024)
print(server_message.decode(encoding='utf-8'))
client.close()服务端
python
import socket
import time
# 创建服务器
server = socket.socket()
# 绑定ip和端口号
server.bind(('127.0.0.1', 10087))
# 设置监听数量
server.listen(10)
while True:
# 建立与客户端通信
img_client, address = server.accept()
# 接收客户端内容
img_content = img_client.recv(10 * 1024 * 1024)
# 把图片写入文件中,存在文件夹中
with open(file=f'img_info/{time.time()}.png', mode='wb+') as f:
f.write(img_content)
print(f'{address}图片保存成功:{time.time()}')
# 响应给客户端
img_client.send('图片保存成功'.encode(encoding='utf-8'))
# 关闭通道
img_client.close()
# 关闭服务端
server.close()