- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 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/
我正在尝试按照只能处理 GET 查询的指令编写一个最简单的 Java Web 服务器程序。主要思想是从套接字获取一个ObjectOutputStream,使用ObjectInputStream打开本地
我曾经使用带有 Java 的 Android Studio 在 Android 中保存项目。但是现在我想在我用 Flutter SDK(Dart 语言)重写的应用程序中准确地读取这些数据。但似乎编写的
我正在尝试使用 ObjectOutputStream 将几个对象写入文件。之后,我使用 ObjectInputStream 读取该文件。问题是,我只能读取文件中的第一个对象。当我用 Notepad++
我在解决一个实现问题时遇到了麻烦,我有一个类,它的行为类似于列表,但不是将文件保存在某个集合中,而是将它们保存在磁盘上。 当我想向列表中添加一些元素时,就会出现问题。在文件的开头,我有一个 int 告
有没有办法强制 ObjectOutputStream 不依赖以前的写入,应该每次都写入对象属性和完整信息? 我可以从二进制文件中看到,它只写入以前版本的某种增量,如果您尝试加载随机项,它会失败? 最佳
客户端代码: try { Socket socket = new Socket(ip, port); OutputStream output = soc
Socket Client = new Socket("ip", port); private ObjectOutputStream out; out = new ObjectOutputStream
通过 ObjectOutputStream 发送自制对象时,该对象的服务器类和客户端类必须相同吗? 例如,当某个Action只能在服务器上执行时,因为它需要其他几个仅在服务器上可用的类,那么客户端上的
我的项目由两部分组成:服务器端和客户端。当我启动服务器端时,一切正常,但是当我启动客户端时,我会收到此错误: java.io.IOException: stream active at jav
我有这三个类(class): 命令: package pack; public abstract class Command impements java.io.Serializable {
在我的软件中,我需要通过 ObjectOutputStream 在客户端和服务器之间发送消息。 sender方法的核心如下: .... try { objWriter.writeUnshare
我想向文件添加大量数据。我定义了 HYB 类,因为我的对象包含不同类型的数据(String 和 byte[])。我使用 ObjectOutputStream 和 ObjectInputStream 来
我目前正在学习网络,特别是客户端服务器类(class)。我做了很多研究并实现了各种测试程序,但我无法弄清楚为什么/何时需要使用flush()方法。 总是由输入流读入,怎么可能会有数据误留在输出流中呢?
我正在开发 Android 应用程序,我想提交用户名和密码。我现在正在做的是: 为密码创建哈希值 通过 HTTP 请求连接到身份验证服务器 通过 ObjectOutputStream 发送用户名/哈希
我有一个使用 SSLSocket 连接到服务器的客户端。接下来,我尝试使用 ObjectOutputStream oos = new ObjectOutputStream(sslsocket.getO
这个问题在这里已经有了答案: StreamCorruptedException: invalid type code: AC (1 个回答) 关闭 5 年前。 我试图通过单个 发送不同类的多个可序列
我见过一些人问过类似的问题,但任何人发布的唯一答案是你不应该这样做。 但我已经对这两种方式进行了测试 - 它只适用于这种方式。 服务器端 try { // Obtain inp
我正在尝试编写一款地下城大师游戏,英雄将穿过不同的房间并与怪物战斗并获取元素。我想每次英雄达到新级别时都保存它,但即使我已经在英雄及其使用的所有内容上实现了可序列化,我还是收到了IOException
我正在尝试构建一个客户端-服务器 IDE,但在从内存中编译/运行类获取运行时异常的错误日志/异常日志时遇到问题。 我的代码如下所示: public class ServerThread impleme
我在处理之前提出的 question 时遇到了这个问题。 这可能特定于 ObjectInputStream 而不是一般的二进制读取,因此标题可能具有误导性。 从那里开始的问题基本上是这样的:作者已经将
我是一名优秀的程序员,十分优秀!