3

我正在使用 vert.x 开发一个项目。在这个项目中,我想实现一个功能:当客户端在 15 秒内没有发送任何内容时,服务器会将该连接标记为未使用并释放它。

我发现这篇文章说如何在 Netty 中实现这一点:Setting socket timeout on netty channel

但是,有没有一种简单的方法可以在 vert.x 中实现这一点?或者有没有办法可以访问我创建的套接字服务器使用的通道?似乎没有简单的访问套接字服务器中使用的 netty 对象。

4

1 回答 1

3

这是一个简单的例子,展示了如何在 vertx 中实现连接管理:如果客户端关闭或崩溃,服务器端相应的套接字也将关闭。

在这个例子中,如果一个连接在 10 秒内没有数据,服务器将直接关闭该连接。

客户端.groovy

vertx.setTimer(1000){ timerID ->
    vertx.createNetClient().connect(1234, "localhost") { socket ->
        socket.dataHandler { buffer ->
            println buffer
        }

        socket.closedHandler {
            println "I closed!"
        }

        socket << "$timerID"
    }    
}

vertx.setTimer(5000){ timerID ->
    vertx.createNetClient().connect(1234, "localhost") { socket ->
        socket.dataHandler { buffer ->
            println buffer
        }

        socket.closedHandler {
            println "I closed!"
        }

        def id = timerID
        vertx.setPeriodic(1000){
            socket << "$id"
        }
    }    
}

vertx.setTimer(10000){ timerID ->
    vertx.createNetClient().connect(1234, "localhost") { socket ->
        socket.dataHandler { buffer ->
            println buffer
        }

        socket.closedHandler {
            println "I closed!"
        }

        socket << "$timerID"
    }    
}

服务器.groovy

import org.vertx.java.core.net.NetSocket
import java.util.concurrent.ConcurrentHashMap

socketMap = new ConcurrentHashMap<NetSocket, String>()
liveConnections = new ConcurrentHashMap<String, Boolean>()

vertx.createNetServer().connectHandler{ socket ->
    socket.dataHandler { buffer ->
        socket << buffer
        if(!socketMap.get(socket)){
            register(socket, "${buffer}")
        }else{
            liveConnections.put(socketMap.get(socket), true)
        }

    }

    socket.closedHandler {
        def id = socketMap.get(socket)
        socketMap.remove(socket)
        println "Connection #$id closed!"
        println "Number of clients: ${socketMap.size()}"
    }

    socket.exceptionHandler {
        if(!socketMap.size()){
            return
        }

        def id = socketMap.get(socket)
        socketMap.remove(socket)
        println "Connection #$id got exception, closed!"
        println "Number of clients: ${socketMap.size()}"
        socket.close()
    }
}.listen(1234)

void register(socket,id){
    socketMap.put(socket, id)
    liveConnections.put(id, false)
    println "Connection #$id registered!"
}

vertx.setPeriodic(10000){
    socketMap.each{ item ->
        if(!liveConnections.get(item.value)){
            item.key.close()
        }
        liveConnections.put(item.value, false)
        println "Number of clients: ${socketMap.size()}"
    }
}

如果您有更好的想法,请告诉我,:)

于 2013-06-02T13:47:35.750 回答