我正在使用vert.x开展项目。在这个项目中,我想实现一个功能:当客户端在15秒内没有发送任何内容时,服务器会将该连接标记为未使用并释放它。
我发现这篇文章说hwo在Netty中实现这个:Setting socket timeout on netty channel。
但是,有没有一种简单的方法可以在vert.x中实现它?或者有没有办法可以访问我创建的套接字服务器使用的通道?似乎没有简单的方法来访问套接字服务器中使用的netty对象。
答案 0 :(得分:3)
这是一个简单的示例,说明如何在vertx中实现连接管理:如果客户端关闭或崩溃,服务器端的相应套接字也将关闭。
在此示例中,如果10s内没有来自一个连接的数据,服务器将直接关闭该连接。
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"
}
}
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()}"
}
}
如果您有更好的想法,请告诉我,:))