当前位置: 首页 > 知识库问答 >
问题:

如何断开客户端与NIO服务器套接字的连接

东方修谨
2023-03-14

我正在开发一个与许多客户端连接的服务器。我需要知道客户端何时与服务器断开连接。因此,每个客户端都向服务器发送一个特定的字符。如果两秒钟后没有收到字符,那么我应该断开服务器与客户端的连接(释放为此客户端分配的资源)。

这是我的服务器的主要代码:

public EchoServer(int port) throws IOException {
    this.port = port;
    hostAddress = InetAddress.getByName("127.0.0.1");
    selector = initSelector();
    loop();
}

private Selector initSelector() throws IOException {
    Selector socketSelector = SelectorProvider.provider().openSelector();

    ServerSocketChannel serverChannel = ServerSocketChannel.open();
    serverChannel.configureBlocking(false);

    InetSocketAddress isa = new InetSocketAddress(hostAddress, port);
    serverChannel.socket().bind(isa);
    serverChannel.register(socketSelector, SelectionKey.OP_ACCEPT);

    return socketSelector;
}

private void loop() {
    for (;true;) {
        try {
            selector.select();
            Iterator<SelectionKey> selectedKeys = selector.selectedKeys()
                    .iterator();
            while (selectedKeys.hasNext()) {
                SelectionKey key = selectedKeys.next();
                selectedKeys.remove();

                if (!key.isValid()) {
                    continue;
                }

                // Check what event is available and deal with it
                if (key.isAcceptable()) {
                    accept(key);
                } else if (key.isReadable()) {
                    read(key);
                } else if (key.isWritable()) {
                    write(key);
                }
            }
            Thread.sleep(1000);
            timestamp++;
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }       
    }
}

第一个问题是,我用来识别在线客户端的方式(每秒发送特定消息)是否是一种好方法?

如果它是好的,我如何使用SelectionKey检测与女巫客户端相关,然后如何断开密钥与服务器的连接?

共有2个答案

常博裕
2023-03-14

我用来识别在线客户(每秒发送特定消息)的方法是否是一种好方法?

是的,这叫做心跳。

如何使用SelectionKey检测与女巫客户端相关,然后如何断开密钥与服务器的连接?

可以附加一个对象,该对象包含有关通道的所有信息。您在注册频道时会包含此内容。

令狐嘉运
2023-03-14

第一个问题是,我用来识别在线客户端的方式(每秒发送特定消息)是否是一种好方法?

对于echo服务器,情况并非如此。在许多这样的情况下,您只需适当地识别流结束和连接故障。

如何使用SelectionKey检测与哪个客户端相关

SelectionKey有一个通道,通道有一个套接字,套接字有一个远程IP地址:端口。这就是你所需要的。

然后如何断开密钥与服务器的连接?

当您从read()方法或任何IOException读取或写入时获得-1时关闭通道。

 类似资料:
  • 我正在用Java编写一个简单的TCP客户机/服务器程序对,如果客户机在10秒内还没有发送任何东西,服务器必须断开连接。socket.setsoTimeout()使我得到了这一点,服务器就可以很好地断开连接。问题是--我如何让客户端确定服务器是否关闭?目前,我使用DataOutputStream向服务器写入数据,这里的一些答案表明,向封闭套接字写入数据将引发IOException,但这不会发生。 编

  • 真的需要你帮忙。 我的项目是通过电缆连接两台PC机,并使用tcp套接字将客户端文本框形式的字符串发送到服务器。问题是ATI只能发送一个字符串,然后连接就会关闭。 注意:某个端口上的连接将在表单加载中建立并成功。

  • 我试图用java实现一个客户端服务器,在这里我读取客户端中的输入并在服务器中执行UperCase,然后返回客户端并打印UperCase。我使用ObjectOutputStream和ObjectInputStream进行读写,但是当我在客户机中键入一个msg时,程序会显示以下错误: Digite uma msg casa java.io.eofexception位于java.io.datainput

  • 我组装了一个Java套接字服务器和客户端,可以互相发送消息,我想使用JavaScript作为客户端,但是。。。下面是在托管Java服务器并加载JavaScript客户端时发生的情况。 JavaScript: 这将在chrome控制台中打印: 到“ws://127.0.0.1:9005/”的WebSocket连接失败:WebSocket握手期间出错:无效状态行 WebSocket错误[对象事件] 我

  • 我正在制作满足以下条件的Netty服务器: null 在我的情况下,既没有发生“通道不活动”事件,也没有发生“连接被对等方重置”异常。 这是我使用的Netty测试客户端代码的部分。 如何在要回复时注意到断开连接?

  • 我正在使用和NIO通道编写一个简单的NIO服务器。每次我有一个传入连接,我都使用以下代码向选择器注册它: 在客户端,因为我只有一个socketChannel,所以很容易关闭通道并使用选择器取消注册。然而,在服务器端,我所做的只是等待任何连接过的客户端(可能有数千个)的写操作。有什么方法可以检测到客户端已在服务器端断开连接?例如,10K连接后,选择器似乎会变得非常低效,其中大多数可能会在短时间内失效