问题标签 [datainputstream]
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.
java - 中断 Java DataInputStream readFully()
我有一个从服务器流式传输视频 (MJPEG) 的 Java 小程序。我用 C#(Windows 服务)编写了一个代理服务器,用于放置在小程序和多个视频服务器之间。HTML/CSS/Js 前端与 Java 小程序一起使用。所有功能都可以正常工作(终于!!!),除了一件事。
视频服务器允许您通过 REST 接口播放录制的视频。剪辑完成后,服务器会保持连接打开,以防您要向其发送诸如倒带或搜索之类的命令。剪辑在小程序中播放良好,直到结束。如果您尝试开始一个新剪辑(这需要从 Javscript 向小程序发送命令),浏览器会冻结。但是,使用相同连接的后续命令会起作用,例如播放、暂停和搜索。如果我停止 Windows 服务,浏览器会再次响应。
这就是我假设正在发生的事情:剪辑结束(或暂停);不再发送数据,但连接仍处于活动状态。小程序在代理上等待下一帧,但代理在视频服务器上等待下一帧,不会再发送任何数据。
这是读取每一帧的while循环中的代码
我需要以某种方式中断这段代码。
当在 HTML 前端选择一个新的视频剪辑时,我们会通知小程序,它会调用 CameraStream 类的 disconnect()。这就是那个功能:
为了测试这一点,我让一个快速剪辑播放并运行到最后。然后我选择一个新剪辑。在我的 Java 控制台中,我得到了输出disconnect called.
,但没有得到后续closed.
消息,也没有捕获到通用异常。当我停止 Windows 服务时,我终于收到了closed.
消息,所以看起来像是inputStream.close();
被阻塞了。
所以我想我的问题是如何停止阻塞?通话是否被readFully(img)
阻塞?或者它是断开功能(如我得到的控制台输出所建议的那样)?
编辑:澄清一下,我编写了 Java 小程序、HTML、CSS、Javascript 和 C# 代理服务器,因此我可以访问所有这些代码。我无法修改的唯一代码是视频服务器上的 REST 接口。
edit2:我打算为这篇文章提供赏金https://stackoverflow.com/questions/12219758/proxy-design-pattern
java - 从 DataInputStream 中读取一个 int[]
我正在寻找一种从 DataInputStream 读取大量整数并将它们加载到数组中的方法。我确切地知道我需要阅读多少int
s,但是如果有一种比简单迭代更简洁的方法会很好。
已经有一种方法可以使用字节数组执行此操作,只需使用该DataInputStream#read(byte[])
方法,但没有等效的int[]
. 我显然可以通过创建一个长度乘以四的字节数组将数据读入一个字节数组,但我确实需要int
s 中的数据。
在我看来,我可以使用三种可能性:
- 不知何故,将数据直接加载到
int[]
. - 以某种方式将 a
byte[]
转换为int[]
. - 遍历数组并使用
readInt()
.
虽然前两种解决方案更受欢迎,但我目前也不知道有什么办法。有没有简单的方法可以在没有迭代的情况下做到这一点?
java - 使用 readDouble 从套接字输入读取 Double + EOL
好吧,我在这里变得绝望了。我一直在寻找这个问题的答案,现在持续了 4 个小时,但没有运气。这是我正在做的事情的要点。我有一个通过套接字连接到另一台设备的 android 应用程序。我的输出流工作正常(连接的设备可以正确接收我发送的字节值 - 所以如果我向设备发送 10,它会看到 10)。另一方面,我的应用程序在向设备发送命令时接收输入。设备看到命令并发送回一个结构为 [DOUBLE+EOL] 的数据包。EOL 特别是 0x0A - '\n'。
我能够毫不费力地使用python进行此操作。但是,我是 Java 新手,还没有完全弄清楚这一点。我已经尝试了很多东西,现在正在使用DataInputStream(socket.getInputStream())
. 我尝试使用 BufferedReader 但我无法将字符串转换为我想要的双精度。这是我试图开始工作的重要通信代码:
命令“40”只是告诉设备发送上面指定格式的数据包。catch ( Throwable t )
在我弄清楚我正在使用什么之前,这只是一个替身(因此我可能会遇到什么样的错误 - 最初这在我尝试使用时捕获了转换类型错误 Double.parseDouble() )。
那么,现在发生了什么?我的TextView“left_servo_pos_view”中显示了许多不同的值。它们都以“e-312”周围的东西结束,这告诉我 .readDouble() 方法只是在它通过时抓取流的一部分(所以它获取了我发送的实际 Double 值的一部分,而不是整件事情)。
这就是我的问题。我可以根据需要提供其他详细信息(我不确定还有什么对您有帮助)。正如我所说,除了这部分之外,一切似乎都在工作(这就是为什么我没有提供初始化代码或其他任何类似设置通信的函数的原因)。我可以将 input_stream 类型更改为任何必要的类型(就像我说的那样,我尝试了 BufferedReader,但运气不佳,现在我回到了 DataInputStream。
谢谢!
编辑:
我最终以与我预期完全不同的方式解决了这个问题。在对控制器的输出进行数据包捕获后,结果发现数据以“小端”风格出现(仍然不确定为什么,猜测这就是控制器实现它的方式)。所以,我在网上找到了一个 Little Endian InputStream 类,我实现并几乎解决了这个问题。第一个值是正确的,然后它需要 8 个以上的值才能再次正确。所以,我认为数据包中缺少一些东西,经过仔细检查,最后有一个额外的字节“00”。所以,我在我的代码中添加了“skipBytes(1)”,它现在可以正常工作了。
java - 当两个线程从 datainputstream 读取时达到 EOS
我正在编写一个程序,其中一个程序创建一个线程,该线程又从套接字读取,我的问题是当创建两个线程时,都从数据输入流中读取。一个线程正确读取,而另一个线程遇到 EOS 并返回 -1 作为读取的字节数。我已经同步了我的运行方法
java - Java DataInputStream 到图像文件
我正在做作业,我必须连接到 http 服务器并使用套接字编程下载 html 文件和图像文件。
我做得很好,能够正确下载和编写 html 和图像文件。但是当我编辑代码以满足作业的要求时(网页必须在本地工作,所以编辑代码以重写html,图像文件没有被正确写入。
我不记得编辑下载图像的方法的代码。当我认为我完成时,我刚刚检查了我的文件,并且图像显示无效图像。
字节(当我在记事本++中并排打开正确的图像和下载图像时),字节是相同的。问题是在下载的图像上,字节被写入一个长行,而在正确的图像中,字节是逐行写入的。
尝试了几种不同的方法,都没有奏效。事实上,我发送给朋友的旧代码(在上面的编辑之前)似乎也不起作用。有任何想法吗?
谢谢你的帮助!
java - 我无法从网站获取所有字节
我正在尝试从网站读取所有字节,但我认为我没有得到所有字节。我给字节数组长度一个很高的值。我使用了这种方法,但它总是返回异常。
这是代码:
编辑版本:
java - Android Java - DataInputStream 从套接字到字符串
我在编写一个可以与我的服务器通信以发送和接收数据的 android 应用程序时遇到了一些麻烦。所以它的要点是我的服务器是用 Qt C++ 编写的,当然,我的应用程序是用 java 为 android 编写的。让套接字数据采用适当的格式以供双方充分理解,这引起了很多复杂性。
那么我遇到的问题是我的客户端(java android)可以连接到服务器,发送少量数据,并从服务器接收响应。服务器发送一个相当大的数据消息,转换为 UTF-8 字节。
msg 是传递给函数的 QString。
在客户端,收到消息后,我有:
所以问题是在我的程序的不同实例上,转换为 String 的字节的结果不同。
Log.d 打印响应的结果大约是正确格式化为字符串的字符串的 1445 个字母(2890 字节),然后字符串的其余部分以“??”结尾 人物。
我很少按预期收到完整的消息,没有“?” 人物。有时我会得到更长的消息正确地转换为字符串。大多数情况下,我只得到正确投射的 1445 个字母,其余的都是“??” 人物。
我有另一个 Windows 计算机客户端(也是用 Qt C++ 编写的),它总是让消息完整并且没有这个问题,所以我很好奇 android 字符串和编码是否存在可能导致这个问题的东西。起初我认为这可能与字符串的内存分配有关,但我很确定我已经通过设置大小正确处理了这个问题。
java - deprecated readLine() What to change?
I'm a Java beginner, trying to get this to work in Eclipse. However, the readLine
is struck through and a notice says it is deprecated. The code works, albeit not the while ((var2 = var5.readLine()) != null) {
bit ... So I'm wondering how to fix it.
java - 如何等待文件中的数据可用而不是获取 EOFException
我正在使用文件显示流内容来缓冲它(因为它可能足够大以将其保存在 RAM 中)。我有两个线程:第一个从服务器下载文件并将其写入本地存储,第二个读取该文件并显示内容。
问题是,当第二个线程到达文件末尾时,从方法EOFException
中抛出。DataInputStream.readFully()
有没有办法让它在第一个线程写入足够的数据而不是抛出异常时等待?
java - 使用 DataInputStream 从 TCP 套接字读取的字节前不需要的 nul 字符
我正在编写一个涉及连接到 TCP 服务器(我也写过)并从中发送/接收文本的 Android 应用程序。现在我的最终阅读(客户端)中有一个错误。
当我在 Eclipse 中使用调试器时,它显示我正在接收发送的所有字节,但是对于某些文本,如果我期望n字节,我将得到第一个n - k,一些m NUL 字节,然后是最后的k - m个有意义的字节。如果我正确地解释了这个问题,Java 会看到大量的 0 并决定在之后没有任何有用的内容可供读取(调试器显示字节数组和它转换为的字符串,但如果我尝试则将其丢弃进一步检查)。
我怎么能忽略 NUL 的大量涌入而只阅读重要的东西?
这是正在编写的服务器代码: