我正在编写应使用TCP套接字将JSON数据从python客户端发送到java服务器的代码。
JSON对象包含2个字段:name(str)和data(bytes)。
--- python服务器部分---
i = 0
for file in directory:
f = open("C:\\CImage\\"+file, 'rb')
print("file->", file)
f_data = f.read()
encoded_string = base64.encodebytes(f_data).decode('utf-8')
json_entry["name"+str(i)] = str(file)
json_entry["image"+str(i)] = encoded_string
img.append(f_data)
i += 1
json_string = json.dumps(json_entry, ensure_ascii=False, indent=4)
conn.sendall(data.encode())
--- python服务器部分---
我已经使用base64.encodebytes(f_data)
来解决此错误:
UnicodeDecodeError:“ utf-8”编解码器无法解码位置0:无效的起始字节中的字节0xff
和.decode()
将字节转换为字符串( JSON字段的值必须为str
)。
python发送此json对象
--- java part ---
InputStream in = clientSock.getInputStream();
BufferedInputStream bis = new BufferedInputStream(in);
String before_json = new String(bis.readAllBytes());
JSONParser parser = new JSONParser();
Object obj = parser.parse( before_json );
JSONObject jsonObject = (JSONObject) obj;
BufferedImage img;
for(int i = 0; i<jsonObject.size()/2;i++)
{
String img_name = (String) jsonObject.get("name"+i);
System.out.println("name"+i+" : "+img_name);
}
for(int i = 0; i<jsonObject.size()/2;i++)
{
String img_byte = (String) jsonObject.get("image"+i);
System.out.println("image"+i+" : "+img_byte);
img = ImageIO.read(new ByteArrayInputStream(Base64.getDecoder().decode(img_byte.getBytes())));
ImageIO.write(img,"jpg",new File("D:\\path\\"+"name"+i));
}
--- java part ---
我已经打印了名称和图像字节字符串。看起来不错。
但是我在img = ImageIO.read()
遇到下一个错误:
java.lang.IllegalArgumentException:非法的base64字符和...
这就是我希望代码能正常工作的方式:
Python:
[image 'bytes'] -> ['bytes' base64 encoded] -> ['string']
Java:
['string'] -> ['bytes' after getBytes()] -> ['bytes' base64 decoded]
您能帮我发现错误吗?