You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java客户端与Python服务器跨语言Socket传输序列化Account对象的实现方案

跨语言Socket传输Java序列化对象的可行性与实现方案

可行性说明

可行,但不能直接使用Java自带的序列化机制和Python的pickle模块——这两种序列化格式是语言专属实现,彼此完全不兼容。必须采用跨语言通用的序列化协议(如JSON、Protobuf、XML等)来完成不同语言间的对象传输。

现有代码的核心问题

你的代码中,Java客户端用ObjectOutputStream输出Java专属的序列化字节流,而Python服务端试图用pickle.loads解析,这必然失败:两种格式的数据结构、编码逻辑完全不匹配,Python无法识别Java的序列化数据。

实现方案(以JSON为例,简单易上手)

1. Java客户端改造:将Account对象转为JSON字符串传输

需要引入JSON处理库,这里以Gson为例:

先添加Gson依赖(Maven):

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>

修改后的Java客户端代码:

import com.google.gson.Gson;
import java.io.*;
import java.net.Socket;

public class CLIENT {
    static class Account implements Serializable {
        String account_id = "";
        int amount = 0;
    }

    public static void main(String[] args) {
        int Port = 50007;
        Gson gson = new Gson();
        try {
            Socket s = new Socket("localhost", Port);
            System.out.println("Client trying to connect to port " + Port);

            OutputStreamWriter outputWriter = new OutputStreamWriter(s.getOutputStream());
            BufferedReader inputReader = new BufferedReader(new InputStreamReader(s.getInputStream()));

            System.out.println("Ready to communicate");
            while (true) {
                Account obj = new Account();
                obj.account_id = "123";
                obj.amount = 10000;

                // 将Account对象转为JSON字符串
                String jsonStr = gson.toJson(obj);
                // 发送JSON字符串,添加换行符作为结束标记(方便Python端读取)
                outputWriter.write(jsonStr + "\n");
                outputWriter.flush();

                String inn = inputReader.readLine();
                System.out.println("Server: " + inn);

                // 可选:添加延迟避免频繁发送
                Thread.sleep(1000);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

2. Python服务端改造:接收JSON字符串并解析为对象

Python自带json模块,无需额外安装:

import socket
import json

class Account:
    def __init__(self, account_id="", amount=0):
        self.account_id = account_id
        self.amount = amount

HOST = 'localhost'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(5)

conn, addr = s.accept()
print('Connected by', addr)

# 读取数据并解码为字符串,去除首尾空白
data = conn.recv(4096).decode('utf-8').strip()
# 解析JSON为字典,再转为Account对象
account_dict = json.loads(data)
account = Account(account_dict['account_id'], account_dict['amount'])

print(account.account_id)
print(account.amount)

conn.send('Thank you for connecting'.encode('utf-8'))
conn.close()

其他可选方案

  • Protobuf:传输效率更高,适合对性能要求高的场景,需要先定义.proto描述文件,再分别生成Java和Python的代码。
  • XML:可读性强,但传输体积较大,适合对数据可读性有要求的场景。

内容的提问来源于stack exchange,提问作者user18280260

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 09:15:36