问题标签 [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:将 String 与 ByteBuffer 相互转换以及相关问题
我正在使用 Java NIO 进行套接字连接,并且我的协议是基于文本的,因此我需要能够在将字符串写入 SocketChannel 之前将它们转换为 ByteBuffer,并将传入的 ByteBuffer 转换回字符串。目前,我正在使用以下代码:
这在大多数情况下都有效,但我质疑这是否是执行此转换的每个方向的首选(或最简单)方法,或者是否有其他方法可以尝试。即使每次转换完成时我都使用一个新的 ByteBuffer 对象,有时,并且看似随机地调用encode()
并decode()
会引发
异常或类似情况。java.lang.IllegalStateException: Current state = FLUSHED, new state = CODING_END
我需要同步这些方法吗?有更好的方法在字符串和字节缓冲区之间进行转换吗?谢谢!
java - Java:SelectionKey.attach() 坏了吗?
在我的 Java NIO 实现中,我无法让 SelectionKey.attach() 工作。基本上,一旦客户端连接(OP_ACCEPT 兴趣操作),我将它们添加到映射中,其中它们的 IP 地址映射到维护客户端状态的对象。然后,当发生 OP_READ 时,我再次检索客户端的 IP 地址,这次从映射中获取值并以这种方式获取客户端的状态对象。
这里的问题是,每次从网络读取数据时,我都必须进行地图查找。那里有很多浪费的工作。因此,我很高兴看到您可以将任意对象类型附加到 SelectionKey,当您调用 SelectionKey.attachment() 时应该很容易检索到,即使我们现在正在处理不同的事件(在 OP_READ 期间检索而不是放入在 OP_ACCEPT 期间映射)。
问题是它不起作用。当我检索附件时,它始终为空。如果我通过 attach() 设置附件,然后立即调用 attachment(),它确实有效。不知何故,在不同的事件之间,它失去了关联。
对不起,我的代码在这里发布有点长,但是如果您查看此线程中的评论: 链接文本 ...您会看到其他一些人基本上得出了相同的结论:即 attach() 和attachment() 不起作用,而且从来没有。
是否有让它工作的技巧,或者我是否坚持在每次有新的读取事件要处理时手动在地图中进行查找所必需的邪恶开销?
最后,有没有办法在一个新的子类中“包装”SelectionKey 来正确处理attach() 和attachment()?
谢谢!
java - Java NIO:读取可变大小的块
我想从一个给定字节长度的 TCP 流中读取一个字符串,然后是实际数据。在 Python 中,我会做
我如何在 Java NIO 中做同样的事情?我有一个缓冲区(容量为 257)
不幸的是,这不起作用: get() 调用读取缓冲区中的数据:-(
我可能需要翻转、倒带、重置等的某种组合,但我无法弄清楚。
java - Selector.close 在 AIX 平台上抛出 java.util.ConcurrentModificationException
我正在使用 java nio 选择器,并且在调用 selector.close 时似乎在我的应用程序中随机但一致地遇到了以下问题。我的应用程序中的单个线程正在访问选择器对象。相同的应用程序在 Solaris、Linux 和 Windows 上运行良好。我觉得这是 Selector 的 AIX 实现的问题
java版本
任何指针表示赞赏,
提前致谢,
维杰
java - 使用可选文件通道进行多文件收集
我实现了一个多文件收集器输入流,它能够从以前分散的文件段中读取和组合数据。但是,当前版本使用 RandomAccessFile 和固定大小的 ExecutorService,并且 CPU 开销很大。我想避免这些 I/O 线程并执行基于单线程选择器的方法。不幸的是,FileChannel(或 JDK7 的 Path.newByteChannel())是不可选的。有没有办法以 NIO 的方式收集数据?
java - Java nio,检查通道是否准备好进行读取,写入
而不是以通常的方式使用选择器,可以为每个准备好的通道确定并发送消息,我想选择当前准备好的任何连接并在那里发送消息。
大概这可以通过将所有通道放入一个选择器中进行读取,并在它们出现时将它们标记为准备读取,然后对写入执行相同的操作,然后从我标记为就绪的通道中进行选择。
这是一个好主意吗,有没有更好的方法来做到这一点,我应该注意什么?例如,Rox 教程指出“如果您尝试混合使用 OP READ 和 OP WRITE,您很快就会陷入困境。如果您这样做,Sun Windows 实现已被视为死锁。” 这里有类似的陷阱吗?最好的实施方式是什么:
java - 如何在套接字通道中发送和接收序列化对象
我想通过套接字通道传输序列化对象。我想将“嗨朋友”字符串作为序列化对象,然后将此对象写入套接字通道,而在另一端我想读取相同的对象并检索数据。
所有这些我想用 Java 做的事情SocketChannel
。这该怎么做?我已经尝试如下,但没有在接收方获得任何数据。
java - NIO 实施的最佳模型?
我正在将我们的 java 代码转换为使用 NIO,但我不确定设计它的最佳方式。
我最初的方法是创建一个选择器线程池。线程根据需要启动/终止,并且在以循环方式连接/接受通道时将通道注册到选择器线程。从那里,每个线程在 select() 上阻塞,并且当被唤醒时,将运行与具有选定键的每个通道相关联的适当回调。
除了这种“多选择器线程”设计之外,我还看到有人说要使用单个选择器线程和一个调度线程池。当准备好执行 IO 操作时,选择器会通知调度程序线程,然后调度程序线程会处理请求。这种模型的好处是不会阻塞 IO 线程,但现在我们将所有 IO 强制到单个线程中并在调度程序中处理同步/事件队列。
此外,我将无法使用单个直接字节缓冲区来读取每个通道,将其直接传递到回调中。相反,每次读取到数组并重置时,我都必须将数据复制出来。(我认为..)
实现这一点的最佳方法是什么?
java - Java Selector NIO 读取问题
相关代码——注意指令只是一个类,它有几个对数据进行操作的方法。创建一个新线程对读取的数据进行操作。
阅读主题:
阅读频道
然后新线程调用更多Instructions
方法。
当 ins 函数完成时,它可能会写入 Writer:
我可以确认我的客户(Flash 电影),然后接收并处理输出。
最后,w
退出。
然而,在收到来自客户端的第一条消息并成功处理之后,READ THREAD
循环不再处理更多消息。我相信密钥已在选择器中注册并准备好阅读。我已经通过循环所有键来检查它们是否可以在通道上使用 isReadable 和 isRegistered 读取,并且结果在迄今为止的所有情况下都是正确的。但是,当从客户端发送第二条消息时,我在读取线程中看到的唯一响应是“。” 字符不是每半秒打印一次,而是不断加快。那么,我相信数据在通道中,但由于某种原因,选择器没有选择任何键。
谁能帮我?
java - Java 可序列化、ObjectInputstream、非阻塞 I/O
我刚刚开始使用 Java 序列化,我不清楚在具有非阻塞 I/O 的场景中应该如何从源获取对象。
我能找到的所有文档都建议使用 ObjectInputStream 是读取序列化对象的正确方法。但是,正如我提到的,我正在使用 java.nio 并执行非阻塞操作。如果 readObject() 将阻塞直到有新对象可用,这对我没有帮助
总结 .. 使用 Java NIO 时如何进行序列化?