这是我的第一个问题
我正在尝试构建一个websocket服务器,它可以处理50-100个并发用户,每秒发送50条消息
在我的开发机器上,它只适用于一个用户,但当上传到服务器上时,速度会越来越慢,这取决于用户
谢谢你抽出时间
superwebsocket代码示例:
public class SuperWs
{
WebSocketServer server;
WebSocketSession[] array = new WebSocketSession[100];
public SuperWs()
{
server = new WebSocketServer();
server.Setup(new ServerConfig
{
Port = 23023,
Name = "super web socket",
LogAllSocketException = true,
LogBasicSessionActivity = true,
});
server.NewSessionConnected += NewSessionConnected;
server.NewMessageReceived += NewMessageReceived;
server.SessionClosed += SessionClosed;
server.Start();
Task.Run(() =>
{
while (true)
{
Thread.Sleep(1000);
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 50; i++)
{
for (int j = 0; j < array.Length; j++)
{
if (array[j] != null)
array[j].Send(string.Format("Hello! ms: {0}, mes: {1}", sw.ElapsedMilliseconds, i));
}
}
sw.Stop();
}
});
}
private void SessionClosed(WebSocketSession session, CloseReason value)
{
Console.WriteLine("{0} {1}", session.SessionID, value);
}
void NewMessageReceived(WebSocketSession session, string value)
{
Console.WriteLine("{0} {1}", session.SessionID, value);
}
private int count;
private void NewSessionConnected(WebSocketSession session)
{
Console.WriteLine(session);
array[count++] = session;
}
}
首先,当客户端和服务器不在同一台机器上时(比如在DEV环境中(,网络会导致一些延迟。如果连接了"n"个客户端,则需要"n*延迟"才能向所有节点发送消息。您应该为每个会话创建一个不同的循环,因此基本上在NewSessionConnected
上创建一个新的循环,该循环每秒发送50条消息,并在会话断开连接时结束(而不是while(true)
(。
如果你要进行并行工作,你应该使用async
编程,并使用await Task.Delay(1000)
而不是Thread.Sleep(1000)
,因为最新的会阻塞线程,而前一个会允许线程同时去做其他事情。不幸的是,SuperWebSocket不支持async
编程。
伪代码:
private async void NewSessionConnected(WebSocketSession session)
{
while (session.IsConnected)
{
await Task.Delay(1000 / 50);
session.Send("Hello");
}
}
此外,你必须开始思考当节点断开连接时你要做什么:(
顺便说一句,我开发了一个支持异步编程的WebSocket框架,这样的流量应该没有问题。