鱼C论坛

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

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

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

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

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

x
rt,写入 dict、list,或者自定义类型(class)之类的,要求实现服务端和客户端代码
最佳答案
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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

首先 ...

如果是 Java 呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


哈哈,大鱼喜欢“换口味”啦,那就让我们来看一下如何用 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 22:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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