Tag: nio

每个客户端模型或NIO反应器模式的旧I / O线程?

我正在编写多人游戏的服务器端网络。 该游戏是一款RPG,它拥有2000名玩家的绝对最大容量,但它实际上最多可以达到300名玩家,尽管它可能更高或更低。 在最长的时间内,每次我必须在很多客户端进行网络连接时,我都坚持使用NIO,因为它不需要使用数百个线程。 最近,我遇到了一个PowerPoint演示文稿,其中详细描述了这两个模型,它几乎使得每个客户端的模型看起来优于NIO。 我还发现了一些地方,它表明老IO实际上也可以胜过NIO。 PowerPoint可以在这里找到(它有点旧): http : //www.mailinator.com/tymaPaulMultithreaded.pdf 。 我还没有写任何内容,所以如果我不得不改变整个网络设计,那么从一开始就不会有问题。 我没有时间压力。 最初,我正在使用NIO设计反应器模式实现(选择一个事件,调度一个处理事件的处理程序)。 更多信息可以在这里找到: http : //en.wikipedia.org/wiki/Reactor_pattern 我的整个reactor实现旨在使用单个线程。 由于我读到旧的IO可以超越,它实际上让我处于两难境地。 我不想设计一个复杂的NIO系统,只使用多个线程来充分利用所有的CPU能力,但我也畏惧让一个应用程序使用300多个线程的想法。 哪种设计适合我的目的? 每个客户端的线程优势在于它真正使用了所有CPUfunction本质上,但同时,它使系统陷入困境。 更不用说,单个线程的堆栈大小占用了大量内存(乘以几百倍)。 我应该坚持反应堆模式吗? 我知道这个问题有点含糊不清,但我觉得我需要专门针对我的情况问一个问题,因为我在这个网站上找不到问题,也没有找到解决我的问题的网站。 有一个关于游戏,但该游戏旨在处理成千上万的玩家。 非常感谢! 如果您需要任何澄清,请询问!

在Netty 4.0中创建一个ByteBuf

两个简单的问题,我无法通过文档中的解决方案解决这些问题: 我有’byte []’。 如何将其转换为ByteBuf? 我有一个NIO’ByteBuffer 如何将其转换为ByteBuf?

我应该如何使用AsynchronousServerSocketChannel接受连接?

我想用Java 7和NIO 2编写一个异步服务器。 但是我应该如何使用AsynchronousServerSocketChannel ? 例如,如果我开始: final AsynchronousServerSocketChannel server = AsynchronousServerSocketChannel.open().bind( new InetSocketAddress(port)); 然后,当我执行server.accept() ,程序终止,因为该调用是异步的 。 如果我将该代码放在无限循环中,则抛出AcceptPendingException 。 有关如何使用AsynchronousServerSocketChannel编写简单异步服务器的任何建议? 这是我的完整示例(类似于JavaDoc中的示例): import java.io.IOException; import java.net.InetSocketAddress; import java.nio.channels.AsynchronousServerSocketChannel; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.CompletionHandler; public class AsyncServer { public static void main(String[] args) { int port = 8060; try { final AsynchronousServerSocketChannel server = AsynchronousServerSocketChannel.open().bind( new InetSocketAddress(port)); System.out.println(“Server listening […]

2011年的Java:线程套接字VS NIO:在64位操作系统和最新的Java版本上可以选择什么?

我在StackOverflow和一些博客上阅读了几篇关于java.net vs java.nio的post。 但我仍然无法理解何时应该更喜欢NIO而不是螺纹sockets。 你能否在下面检查我的结论并告诉我哪些不正确以及哪些错过了? 因为在线程模型中,您需要为每个活动连接专用一个线程,并且每个线程为其堆栈提供大约250千字节的内存,使用每插槽线程模型,您将在大量并发连接上快速耗尽内存。 与NIO不同。 在现代操作系统和处理器中,可以认为大量活动线程和上下文切换时间对于性能几乎无关紧要 NIO的整个吞吐量可能更低,因为异步NIO库在高负载环境中使用的select()和poll()比唤醒和放入hibernate线程更昂贵。 NIO一直比较慢,但它允许您处理更多的并发连接。 它本质上是一个时间/空间权衡:传统IO速度更快但内存占用更大,NIO速度更慢但使用的资源更少。 Java每个并发线程的硬件限制为15000/30000,具体取决于JVM,这会将每个连接模型的线程限制为此并发连接数最大,但JVM7将没有此限制(无法确认此数据)。 所以,作为结论,你可以这样: 如果你有数万个并发连接 – 除非请求处理速度是你的关键因素,否则NIO是更好的选择 如果你的数量少于 – 每个连接的线程是一个更好的选择(假设你可以负担大量的RAM来保持所有并发线程的堆栈达到最大值) 使用Java 7,您可能希望在任何一种情况下都使用NIO 2.0。 我对么?

如果有足够的数据,FileChannel.read会读取比指定的更少的字节吗?

例如,我有一个文件的内容是: abcdefg 然后我使用以下代码来读取’defg’。 ByteBuffer bb = ByteBuffer.allocate(4); int read = channel.read(bb, 3); assert(read == 4); 因为文件中有足够的数据所以我可以这样想吗? 我是否可以假设只有当文件中没有足够的字节时,该方法才会返回小于给定缓冲区限制的数字?

使用java来修改文件内容

我需要就地修改文件的特定内容。 我不想创建一个新文件并重写旧文件。 文件也很小,每个最大只有几MB。 对于那些想知道的人(虽然我不确定这是否与OP有关),我需要修改属于版本控制的文件并需要修改只读版本。 在适当的位置进行修改要简单得多。 Java apis可以实现吗? 如果不是,有一个图书馆提供这个?

Java中的可迭代gzip deflate / inflate

对于隐藏在互联网中的ByteBuffers而言,是否存在用于gzip-deflating的库? 是什么让我们可以推送原始数据然后拉出缩小的数据? 我们已经搜索过它,但只找到了处理InputStreams和OutputStreams的库。 我们的任务是创建gzipfilter,用于在管道体系结构中缩小ByteBuffers流。 这是一种拉结构,其中最后一个元素从早期元素中提取数据。 我们的gzipfilter处理ByteBuffers流,没有单个Stream对象可用。 我们已经玩弄了将数据流调整为某种InputStream然后使用GZipOutputStream来满足我们的要求,但适配器代码的数量至少令人讨厌。 接受后编辑 :为了记录,我们的架构类似于GStreamer等。

java.lang.UnsupportedOperationException:’posix:permissions’不支持作为Windows上的初始属性

我正在使用Java 7 File API。 我编写了一个在Ubuntu上完美地创建目录的类,但是当我在Windows上运行相同的代码时,它会抛出错误: Exception in thread “main” java.lang.UnsupportedOperationException: ‘posix:permissions’ not supported as initial attribute at sun.nio.fs.WindowsSecurityDescriptor.fromAttribute(Unknown Source) at sun.nio.fs.WindowsFileSystemProvider.createDirectory(Unknown Source) at java.nio.file.Files.createDirectory(Unknown Source) at java.nio.file.Files.createAndCheckIsDirectory(Unknown Source) at java.nio.file.Files.createDirectories(Unknown Source) at com.cloudspoke.folder_permission.Folder.createFolder(Folder.java:27) at com.cloudspoke.folder_permission.Main.main(Main.java:139) 我的文件夹类代码是 package com.cloudspoke.folder_permission; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.attribute.FileAttribute; import java.nio.file.attribute.PosixFilePermission; import java.nio.file.attribute.UserPrincipal; import java.util.Set; public class Folder{ […]

Java:如何使用nio Path规范化路径?

关于java.io.File一个非常好的事情是它可以将路径规范化为可预测的格式 。 new File(“/”, inputPath).getPath()始终返回一个字符串,其相对路径已标准化,并始终以可预测的路径分隔符开头和结尾。 有没有办法用新的nio Path或Paths类做到这一点? (另请注意,我正在处理其他系统的抽象路径,这与任何本地文件系统无关) 我想要的更多行为示例: – “/foo” -> “/foo” – “//foo/” -> “/foo” – “foo/” -> “/foo” – “foo/bar” -> “/foo/bar” – “foo/bar/../baz” -> “/foo/baz” – “foo//bar” -> “/foo/bar”

Java InputStream大小

我需要获取InputStream的大小(以字节为单位)而不创建File实例。 有没有办法使用Java NIO?