问题标签 [nio]
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 NIO 通道解析 StAX
我正在尝试通过 Java NIO 通道接收 XML 事件流。我对 NIO 和 StAX 解析都是新手,所以我很容易忽略一些东西:)
我的搜索使我找到了几个 SAX 和 StAX 实现,但它们似乎都在 InputStreams 和 InputSources 上运行,而不是 NIO 通道。我做过的两个最接近的尝试是从通道中获取 InputStream 并创建一个 PipedInputStream:
其次是:
当上面的代码与方法 1 一起使用时,它会阻塞在 createXMLStreamReader 行上。当使用方法 2/3 时,它们会立即抛出 IllegalBlockingModeException(我明白为什么)。也许需要一种新方法?
我的目标是让非阻塞服务器选择 => 接受来自客户端的字符数据 => 使用特定编码将其解析为 XML 事件 => 将该事件对象转发到另一个线程进行处理 => 并返回到选择。
那么我是否忽略了某些东西,还是有更好的方法可以使用?如果是这样呢?
谢谢!
java - 大ByteBuffer的BufferedReader?
有没有办法用 BufferedReader 读取 ByteBuffer 而不必先将其转换为 String ?我想将相当大的 ByteBuffer 作为文本行读取,出于性能原因,我想避免将其写入磁盘。在 ByteBuffer 上调用 toString 不起作用,因为生成的 String 太大(它抛出 java.lang.OutOfMemoryError: Java heap space)。我原以为 API 中有一些东西可以将 ByteBuffer 包装在合适的阅读器中,但我似乎找不到任何合适的东西。
这是一个简短的代码示例,说明了我在做什么):
java - JAVA NIO ByteBuffer 分配以适应最大的数据集?
我正在开发一款在线游戏,在服务器端工作时遇到了一些问题。
在 Java 中使用非阻塞套接字时,处理在所有数据可用之前无法处理的完整数据包数据集的最佳操作方案是什么?例如,通过套接字发送大型 2D 平铺地图。
我可以想到两种方法来处理它:
分配足够大的 ByteBuffer 以处理处理我的示例中的大型 2D 平铺地图所需的完整数据集。继续将读取数据添加到缓冲区,直到它全部被接收并从那里处理。
如果 ByteBuffer 的大小较小(可能为 1500),则可以完成后续读取并将其放入文件中,直到可以从文件中完全处理它。这将避免必须拥有大的 ByteBuffer,但会因为磁盘 I/O 而降低性能。
我为每个 SocketChannel 使用了一个专用的 ByteBuffer,这样我就可以继续读取数据,直到它完成处理。问题是,如果我的 2D Tiled Map 大小达到 2MB,那么使用 1000 个 2MB ByteBuffers 真的明智吗(假设 1000 是客户端连接限制并且它们都在使用中)?一定有更好的方法,我没有想到。
我宁愿保持简单,但我愿意接受任何建议并感谢您的帮助。谢谢!
java - Java 线程在调用 select() 时向选择器注册通道时阻塞。该怎么办?
我有一个基本问题。为什么以及如何 SelectableChannel 的 register 方法可以阻塞调用。让我提供一个场景。
我在类 Register 中创建了一个 Selector 对象,如下所示。
我在同一个类(Register)中也有一个方法来向选择器注册通道。
还有一个名为 Request 的类,它具有从通道读取数据、处理并调用以下方法来注册通道的方法。
此时线程被阻塞,没有给出它在等待什么的线索。我已验证选择器已打开。请为我提供一些帮助以了解如何解决此问题。有没有我可以释放的锁。
任何输入将不胜感激。
添加到我所描述的内容。进一步的测试表明,如果从同一个线程调用 Register.register 方法,它可以注册,但之后如果其他线程尝试调用该方法,则线程不会继续前进。
java - nio服务器上线程之间的静态选择器
我需要实现一个只有一个选择器(静态)的服务器;多个线程尝试将通道注册到同一个静态选择器。
我试图实现服务器,但问题是静态选择器第一次工作,即注册频道;但是在下次调用注册不同的通道时,线程被挂起。
我相信上面的解释很模糊。但请合作。任何指针将不胜感激。
java - java.net.ConnectException:调用 SocketChannel.open 时连接被拒绝
我正在尝试编写一个简单的程序来打开到本地地址的套接字通道。每当我运行此程序时,我都会收到连接被拒绝异常
我得到的例外是
我在使用 Sun Solaris 和 HP - UX 时遇到了这个问题。它似乎在 Linux 机器上运行良好。谁能告诉我为什么连接被拒绝?我做了一个 netstat -a 并确认该端口未在使用中。
提前致谢!
java - 在 Java 中,监视附加文件的最佳/最安全模式是什么?
当事件发生时,其他人的过程是通过一次附加一行来创建一个 CSV 文件。我无法控制文件格式或其他进程,但我知道它只会追加。
在 Java 程序中,我想监视这个文件,当添加一行时,读取新行并根据内容做出反应。现在忽略 CSV 解析问题。监视文件更改并一次读取一行的最佳方法是什么?
理想情况下,这将使用标准库类。该文件很可能位于网络驱动器上,因此我想要一些坚固的东西以防故障。如果可能的话,我宁愿不使用轮询 - 我更喜欢某种阻塞解决方案。
编辑 - 鉴于标准类无法使用阻塞解决方案(感谢您的回答),最强大的轮询解决方案是什么?我不想每次都重新读取整个文件,因为它可能会变得很大。
java - Java中的SocketChannel发送数据,但没有到达目标应用程序
使用 NIO 库在 Java 中创建一个简单的 ChatServer 让我很痛苦。想知道是否有人可以帮助我。我通过使用 SocketChannel 和 Selector 在单个线程中处理多个客户端来做到这一点。问题是:我能够接受新连接并获取它的数据,但是当我尝试发回数据时,SocketChannel 根本不起作用。在 write() 方法中,它返回一个与我传递给它的数据大小相同的整数,但客户端永远不会收到该数据。奇怪的是,当我关闭服务器应用程序时,客户端会收到数据。就像 socketchannel 维护一个缓冲区,它只有在我关闭应用程序时才会被刷新。
这里有一些更多的细节,给你更多的信息来帮助。我正在处理这段代码中的事件:
这段代码只是处理想要连接到聊天的新客户端。因此,客户端与服务器建立 TCP 连接,一旦被接受,它就会按照简单的文本协议向服务器发送数据,通知他的 id 并要求注册到服务器。我在方法 processIncomingDataFromNewClient(key) 中处理这个问题。我还在类似于哈希表的数据结构中保存了客户端及其连接的映射。我这样做是因为我需要从连接中恢复客户端 ID 和来自客户端 ID 的连接。这可以显示在:clientsMap.getClient(key) 中。但问题本身在于方法 processIncomingDataFromNewClient(key)。在那里,我只是读取客户端发送给我的数据,验证它,如果没问题,我向客户端发送一条消息,告知它已连接到聊天服务器。这是一段类似的代码:
最后,方法 sendMessage(SelectionKey key) 如下所示:
因此,发生的事情是服务器在发送消息时打印如下内容:
因此,它告诉它发送了数据,但聊天客户端一直阻塞,在 recv() 方法中等待。因此,数据永远不会到达它。但是,当我关闭服务器应用程序时,所有数据都会出现在客户端中。我想知道为什么。
重要的是要说客户端在 C 和服务器 JAVA 中,并且我在同一台机器上运行,在 windows 下的 virtualbox 中运行 Ubuntu 来宾。我也在 windows 主机和 linuxes 主机下运行,并且不断遇到同样的奇怪问题。
我很抱歉这个问题很长,但我已经在很多地方搜索了答案,找到了很多教程和问题,包括在 StackOverflow 上,但找不到合理的解释。我真的不喜欢这个Java NIO,我也看到很多人抱怨它。我在想,如果我在 C 语言中这样做会容易得多:-D
所以,如果有人可以帮助我,甚至讨论这种行为,那就太好了!:-)
先谢谢大家了
彼得森
java - Java - 用于非阻塞套接字的多个线程中的多个选择器
我正在编写一个 Java 应用程序,它将实例化一个类的对象,以表示已连接并注册到我的应用程序另一端的外部系统的客户端。
每个客户端对象中都有两个嵌套类,分别代表前端和后端。前端类将不断地从实际客户端接收数据,并将指示和数据发送到后端类,后端类将从前端获取数据并使用适当的格式和协议将其发送到外部系统该系统需要。
在设计中,我们希望将客户端对象的每个实例化为一个线程。然后,在每个线程内自然会有两个套接字 [EDIT],每个套接字都有自己的 NIO 通道[/EDIT],一个客户端,一个系统端分别位于前端和后端。但是,这现在引入了对非阻塞套接字的需求。我一直在阅读这里的教程,该教程解释了如何在主线程中安全地使用 Selector 来处理所有具有连接的线程。
但是,我需要的是多个选择器——每个选择器都在自己的线程中运行。通过阅读上述教程,我了解到 Selector 中的键集不是线程安全的。这是否意味着如果我尝试为每个选择器提供自己的一对套接字和通道,在他们自己的对应线程中实例化的单独选择器可能会产生冲突的键?将选择器向上移动到主线程的可能性很小,但根据我给出的软件要求,这远非理想。感谢您的帮助。
java - 用于文件系统而不是网络的 Java NIO 框架?
有几个高质量的框架隐藏了基于 NIO 的网络编程的复杂性(mina、netty、grizzly 等)。是否有类似的框架可以简化基于 NIO 的文件系统编程?
例如,作为一个学习练习,我想根据这篇(真棒!)文章实现一个磁盘支持的地图:http://www.javaworld.com/javaworld/jw-01-1999/jw-01-step。 .html _