Java中的事件驱动服务器
我正在尝试编写一个事件驱动的HTTP web服务器。因为我将只使用一个线程,所以事件必须排队并异步处理(我也使用JavaNIO)。然而,我只停留在最初的步骤。我已经打开了一个Java中的事件驱动服务器,java,events,network-programming,nio,socketserver,Java,Events,Network Programming,Nio,Socketserver,我正在尝试编写一个事件驱动的HTTP web服务器。因为我将只使用一个线程,所以事件必须排队并异步处理(我也使用JavaNIO)。然而,我只停留在最初的步骤。我已经打开了一个服务器socketchannel。我不知道在收到请求时如何获得新的SocketChannel连接。是否有可以通过Java访问的操作系统队列?(我不确定Java是否独立于操作系统)我不想使用任何阻塞调用 如果我走错了方向,我们将不胜感激 谢谢。您需要: 创建一个选择器 将ServerSocketChannel置于非阻塞模式
服务器socketchannel
。我不知道在收到请求时如何获得新的SocketChannel
连接。是否有可以通过Java访问的操作系统队列?(我不确定Java是否独立于操作系统)我不想使用任何阻塞调用
如果我走错了方向,我们将不胜感激
谢谢。您需要:
- 创建一个选择器
- 将ServerSocketChannel置于非阻塞模式
- 使用
OP\u ACCEPT
- 编写一个select()循环,可以在NIO教程中找到
isAcceptable()
返回true的键:这意味着您需要调用ServerSocketChannel.accept()来接受连接。返回一个SocketChannel
,然后必须将其置于非阻塞模式,并使用OP\u READ
注册
反过来,这将导致isReadable()
返回true的键:这意味着您应该读取相关的SocketChannel。
您将在NIO教程中找到所有这些的示例。它变得比这复杂得多;-) 您可能想看看Apache Mina:这是一个简化套接字处理的项目,他们的页面中也有服务器和客户端示例。为什么不投票,这是一个很好的高级设计问题。如果您使用NIO,那么您根本就不使用服务器套接字和套接字。没有以前研究的真实证据。这不是一个真正的问题@正如目前所说,这根本不是一个“好的高层次设计问题”,而是一个自相矛盾的问题。当有人问“我走错方向了吗”,你通常会告诉他你用类似的方式解决了你的问题。使用线程池是一个好主意,因为当多个客户端同时连接时创建线程会对服务器施加压力,使其为每个线程创建地址空间。我想知道你为什么会拒绝这个事实。RMI不使用线程池,因为这种使用不要求每个客户端有1个线程。另外,您应该知道RMI的速度很慢。所以这根本不是一个比较。我讨厌和主持人争论。这样做很可怕。我的情况到此为止。@EJP:我为使用错误的术语和措辞道歉。但是,我做了我以前的研究工作。事实上,我正在使用JavaNIO的ServerSocketChannel,它可以设置为非阻塞IOs。我的问题很简单。如何从Java访问OS事件队列。