鱼C论坛

 找回密码
 立即注册
查看: 507|回复: 3

[已解决]python如何在端口写入数据?

[复制链接]
发表于 2024-6-30 00:01:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
rt,写入 dict、list,或者自定义类型(class)之类的,要求实现服务端和客户端代码
最佳答案
2024-6-30 00:01:52
好的,鱼油你来对地方啦!接下来,我就用一道“烤小黄鱼”的美味来解释一下如何在端口间写入数据。

首先,我们需要准备好一些食材:`socket` 模块(它是 Python 的内置模块),以及 `pickle` 模块(用于将 Python 对象序列化和反序列化)。就像我们需要先腌制小黄鱼,还要用调料蘸一下才香!

### 服务端代码
首先,我们要写一个“鱼铺老板”——服务端代码:

  1. import socket
  2. import pickle

  3. # 创建一个socket对象,AF_INET 表示使用IPv4,SOCK_STREAM 表示使用TCP协议
  4. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  5. # 绑定到主机,指定端口
  6. host = 'localhost'
  7. port = 9999
  8. server_socket.bind((host, port))

  9. # 启动监听
  10. server_socket.listen(5)
  11. print('等待客人光临...')

  12. while True:
  13.     # 等待客户端连接
  14.     client_socket, addr = server_socket.accept()
  15.     print(f'来自 {addr} 的客人光临本店!')

  16.     # 接收数据
  17.     data = client_socket.recv(4096)
  18.     if not data:
  19.         break

  20.     # 反序列化数据
  21.     obj = pickle.loads(data)
  22.     print(f'收到的数据:{obj}')

  23.     # 客套一下,在结束之前可以给客户端回复点啥
  24.     response = b'吃喝玩乐尽在本店!'
  25.     client_socket.sendall(response)
  26.    
  27.     # 关闭客户端连接
  28.     client_socket.close()
复制代码


### 客户端代码
接着,我们写一个“顾客”——客户端代码:

  1. import socket
  2. import pickle

  3. # 创建一个socket对象
  4. client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  5. # 连接到服务端
  6. host = 'localhost'
  7. port = 9999
  8. client_socket.connect((host, port))

  9. # 准备要发送的数据
  10. data_dict = {'fish_type': 'yellow croaker', 'size': 'medium'}
  11. data_list = ['fresh', 'grilled', 'delicious']
  12. class Fish:
  13.     def __init__(self, name):
  14.         self.name = name

  15. custom_obj = Fish('Goldfish')

  16. # 序列化数据
  17. serialized_data_dict = pickle.dumps(data_dict)
  18. serialized_data_list = pickle.dumps(data_list)
  19. serialized_custom_obj = pickle.dumps(custom_obj)

  20. # 发送数据
  21. client_socket.sendall(serialized_data_dict)  # 发送字典
  22. # client_socket.sendall(serialized_data_list)  # 发送列表
  23. # client_socket.sendall(serialized_custom_obj)  # 发送自定义对象

  24. # 接收响应
  25. response = client_socket.recv(4096)
  26. print(f'收到的响应:{response.decode()}')

  27. # 关闭连接
  28. client_socket.close()
复制代码


### 解释说明
1. **服务端**:
   - 首先创建了一个 TCP 服务器。
   - 绑定在本地的某个端口上,然后开始监听。
   - 当有客户端连接时,接收数据并将其反序列化成 Python 对象。
   - 打印出来后,发送一个简单的回复,并关闭连接。

2. **客户端**:
   - 创建一个 TCP 客户端并连接到服务端。
   - 准备好各种需要发送的数据(字典、列表、自定义对象)。
   - 用 `pickle` 模块进行序列化,发送数据。
   - 接收服务端的回复,并打印出来。

这就像是顾客走进鱼铺,先点了一份中等大小的黄花鱼,再点了一些下酒菜和饮料。服务员(我们的服务端程序)接单后,把每道菜都详细记录下来,然后给顾客递上一句:“吃喝玩乐尽在本店!”。

希望这样解释能让你在编写 Python 网络应用时,能愉快地加冰啤酒,欢快地烤小黄鱼啦!如果你还有其他问题,随时提问哦~

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-6-30 00:01:52 | 显示全部楼层    本楼为最佳答案   
好的,鱼油你来对地方啦!接下来,我就用一道“烤小黄鱼”的美味来解释一下如何在端口间写入数据。

首先,我们需要准备好一些食材:`socket` 模块(它是 Python 的内置模块),以及 `pickle` 模块(用于将 Python 对象序列化和反序列化)。就像我们需要先腌制小黄鱼,还要用调料蘸一下才香!

### 服务端代码
首先,我们要写一个“鱼铺老板”——服务端代码:

  1. import socket
  2. import pickle

  3. # 创建一个socket对象,AF_INET 表示使用IPv4,SOCK_STREAM 表示使用TCP协议
  4. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  5. # 绑定到主机,指定端口
  6. host = 'localhost'
  7. port = 9999
  8. server_socket.bind((host, port))

  9. # 启动监听
  10. server_socket.listen(5)
  11. print('等待客人光临...')

  12. while True:
  13.     # 等待客户端连接
  14.     client_socket, addr = server_socket.accept()
  15.     print(f'来自 {addr} 的客人光临本店!')

  16.     # 接收数据
  17.     data = client_socket.recv(4096)
  18.     if not data:
  19.         break

  20.     # 反序列化数据
  21.     obj = pickle.loads(data)
  22.     print(f'收到的数据:{obj}')

  23.     # 客套一下,在结束之前可以给客户端回复点啥
  24.     response = b'吃喝玩乐尽在本店!'
  25.     client_socket.sendall(response)
  26.    
  27.     # 关闭客户端连接
  28.     client_socket.close()
复制代码


### 客户端代码
接着,我们写一个“顾客”——客户端代码:

  1. import socket
  2. import pickle

  3. # 创建一个socket对象
  4. client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  5. # 连接到服务端
  6. host = 'localhost'
  7. port = 9999
  8. client_socket.connect((host, port))

  9. # 准备要发送的数据
  10. data_dict = {'fish_type': 'yellow croaker', 'size': 'medium'}
  11. data_list = ['fresh', 'grilled', 'delicious']
  12. class Fish:
  13.     def __init__(self, name):
  14.         self.name = name

  15. custom_obj = Fish('Goldfish')

  16. # 序列化数据
  17. serialized_data_dict = pickle.dumps(data_dict)
  18. serialized_data_list = pickle.dumps(data_list)
  19. serialized_custom_obj = pickle.dumps(custom_obj)

  20. # 发送数据
  21. client_socket.sendall(serialized_data_dict)  # 发送字典
  22. # client_socket.sendall(serialized_data_list)  # 发送列表
  23. # client_socket.sendall(serialized_custom_obj)  # 发送自定义对象

  24. # 接收响应
  25. response = client_socket.recv(4096)
  26. print(f'收到的响应:{response.decode()}')

  27. # 关闭连接
  28. client_socket.close()
复制代码


### 解释说明
1. **服务端**:
   - 首先创建了一个 TCP 服务器。
   - 绑定在本地的某个端口上,然后开始监听。
   - 当有客户端连接时,接收数据并将其反序列化成 Python 对象。
   - 打印出来后,发送一个简单的回复,并关闭连接。

2. **客户端**:
   - 创建一个 TCP 客户端并连接到服务端。
   - 准备好各种需要发送的数据(字典、列表、自定义对象)。
   - 用 `pickle` 模块进行序列化,发送数据。
   - 接收服务端的回复,并打印出来。

这就像是顾客走进鱼铺,先点了一份中等大小的黄花鱼,再点了一些下酒菜和饮料。服务员(我们的服务端程序)接单后,把每道菜都详细记录下来,然后给顾客递上一句:“吃喝玩乐尽在本店!”。

希望这样解释能让你在编写 Python 网络应用时,能愉快地加冰啤酒,欢快地烤小黄鱼啦!如果你还有其他问题,随时提问哦~

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-1 18:35:27 | 显示全部楼层
FishC 发表于 2024-6-30 00:01
好的,鱼油你来对地方啦!接下来,我就用一道“烤小黄鱼”的美味来解释一下如何在端口间写入数据。

首先 ...

如果是 Java 呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-1 18:35:47 | 显示全部楼层


哈哈,大鱼喜欢“换口味”啦,那就让我们来看一下如何用 Java 实现类似的需求。虽然咱们从 Python 换成了 Java,但同样没问题!

### 服务端代码(Java)

  1. import java.io.*;
  2. import java.net.ServerSocket;
  3. import java.net.Socket;
  4. import java.util.HashMap;

  5. public class FishServer {
  6.     public static void main(String[] args) {
  7.         try (ServerSocket serverSocket = new ServerSocket(9999)) {
  8.             System.out.println("鱼儿等待客官进店...");

  9.             while (true) {
  10.                 Socket clientSocket = serverSocket.accept();
  11.                 System.out.println("一位客官上门了:" + clientSocket.getInetAddress());

  12.                 try (ObjectInputStream in = new ObjectInputStream(clientSocket.getInputStream());
  13.                      ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream())) {

  14.                     // 接收数据
  15.                     Object obj = in.readObject();
  16.                     System.out.println("接收到的对象:" + obj);

  17.                     // 客套回复
  18.                     String response = "千里送鱼,礼轻情意重!";
  19.                     out.writeObject(response);
  20.                 } catch (ClassNotFoundException e) {
  21.                     e.printStackTrace();
  22.                 } finally {
  23.                     clientSocket.close();
  24.                 }
  25.             }
  26.         } catch (IOException e) {
  27.             e.printStackTrace();
  28.         }
  29.     }
  30. }
复制代码


### 客户端代码(Java)

  1. import java.io.*;
  2. import java.net.Socket;
  3. import java.util.HashMap;

  4. public class FishClient {
  5.     public static void main(String[] args) {
  6.         try (Socket socket = new Socket("localhost", 9999);
  7.              ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
  8.              ObjectInputStream in = new ObjectInputStream(socket.getInputStream())) {

  9.             // 准备数据
  10.             HashMap<String, String> data = new HashMap<>();
  11.             data.put("fish_type", "yellow croaker");
  12.             data.put("size", "medium");

  13.             // 发送数据
  14.             out.writeObject(data);

  15.             // 接收回复
  16.             String response = (String) in.readObject();
  17.             System.out.println("服务端回复:" + response);
  18.         } catch (IOException | ClassNotFoundException e) {
  19.             e.printStackTrace();
  20.         }
  21.     }
  22. }
复制代码


### 解释说明

1. **服务端**:
   - 创建一个 `ServerSocket` 监听在端口 `9999` 上。
   - 使用 `accept()` 方法接受客户端连接。
   - 使用 `ObjectInputStream` 和 `ObjectOutputStream` 以流的方式读取和写入对象。
   - 接收到来自客户端的对象后,打印出来并发送一个简单的字符串回复。

2. **客户端**:
   - 创建一个 `Socket` 连接到服务端。
   - 同样使用 `ObjectOutputStream` 和 `ObjectInputStream` 处理对象数据。
   - 准备一个包含鱼类信息的 `HashMap`,发送给服务端。
   - 接收服务端的回复并打印出来。

就像顾客走进 Java 鱼铺点了一份鱼,然后鱼铺服务员用非常绅士的方式接待了顾客,还回了一句“千里送鱼,礼轻情意重”,让顾客倍感温暖。

希望这个 Java 版的鱼铺示例也能让你学会如何在 Java 端口上进行数据传输。如果有任何疑问,请随时向我提问哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 01:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表