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