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
相关产品推荐
相关产品推荐

