简单研究了一下WebSocket,找到网上的一段服务端的C#代码,内容如下:
FleckLog.Level = LogLevel.Debug;
var allSockets = new List<IWebSocketConnection>();
var server = new WebSocketServer("ws://192.168.0.103:50000");
server.Start(socket =>
{
socket.OnOpen = () =>
{
Console.WriteLine("Open!");
allSockets.Add(socket);
};
socket.OnClose = () =>
{
Console.WriteLine("Close!");
allSockets.Remove(socket);
};
socket.OnMessage = message =>
{
Console.WriteLine(message);
allSockets.ToList().ForEach(s => s.Send("Echo: " + message));
};
});
=> 这个玩意儿见了有不少了,但是理解和感性认识还是很表面,再加上delegate的使用问题,搞得很困惑。下面谈谈 server.Start(socket =>…的解释和普通代码形式。
public void Start(Action<IWebSocketConnection> config);
Start 的参数是一个 Action,并且这个Action 有参数,因此
理解1: 括号里面的一个Action 代理。
理解2:socket 这个action的参数
理解3:这个参数是一个IWebSocketConnection 实例
如图示:
以上代码可以简化为
server.Start(socket =>
{
socket.OnOpen();
socket.OnClose();
socket.OnMessage();
});
到这里大家应该明白了。还有一个困惑是 socket 怎么来的?怎么定义的(很初级的问题,是对lamuda表达不是所致,我深受其害)。
解释:这个是回调时,调用者传过来的参数,因此,编译器是可以感知的。上面代码最终可以用普通代码表示如下:
private void button1_Click(object sender, EventArgs e)
{
FleckLog.Level = LogLevel.Debug;
var allSockets = new List<IWebSocketConnection>();
var server = new WebSocketServer("ws://192.168.0.103:50000");
server.Start( mySkt);
///explanation for the following
///the parameter for Start is a delegate whose parameter is socket.
//server.Start(socket =>
//{
// socket.OnOpen() = () =>
// {
// Console.WriteLine("Open!");
// allSockets.Add(socket);
// };
// socket.OnClose = () =>
// {
// Console.WriteLine("Close!");
// allSockets.Remove(socket);
// };
// socket.OnMessage = message =>
// {
// Console.WriteLine(message);
// allSockets.ToList().ForEach(s => s.Send("Echo: " + message));
// };
//});
}
void wskcOpen()
{
Console.WriteLine("Open!");
//allSockets.Add(socket);
}
void wskcClose()
{
Console.WriteLine("Close!");
//allSockets.Add(socket);
}
void wskcMessage(string message)
{
Console.WriteLine(message);
//allSockets.Add(socket);
}
private void mySkt(IWebSocketConnection wbSktConn)
{
wbSktConn.OnOpen += wskcOpen;
wbSktConn.OnClose += wskcClose;
wbSktConn.OnMessage += wskcMessage;
}
这里还涉及闭包的问题,不再赘述。总之,使用Lamda表达式代码要简单很多,理解和感性认识要慢慢来。
马拉孙 于 泛五地区
2021-04-06