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

Python Socket客户端向Java Socket服务端发消息抛出EOFException怎么解决

问题根源

Java的DataInputStream.readUTF()方法要求读取的内容必须遵循DataOutputStream.writeUTF()的编码规范:先传输2个字节的无符号整数表示后续UTF-8字符串的字节长度,再传输对应长度的UTF-8字节内容。你当前Python客户端直接发送的是原始字符串字节,没有前面的长度头,导致Java读取长度时就读到了数据流末尾,抛出EOFException。

两种解决方案二选一即可,无需同时修改两端代码:


方案1:修改Python客户端,兼容Java的readUTF格式

无需调整Java原有代码,只需要让Python发送数据时遵循Java的UTF传输规范即可:

import socket
import struct

socket = socket.socket()
host = "localhost"
port = 6000
socket.connect((host, port))

# 先读取2个字节的消息长度,再读取对应长度的内容
len_bytes = socket.recv(2)
msg_len = struct.unpack('>H', len_bytes)[0]
message = socket.recv(msg_len)
print(message.decode('utf-8'))

# 发送消息时先加2字节大端序的长度头,再发消息内容
send_msg = "Hello Server".encode('utf-8')
send_len = struct.pack('>H', len(send_msg))
socket.sendall(send_len + send_msg)

socket.close()

方案2:修改Java服务端,直接读取原始字节流

无需调整Python原有代码,只需要让Java放弃readUTF格式校验,直接读取原始字节转字符串即可:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class Server {
    
    public static void main(String[] args) {
        try {
            ServerSocket serversocket = new ServerSocket(6000);
            Socket client = serversocket.accept();

            final InputStream input = client.getInputStream();
            final OutputStream output = client.getOutputStream();

            // 直接发送原始UTF8字节
            output.write("Hello Client!".getBytes(StandardCharsets.UTF_8));
            output.flush();

            // 读取客户端发送的原始字节转字符串
            byte[] buffer = new byte[1024];
            int len = input.read(buffer);
            String message = new String(buffer, 0, len, StandardCharsets.UTF_8);
            System.out.println(message);

            serversocket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:06:04