问题标签 [objectoutputstream]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
7343 浏览

java - 无法在 Android 平台上为蓝牙套接字创建带有 InputStream 的 ObjectInputStream

我正在为 Android 手机编写多人游戏。通信是通过蓝牙进行的。我已经设法使用输入/输出流将字节从一部手机发送到另一部手机。因为我需要能够传输对象,所以我想要对象流。但是,当我尝试使用我的流创建一个 Objectstream 时,我的程序会挂在指令上。

//指令 new ObjectInputStream(mmInStream) NEVER FINISHES EXECUTING . 它似乎不会引发错误,因为我会抓住它。它只是挂在这个指令上。这行下面的代码都没有被执行过。

我究竟做错了什么?

0 投票
2 回答
1437 浏览

java - 当必须接受许多连接时,我在客户端/服务器类型应用程序中遇到 Java 套接字问题

首先,感谢您的阅读。这是我第一次以用户身份使用 stackoverflow,尽管我一直在阅读并找到有用的解决方案:D。顺便说一句,对不起,如果我解释得不够清楚,我知道我的英语不是很好。

我的基于套接字的程序有一个奇怪的行为,以及一些性能问题。客户端和服务器通过以多线程方式将序列化对象读/写到对象输入和输出流中来相互通信。让我向您展示代码基础知识。我已将其简化为更具可读性,并且故意省略了完整的异常处理。服务器的工作方式如下:

服务器:

LjServerThread 类,每个客户端创建一个实例:

而且,客户端是这样的:

好吧,如您所见,在服务器端处理接受的客户端的 LjServerThread 类测量它所花费的时间......通常,它需要 75 - 120 毫秒(其中 x 是 IP):

  • 客户端 x 成功完成。
  • 运行时间:82
  • 客户端 x 成功完成。
  • 运行时间:80
  • 客户端 x 成功完成。
  • 运行时间:112
  • 客户端 x 成功完成。
  • 运行时间:88
  • 客户端 x 成功完成。
  • 运行时间:90
  • 客户端 x 成功完成。
  • 运行时间:84

但突然间,没有可预测的模式(至少对我来说):

  • 客户端 x 成功完成。
  • 运行时间:15426

有时达到25秒!偶尔一小群线程会慢一点,但这并不让我担心:

  • 客户端 x 成功完成。
  • 运行时间:239
  • 客户端 x 成功完成。
  • 运行时间:243

为什么会这样?这可能是因为我的服务器和我的客户端在同一台机器上,具有相同的 IP?(要进行此测试,我在同一台机器上执行服务器和客户端,但它们使用我的公共 IP 通过 Internet 连接)。

这就是我测试的方式,我在 main() 中向服务器发出这样的请求:

如果我在没有“Thread.sleep(100)”的情况下循环执行,我会收到一些连接重置异常(7 或 8 个连接重置为 400,或多或少),但我想我明白为什么会发生这种情况:当 serverSocket.accept () 接受一个连接,需要花费很短的时间再次到达 serverSocket.accept() 。在此期间,服务器无法接受连接。会不会是因为这个?如果不是,为什么?很少有 400 个连接同时到达我的服务器,但它可能会发生。如果没有“Thread.sleep(100)”,时间问题也会更糟。

提前致谢!


更新:

多么愚蠢,我在 localhost 中对其进行了测试......它没有给出任何问题!有无“Thread.sleep(100)”,没关系,它工作正常!为什么!所以,正如我所看到的,我关于为什么连接重置被抛出的理论是不正确的。这让事情变得更加奇怪了!我希望有人可以帮助我...再次感谢!:)


更新(2):

我在不同的操作系统中发现了明显不同的行为。我通常在 Linux 中开发,我解释的行为是关于我的 Ubuntu 10.10 中发生的事情。在 Windows 7 中,当我在连接之间暂停 100 毫秒时,一切正常,并且所有线程都快速点亮,没有人花费超过 150 毫秒左右(没有连接速度慢的问题!)。这不是在 Linux 中发生的事情。但是,当我删除“Thread.sleep(100)”时,不是只有一些连接获得连接重置异常,而是所有连接都失败并抛出异常(在 Linux 中只有其中一些,400 个中有 6 个左右)失败了)。

呸!我刚刚发现不仅操作系统,JVM 环境也有一点影响!没什么大不了的,但值得注意。我在 Linux 中使用 OpenJDK,现在使用 Oracle JDK,我发现随着我减少连接之间的睡眠时间,它开始更早地失败(50 毫秒 OpenJDK 工作正常,没有抛出异常,但 Oracle 的一个相当不错很多有 50 毫秒的睡眠时间,而有 100 毫秒的工作正常)。

0 投票
1 回答
2811 浏览

java - ObjectOutputStream 和 java.io.StreamCorruptedException

当我尝试使用 ObjectOutputStream 从我的客户端向服务器发送一个自定义对象(参见 Content.java)时,在发送第一个对象后我得到了 StreamCorruptedException。因此,如果我尝试发送另一个对象,我会得到异常,(它第一次起作用)。我用谷歌搜索并阅读了很多东西,现在我要放弃了,所以我请求你的帮助。

客户端.java

内容.java

堆:

编辑:添加 ClientActivity.java ClientActivity.java

}

服务器.java

连接.java

服务器活动.java

0 投票
3 回答
217 浏览

java - 通过带有对象输入/输出流的 Socket 发送的对象的大小真的很重要吗?

在每次单独调用ObjectOutputStream#writeObject之后刷新 OutputStream比在一系列对象写入之后刷新流是否更有效?(例如:写入对象并刷新 4 次,或者写入 4 次然后仅刷新一次?)

ObjectOutputStream如何在内部工作?

0 投票
4 回答
43724 浏览

java - JSONObject 不可序列化?

我正在尝试序列化 JSONObjects 的 ArrayList。但我得到了错误:

这是我的序列化和反序列化代码:

0 投票
1 回答
1195 浏览

java - java:在运行时跟踪文件大小?

我编写了一个将压缩对象写入文件的代码,我的问题是:有没有一种方法可以跟踪文件大小的增量作为正在写入的对象?这是我的代码:

我尝试flush在 every之后使用oos.writeObject(str);,然后通过 using 获取文件大小outFile.length(),但无论我刷新多少,文件大小都保持不变,直到最后一次跳转到最终大小。无论如何我可以解决它?谢谢

0 投票
2 回答
2546 浏览

java - 使用 ObjectOutputStream 返回一个对象

我发现一段 java 代码声称使用 ObjectOutputStream 返回对象

response 是一个 HttpServletResponse 对象。我想知道这段代码是如何工作的,以及如何测试它?

0 投票
1 回答
151 浏览

java - 不断收到 ionotseriaizableexception,我做错了什么?

所以,我有一个具有以下属性的类

所有这些都已经初始化,然后在上面我声明 public class Motor extends AbstractTableModel implements Serializable 了,但是当我使用 ObjectOutputStream 时我仍然得到一个 IONotSerializableException,是否有一些限制,我现在可能知道这就是为什么它会这样?

0 投票
1 回答
5035 浏览

java - 可序列化类出错

我有一个 java 服务器,它通过一个套接字将一些数据发送到一个用 android 开发的客户端。发送的数据被序列化......并且在客户端尝试从 ObjectInputStream 读取时出现以下错误:

现在这是我在服务器端的代码:

在客户端我有这个:


这是我的可序列化类,我在客户端和服务器端都有它:


这个类的一个实例是我通过套接字发送的。


编辑:

在服务器上我有以下内容:

包服务器;

导入 java.io.Serializable;

公共类坐标实现可序列化{

在客户端,我有以下内容:

包 com.Server_1;

导入 java.io.Serializable;

公共类坐标实现可序列化{

我不明白我怎么能把两个包都改成一样的!!!!!!

0 投票
1 回答
84 浏览

c++ - 从 2 个部分正确打印出整数

我有一个uint128_t将其值存储为的类,uint64_t UPPER, LOWER;我不知道如何重载,operator<<以便当我传入时std::cout,该值将以十进制正确打印。目前,我只是在做

我应该怎么办?

编辑:

例子:

如果 uint128_t 变量具有UPPER = 1and LOWER = 1,我希望流包含十进制值(1 << 64) + 1