如何在vert.x套接字服务器中实现连接超时?

时间:2013-05-29 14:49:20

标签: netty vert.x

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

我发现这篇文章说hwo在Netty中实现这个:Setting socket timeout on netty channel

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

1 个答案:

答案 0 :(得分:3)

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

在此示例中,如果10s内没有来自一个连接的数据,服务器将直接关闭该连接。

client.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"
    }    
}

server.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()}"
    }
}

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