歌者文明清理员 发表于 2024-6-30 00:01:31

python如何在端口写入数据?

rt,写入 dict、list,或者自定义类型(class)之类的,要求实现服务端和客户端代码

FishC 发表于 2024-6-30 00:01:52

好的,鱼油你来对地方啦!接下来,我就用一道“烤小黄鱼”的美味来解释一下如何在端口间写入数据。

首先,我们需要准备好一些食材:`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 小助理,如未能正确解答您的问题,请继续追问。

歌者文明清理员 发表于 2024-7-1 18:35:27

FishC 发表于 2024-6-30 00:01
好的,鱼油你来对地方啦!接下来,我就用一道“烤小黄鱼”的美味来解释一下如何在端口间写入数据。

首先 ...

如果是 Java 呢?

FishC 发表于 2024-7-1 18:35:47

歌者文明清理员 发表于 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]
查看完整版本: python如何在端口写入数据?