当前位置: 首页 > 面试题库 >

Java NIO服务器

韦鸣
2023-03-14
问题内容

目前,我正在使用Java
NIO服务器(单线程),并且遇到了一些问题。服务器接受传入连接,将初始数据包(该数据包包含客户端用于进一步通信的某些数据)写入客户端,但不从客户端读取。当我关闭客户端时,服务器尝试读取,当然,它返回-1。

接受连接时,它将在以下位置注册:

selectionKey = socketChannel.register(_selector, SelectionKey.OP_READ)

selectionKey.isReadable()回报false(应该吗?)

在发送初始数据包之前,操作更改为:

_selectionKey.interestOps(_selectionKey.interestOps() | SelectionKey.OP_WRITE)

发送初始数据包后,操作将更改为:

selectedKey.interestOps(selectedKey.interestOps() & ~SelectionKey.OP_WRITE)

数据包被发送。

可能是什么问题呢?可以和客户有关吗?


问题答案:

selectionKey.isReadable() 返回false(应该吗?)

当然,直到有要读取的数据或流结束为止。

在发送初始数据包之前,操作更改为:

_selectionKey.interestOps(_selectionKey.interestOps() | SelectionKey.OP_WRITE)

馊主意。OP_WRITE几乎总是准备就绪,即套接字发送缓冲区已满时除外,因此您只会导致Selector.select()方法无意识地旋转。

要写入通道时,只需写入即可。在经典循环中执行以下操作:

while (buffer.position() > 0)
{
    buffer.flip();
    int count = channel.write(buffer);
    buffer.compact();
    if (count == 0)
    {
        // see below ...
    }
}

如果count是零,你应该 注册OP_WRITE,打破循环出来,并回到Selector循环。如果您没有退出此循环,请 注销
OP_WRITE.

请注意,这意味着每个通道都有一个写缓冲区。由于类似的原因(read()返回零),每个通道还需要一个读取缓冲区。反过来,这意味着一个包含两个对象的通道“会话”对象,并且可能是通道选择键的附件。



 类似资料:
  • 我已经使用java nio创建了一个客户端-服务器应用程序,它工作正常,但我的问题是,当服务器有许多连接到服务器的客户端时,服务器会响应错误的客户端,而不是请求客户端。例如,如果客户端A请求第一个人的信息,服务器将第一个人的信息返回给客户端B而不是客户端A。我已经尝试同步对象,但仍然无法正常工作,可能是什么问题。这是我的服务器示例代码

  • 我正在做一个练习,需要使用制作一个服务器-客户端聊天程序。目前,程序的工作方式很简单:当客户端向服务器发送消息时,服务器(已经跟踪所有客户端)会将消息回显给所有客户端。 这是我的部分服务器端代码: 以下是我的客户端代码: 我现在面临的问题是,当我使用客户端(与旧的合作得很好)向服务器发送消息时,客户端只返回它发送的第一条消息。服务器的所有下一个响应都是空的(服务器确实发回了,但只有一条空消息)。

  • 我在两个线程中使用一个SocketChannel,一个线程用于发送数据,另一个线程用于接收数据。 线程1:使用上述socketchannel写入数据 线程2:使用相同的socketchannel读取数据 我没有在socketchannel中使用任何选择器,因为我需要写和读是异步的(使用两个不同的线程) 问题:当连接丢失时,socketchannel。write()和socketchannel。re

  • 如何包含Eureka服务器 要在项目中包含Eureka服务器,请使用组org.springframework.cloud和工件id spring-cloud-starter-eureka-server的启动器。有关 使用当前的Spring Cloud发布列表设置构建系统的详细信息,请参阅Spring Cloud项目页面。 如何运行Eureka服务器 示例eureka服务器; @SpringBoot

  • hprose 为发布服务提供了多个方法,这些方法可以随意组合,通过这种组合,你所发布的服务将不会局限于某一个函数,某一个方法,某一个对象,而是可以将不同的函数和方法随意重新组合成一个服务。 AddFunction 方法 AddFunction(name string, function interface{}, option ...Options) Service 该方法的用于发布一个函数(命名函

  • Debug 字段 该设置默认值是 false,当发生错误时,只返回错误信息本身。 当该字段设置为 true 时,当发生 panic 时,会将整个 panic 的错误堆栈信息返回给客户端,在用户进行 hprose 服务开发时,该设置可以帮助你快速定位错误位置。 ErrorDelay 字段 该设置为整型值,默认值为 10 秒。 该字段表示在调用执行时,如果发生异常,将延时一段时间后再返回给客户端。 在

  • null null Tomcat服务器正在运行servlet,为mySQL数据库执行一些业务逻辑和hibernate框架。 现在我有点糊涂了。两台服务器都能接收HTTP请求吗?就像servlet从网页接收https请求和我的apache服务器一样? 并且两者都可以连接到数据库--使用php的apache服务器,正如我提到的,同时使用servlet的tomcat?

  • 如何在生产环境中将hazelcast服务器作为linux服务运行? java-server-cp hazelcast。jar com。黑兹卡斯特。例子。StartServer StartServer运行带有输出到std终端的服务器,将其作为linux服务运行并将日志写入文件的最简单方法是什么 我必须将其设置为EC2实例中的服务并将其捆绑。当EC2自动缩放启动实例时,hazelcast服务器将启动并