gpt4 book ai didi

java - ObjectOutputStream.writeBytes(String s) 意外的输出值

转载 作者:太空宇宙 更新时间:2023-11-04 12:31:33 25 4
gpt4 key购买 nike

我正在使用 ObjectOutputStream 对象操作系统将字符串消息从客户端 Android 应用程序发送到 C++ 服务器。

我知道服务器必须如何接收我的消息:消息的每个字符都存储在字节数组 (received_msg[]) 中。我还知道服务器期望的确切消息(通过另一个 C++ 应用程序)。

我发送的数据是由 1 个字节数组和 2 个其他字符串组成的字符串。

我的问题:我已经使用 PrintWriter 发送数据,但我的服务器总是会在 received_msg 索引 24 到 28 处显示一些奇怪的字符。我尝试了很多转换来修复它,但放弃了。所以我尝试使用ObjectOutputStream发送消息。当客户端使用ObjectOutputStream.writeBytes()时,服务器显示几乎正确的接收消息。差不多是因为开头加了字符。

类似的事情:在服务器中收到的_msg:

index 0: ┐

index 1: i

index 2: ''

index 3: |

index 4: I //beginning of the message I actually wanted to send

index 5: S //every char following index 4 is good.

而我在“I”“S”之前没有预期并发送任何内容。我发送的消息是这样开始的:ISOXXXXX

所以我想知道是否有任何方法可以检索 ObjectOutputStream.writeBytes 的真实输出。我知道它是输出,而不是输入,但这仍然可以帮助我理解它如何添加奇怪的 header 。

提前感谢您的建议

我的发送功能

private void send(String o) {
System.out.println("socket");
try {
this.socket = new Socket(serverIP, portNumber);
os = new ObjectOutputStream(socket.getOutputStream());
//OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());
//InputStreamReader in = new InputStreamReader(socket.getInputStream());
// PrintWriter pw = new PrintWriter(out, true);

System.out.println("Connected to server : " + this.socket.getInetAddress() + " on port " + this.socket.getPort());
System.out.println("from local address: " + this.socket.getLocalAddress() + " and port: " + this.socket.getLocalPort());
System.out.println("02. -> Sending an object...");

ArrayList<String> tempoStr = StringToByteArray(o);
String msg="";
for(String inStr :tempoStr)
msg+=inStr;
System.out.println("the message I ACTUALLY send is\n"+msg); //the result in console is EXACTLY the message I expect.
os.writeBytes(msg); //then when I check on the server: unexpected additionnal chars at the beginning.
os.flush();
// pw.write(msg);
//pw.flush();
System.out.println("send success");
} catch (IOException e) {
e.printStackTrace();
System.out.println("XX. Exception Occurred on Sending:" + e.toString() +"\n"+ e.getCause());
System.out.println("Socket creation failure or error on sending.");

}
}

PS:我无法更改服务器代码。

最佳答案

不要使用ObjectOutputStream(仅限Java)。人们可能会使用 DataOutputStream,但在这里您似乎想要一些简单的东西。

byte[] a = ...
String b = ...

OutputStream out = ...
out.write(a);
out.write((b + '\u0000').getBytes("UTF-8")); // Or "Windows-1252" / "ISO-8859-1"
out.flush();

我添加了一个 '\0',因为它在 C/C++ 中用于终止字符串(二进制输出)。或者可能需要“\r\n”(文本输出)。

编码是明确给出的。

关于java - ObjectOutputStream.writeBytes(String s) 意外的输出值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37814118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com