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

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

颛孙庆
2023-03-14
问题内容

我想使用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 html" target="_blank">listening on " + port);

            server.accept("Client connection", 
                    new CompletionHandler<AsynchronousSocketChannel, Object>() {
                public void completed(AsynchronousSocketChannel ch, Object att) {
                    System.out.println("Accepted a connection");

                    // accept the next connection
                    server.accept("Client connection", this);

                    // handle this connection
                    //TODO handle(ch);
                }

                public void failed(Throwable exc, Object att) {
                    System.out.println("Failed to accept connection");
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

问题答案:

您走在正确的轨道上,从完成的回调中调用accept()以便接受更多连接应该起作用。

防止线程终止的一种简单(但难看)的方法是简单地循环直到线程被中断。

// yes, sleep() is evil, but sometimes I don't care
while (true) {
    Thread.sleep(1000);
}

一种更清洁的方法是使用AsynchronousChannelGroup。例如:

AsynchronousChannelGroup group = AsynchronousChannelGroup.withThreadPool(Executors
            .newSingleThreadExecutor());
AsynchronousServerSocketChannel server = AsynchronousServerSocketChannel.open(group).bind(
            new InetSocketAddress(port));

// (insert server.accept() logic here)

// wait until group.shutdown()/shutdownNow(), or the thread is interrupted:
group.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);

您可以调整线程的处理方式,有关更多信息,请参见AsynchronousChannelGroup
API文档



 类似资料:
  • 我试图创建一个简单的SpringBoot应用程序来连接和存储数据库中的一些数据,但是当我的代码试图提交一个新对象时,仍然会遇到401禁止消息。 我应该如何使用SpringBoot连接到ArangoDb,以便能够在数据库中保存节点? 我的系统上运行了ArangoDb,我可以在localhost登录到web控制台:http://localhost:8529 我有一个与下面的属性同名的数据库。我还尝试在

  • 众所周知,SO_REUSEPORT允许多个套接字侦听相同的IP地址和端口组合,它将每秒的请求增加2-3倍,并减少延迟(~30%)和延迟的标准偏差(8倍):https://www.nginx.com/blog/socket-sharding-nginx-release-1-9-1/ NGINX release 1.9.1引入了一个新特性,支持使用SO_REUSEPORT套接字选项,该选项在许多操作系

  • 问题内容: 我有一个要连接到MySQL数据库的应用程序。它在半夜断开连接,然后喷出有关连接的信息,并且JDBC在X秒内没有收到消息。 在进行任何需要与SQL Server通信的操作之前,我先打电话给我。 这是我的方法: 在该方法中,我将密码等信息放入字符串中,然后以标准JDBC方式创建连接。 然后我调用此方法: 我可以对这两种方法进行哪些更改以适应丢失的连接? 问题答案: 这不是检索连接的正确方法

  • 问题内容: 我试图将联系人保存在表中,但filechosser始终将其设置为所有文件。有没有办法我可以将其设置为仅接受.txt并将其设置为默认值或唯一选项。 问题答案: 您需要添加一个过滤器:

  • 我试图创建一个图书馆管理系统,因为我创建了两个实体和这两个实体都是使用关系连接的,所以我使用了另一个联接表,在这里我存储了图书的Id和学生的Id,当学生从图书馆发出一本书时,但是当学生返回书时,联接表中包含这两个Id的行应该被删除,但是当我尝试这样做时,要么联接表中的所有数据都被删除,要么我的学生和图书在这里被删除了我的代码,请告诉我,我在这里做错了什么,什么应该是最好的实践 学生实体 图书实体

  • 我正在使用多个线程在不同的表中插入插入记录。此外,我正在使用批处理的记录插入,以提高效率。 注意:要插入的记录数以百万为单位。 我的问题是,在这种多线程环境中,我应该使用连接池吗? 我关心的问题: 每个线程将运行相当长的时间来执行数据库操作。所以,如果我的连接池的大小是2,线程的数量是4,那么在给定的时刻只有2个线程将运行。因此,其他两个线程将会在很长一段时间内保持理想状态以获得连接,因为针对百万