【发布时间】:2016-10-15 07:26:50
【问题描述】:
我正在使用ObjectOutputStream 对象操作系统将字符串消息从客户端 Android 应用程序发送到 c++ 服务器。
我知道服务器必须如何接收我的消息: msg 的每个字符都存储在一个字节数组(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.
而在“我”之前,我什么也没发送。 我发送的消息是这样开始的:ISOXXXXXX
所以我想知道是否有任何方法可以检索 ObjectOutputStream.writeBytes 的真实输出。我知道它是输出,而不是输入,这仍然可以帮助我理解它是如何添加奇怪的标题的。
提前感谢您的建议
我的发送功能
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:我无法更改服务器代码。
【问题讨论】:
-
OOS 的 .writeString() 会写入修改后的 UTF,这肯定不是你想要的。另外,编码是什么? ASCII?
-
ObjectOutputStream 将 Java 对象的原始数据类型和图形写入 OutputStream
-
我使用 ASCII 编码。我发送的消息是:msg = "ISOxxxxxxxxxxxxxxp ������ÀXXXXXX��&XXXXXXX",其中 X 是数字。我只是想把它发送到服务器。并且服务器完全接收它,但似乎在开头添加了其他字符。
标签: java android objectoutputstream