Netty 如何在vert.x套接字服务器中实现连接超时?
我正在使用vert.x进行一个项目。在这个项目中,我想实现一个功能:当客户端在15秒内什么也不发送时,服务器会将该连接标记为未使用并释放它 我发现这篇帖子说hwo要在Netty中实现这一点:Netty 如何在vert.x套接字服务器中实现连接超时?,netty,vert.x,Netty,Vert.x,我正在使用vert.x进行一个项目。在这个项目中,我想实现一个功能:当客户端在15秒内什么也不发送时,服务器会将该连接标记为未使用并释放它 我发现这篇帖子说hwo要在Netty中实现这一点: 然而,在vert.x中有没有一种简单的方法来实现这一点?或者有没有一种方法可以访问我创建的套接字服务器使用的通道?似乎访问socket server中使用的netty对象并不简单。这是一个简单的示例,演示了如何在vertx中实现连接管理:如果客户端关闭或崩溃,服务器端相应的套接字也将关闭 在本例中,若10秒
然而,在vert.x中有没有一种简单的方法来实现这一点?或者有没有一种方法可以访问我创建的套接字服务器使用的通道?似乎访问socket server中使用的netty对象并不简单。这是一个简单的示例,演示了如何在vertx中实现连接管理:如果客户端关闭或崩溃,服务器端相应的套接字也将关闭 在本例中,若10秒内一个连接并没有数据,服务器将直接关闭该连接 client.groovy
vertx.setTimer(1000){timerID->
createNetClient().connect(1234,“localhost”){socket->
socket.dataHandler{buffer->
println缓冲区
}
插座.闭合手柄{
打印“我关门了!”
}
插座
createNetClient().connect(1234,“localhost”){socket->
socket.dataHandler{buffer->
println缓冲区
}
插座.闭合手柄{
打印“我关门了!”
}
def id=timerID
vertx.setPeriodic(1000){
插座
createNetClient().connect(1234,“localhost”){socket->
socket.dataHandler{buffer->
println缓冲区
}
插座.闭合手柄{
打印“我关门了!”
}
插座
socket.dataHandler{buffer->
插座
如果(!liveConnections.get(item.value)){
item.key.close()
}
liveConnections.put(item.value,false)
println“客户端数:${socketMap.size()}”
}
}
如果你有更好的想法,请告诉我,:)我对vertx不太熟悉,但你能使用vertx.setTimer吗?每次收到数据包时,你都会取消计时器并创建一个新的。但是我想在计时器超时后关闭套接字,就像在那篇文章中所做的那样:ctx.getChannel().close().事实上,我考虑过你的方法,使用vertx.setTimer,但是如果有许多插槽,一个计时器不能很好地与它们配合使用,:(你的verticle不能注册一个连接处理程序吗?那么,当你处理连接事件时,你会创建一个已注册的处理程序,处理套接字和计时器事件,并维护对套接字的引用。当计时器触发时,你会关闭套接字吗?我怀疑在表面下,计时器确实是一个处理所有事件的单个计时器实例特定事件循环的计时器。这似乎与在netty中的多个管道之间共享HashWheelTimer没有什么不同-这就是链接引用的作用。谢谢,johnstlr。我想我明白你的意思了。在重新检查vertx文档后,我发现我对vertx中的计时器有一些误解,:)。然后我尝试实现一个简单的示例,请参见下面。您的观点非常有用。在3.0.0版本中,我发现HttpServerOptions setIdleTimeout(int-idleTimeout)
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()}"
}
}