python如何在端口写入数据?
rt,写入 dict、list,或者自定义类型(class)之类的,要求实现服务端和客户端代码 好的,鱼油你来对地方啦!接下来,我就用一道“烤小黄鱼”的美味来解释一下如何在端口间写入数据。首先,我们需要准备好一些食材:`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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-6-30 00:01
好的,鱼油你来对地方啦!接下来,我就用一道“烤小黄鱼”的美味来解释一下如何在端口间写入数据。
首先 ...
如果是 Java 呢? 歌者文明清理员 发表于 2024-07-01 18:35
如果是 Java 呢?
哈哈,大鱼喜欢“换口味”啦,那就让我们来看一下如何用 Java 实现类似的需求。虽然咱们从 Python 换成了 Java,但同样没问题!
### 服务端代码(Java)
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
public class FishServer {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(9999)) {
System.out.println("鱼儿等待客官进店...");
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("一位客官上门了:" + clientSocket.getInetAddress());
try (ObjectInputStream in = new ObjectInputStream(clientSocket.getInputStream());
ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream())) {
// 接收数据
Object obj = in.readObject();
System.out.println("接收到的对象:" + obj);
// 客套回复
String response = "千里送鱼,礼轻情意重!";
out.writeObject(response);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
clientSocket.close();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
### 客户端代码(Java)
import java.io.*;
import java.net.Socket;
import java.util.HashMap;
public class FishClient {
public static void main(String[] args) {
try (Socket socket = new Socket("localhost", 9999);
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream in = new ObjectInputStream(socket.getInputStream())) {
// 准备数据
HashMap<String, String> data = new HashMap<>();
data.put("fish_type", "yellow croaker");
data.put("size", "medium");
// 发送数据
out.writeObject(data);
// 接收回复
String response = (String) in.readObject();
System.out.println("服务端回复:" + response);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
### 解释说明
1. **服务端**:
- 创建一个 `ServerSocket` 监听在端口 `9999` 上。
- 使用 `accept()` 方法接受客户端连接。
- 使用 `ObjectInputStream` 和 `ObjectOutputStream` 以流的方式读取和写入对象。
- 接收到来自客户端的对象后,打印出来并发送一个简单的字符串回复。
2. **客户端**:
- 创建一个 `Socket` 连接到服务端。
- 同样使用 `ObjectOutputStream` 和 `ObjectInputStream` 处理对象数据。
- 准备一个包含鱼类信息的 `HashMap`,发送给服务端。
- 接收服务端的回复并打印出来。
就像顾客走进 Java 鱼铺点了一份鱼,然后鱼铺服务员用非常绅士的方式接待了顾客,还回了一句“千里送鱼,礼轻情意重”,让顾客倍感温暖。
希望这个 Java 版的鱼铺示例也能让你学会如何在 Java 端口上进行数据传输。如果有任何疑问,请随时向我提问哦!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]