好的,鱼油你来对地方啦!接下来,我就用一道“烤小黄鱼”的美味来解释一下如何在端口间写入数据。
首先,我们需要准备好一些食材:`socket` 模块(它是 Python 的内置模块),以及 `pickle` 模块(用于将 Python 对象序列化和反序列化)。就像我们需要先腌制小黄鱼,还要用调料蘸一下才香!
### 服务端代码
首先,我们要写一个“鱼铺老板”——服务端代码:
import socket
import pickle
# 创建一个socket对象,AF_INET 表示使用IPv4,SOCK_STREAM 表示使用TCP协议
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定到主机,指定端口
host = 'localhost'
port = 9999
server_socket.bind((host, port))
# 启动监听
server_socket.listen(5)
print('等待客人光临...')
while True:
# 等待客户端连接
client_socket, addr = server_socket.accept()
print(f'来自 {addr} 的客人光临本店!')
# 接收数据
data = client_socket.recv(4096)
if not data:
break
# 反序列化数据
obj = pickle.loads(data)
print(f'收到的数据:{obj}')
# 客套一下,在结束之前可以给客户端回复点啥
response = b'吃喝玩乐尽在本店!'
client_socket.sendall(response)
# 关闭客户端连接
client_socket.close()
### 客户端代码
接着,我们写一个“顾客”——客户端代码:
import socket
import pickle
# 创建一个socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到服务端
host = 'localhost'
port = 9999
client_socket.connect((host, port))
# 准备要发送的数据
data_dict = {'fish_type': 'yellow croaker', 'size': 'medium'}
data_list = ['fresh', 'grilled', 'delicious']
class Fish:
def __init__(self, name):
self.name = name
custom_obj = Fish('Goldfish')
# 序列化数据
serialized_data_dict = pickle.dumps(data_dict)
serialized_data_list = pickle.dumps(data_list)
serialized_custom_obj = pickle.dumps(custom_obj)
# 发送数据
client_socket.sendall(serialized_data_dict) # 发送字典
# client_socket.sendall(serialized_data_list) # 发送列表
# client_socket.sendall(serialized_custom_obj) # 发送自定义对象
# 接收响应
response = client_socket.recv(4096)
print(f'收到的响应:{response.decode()}')
# 关闭连接
client_socket.close()
### 解释说明
1. **服务端**:
- 首先创建了一个 TCP 服务器。
- 绑定在本地的某个端口上,然后开始监听。
- 当有客户端连接时,接收数据并将其反序列化成 Python 对象。
- 打印出来后,发送一个简单的回复,并关闭连接。
2. **客户端**:
- 创建一个 TCP 客户端并连接到服务端。
- 准备好各种需要发送的数据(字典、列表、自定义对象)。
- 用 `pickle` 模块进行序列化,发送数据。
- 接收服务端的回复,并打印出来。
这就像是顾客走进鱼铺,先点了一份中等大小的黄花鱼,再点了一些下酒菜和饮料。服务员(我们的服务端程序)接单后,把每道菜都详细记录下来,然后给顾客递上一句:“吃喝玩乐尽在本店!”。
希望这样解释能让你在编写 Python 网络应用时,能愉快地加冰啤酒,欢快地烤小黄鱼啦!如果你还有其他问题,随时提问哦~
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |