Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的事件驱动服务器_Java_Events_Network Programming_Nio_Socketserver - Fatal编程技术网

Java中的事件驱动服务器

Java中的事件驱动服务器,java,events,network-programming,nio,socketserver,Java,Events,Network Programming,Nio,Socketserver,我正在尝试编写一个事件驱动的HTTP web服务器。因为我将只使用一个线程,所以事件必须排队并异步处理(我也使用JavaNIO)。然而,我只停留在最初的步骤。我已经打开了一个服务器socketchannel。我不知道在收到请求时如何获得新的SocketChannel连接。是否有可以通过Java访问的操作系统队列?(我不确定Java是否独立于操作系统)我不想使用任何阻塞调用 如果我走错了方向,我们将不胜感激 谢谢。您需要: 创建一个选择器 将ServerSocketChannel置于非阻塞模式

我正在尝试编写一个事件驱动的HTTP web服务器。因为我将只使用一个线程,所以事件必须排队并异步处理(我也使用JavaNIO)。然而,我只停留在最初的步骤。我已经打开了一个
服务器socketchannel
。我不知道在收到请求时如何获得新的
SocketChannel
连接。是否有可以通过Java访问的操作系统队列?(我不确定Java是否独立于操作系统)我不想使用任何阻塞调用

如果我走错了方向,我们将不胜感激

谢谢。

您需要:

  • 创建一个选择器
  • 将ServerSocketChannel置于非阻塞模式
  • 使用
    OP\u ACCEPT
  • 编写一个select()循环,可以在NIO教程中找到
在select()循环中,您将找到
isAcceptable()
返回true的键:这意味着您需要调用ServerSocketChannel.accept()来接受连接。返回一个
SocketChannel
,然后必须将其置于非阻塞模式,并使用
OP\u READ
注册

反过来,这将导致
isReadable()
返回true的键:这意味着您应该读取相关的
SocketChannel。


您将在NIO教程中找到所有这些的示例。它变得比这复杂得多;-)

您可能想看看Apache Mina:这是一个简化套接字处理的项目,他们的页面中也有服务器和客户端示例。为什么不投票,这是一个很好的高级设计问题。如果您使用NIO,那么您根本就不使用服务器套接字和套接字。没有以前研究的真实证据。这不是一个真正的问题@正如目前所说,这根本不是一个“好的高层次设计问题”,而是一个自相矛盾的问题。当有人问“我走错方向了吗”,你通常会告诉他你用类似的方式解决了你的问题。使用线程池是一个好主意,因为当多个客户端同时连接时创建线程会对服务器施加压力,使其为每个线程创建地址空间。我想知道你为什么会拒绝这个事实。RMI不使用线程池,因为这种使用不要求每个客户端有1个线程。另外,您应该知道RMI的速度很慢。所以这根本不是一个比较。我讨厌和主持人争论。这样做很可怕。我的情况到此为止。@EJP:我为使用错误的术语和措辞道歉。但是,我做了我以前的研究工作。事实上,我正在使用JavaNIO的ServerSocketChannel,它可以设置为非阻塞IOs。我的问题很简单。如何从Java访问OS事件队列。