在我们的应用程序中,我们扩展了TextWebSocketHandler并覆盖afterConnectionFounded,afterConnectionClosed和handleTextMessage。
handleTextMessage只忽略发送到服务器的所有内容,因为我们只想在服务器上发生事件的情况下使用websocket连接。一旦检测到事件,就会将其放入已预订的Websocket的队列中。此队列由@Scheduled(fixedDelay = 500)弹簧方法处理。
afterConnectionFounded将在建立连接后将当前系统状态发送到新客户端,并将会话与请求的类型(由使用的端点URL决定)一起存储以供以后使用。
afterConnectionClosed用于从内存中删除关闭的websocket会话。为了安全起见,我们会检查发送到任何会话之前是否已打开。如果会话已经关闭,我们也将其从内存中删除。
为允许连接并设置允许的来源,我们实现了WebSocketConfigurer,其中registerWebSocketHandlers注册映射到上述提及的Websocket处理程序的路由。
using (SqlConnection conn = new SqlConnection(conString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("SELECT UserId,Status FROM NewUsers", conn))
{
using (SqlDataReader reader = cmd.ExecuteReader())
{
// looking for username and status in database check if is dealer or admin or unknown
if (reader.Read() || reader.HasRows)
{
int i = 0;
var UserIds = reader["UserId"].ToString();
foreach (var _userID in UserIds)
{
Console.WriteLine(_userID);
}
}
}
}
}
webSocketHandlers是一个映射,其中映射的键包含url路径和WebSocketHandler的值。
尽管这在测试期间似乎可以正常工作,但它有时会由于没有明显原因而有时会失败。在那之后,似乎仍然可以建立websocket连接,但是什么也没收到(没有初始数据,没有关于事件发生的数据)。
是否可能向服务器之一打开了向客户端之一的发送操作,但无法接收数据并因此阻止了所有其他客户端?