本文目录
  1. 1.网络通信三要素
  2. 1.1七层协议
  3. 1.2 IP
  4. 1.3 端口
  5. 1.4 协议
  6. 2.Socket网络编程
  7. 2.1 客户端
  8. 2.2 服务端
  9. 2.3 端口号复用
  10. 3 拓展——综合案例
  11. 3.1 TCP服务端中转ollama
  12. 3.2 服务端储存客户端上传图片
  13. 3.3 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))