首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何断开客户端与NIO服务器套接字的连接

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

Stack Overflow用户
提问于 2014-12-28 08:28:30
回答 2查看 2K关注 0票数 1

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

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

代码语言:javascript
复制
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检测到与女巫客户端有关,然后我如何从服务器断开密钥?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-28 09:32:26

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

在回送服务器的情况下不是这样。在许多这样的情况下,您所需要的只是适当地识别流的结束和连接失败。

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

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

然后如何将密钥与服务器断开?

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

票数 2
EN

Stack Overflow用户

发布于 2014-12-28 09:14:21

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

是的,这叫做心跳。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27674808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档