由于最近的项目需要,在C#中使用websocket进行消息推送服务,本着不重复造轮子的原则,在github上找到了两款可用的开源类库,Fleck和websocket-sharp,经过对比,决定使用websocket-sharp(提供服务器与客户端的使用)来实现项目需求,现把具体使用情况记录如下:
开启websocket服务
/// <summary>
/// 监听服务
/// </summary>
private WebSocketServer WebSocketServer { set; get; }
/// <summary>
/// 是否启动服务
/// </summary>
public bool IsServerStart
{
get { return WebSocketServer?.IsListening ?? false; }
}
/// <summary>
/// 开启websocket服务
/// </summary>
private void StartWebSocketServer()
{
if (!IsServerStart)
{
WebSocketServer = new WebSocketServer($"ws://{WebSocketServerUrl}");
WebSocketServer.AddWebSocketService<ServerChat>("/Chat", () =>
{
/*这里可以实现多个客户端连接管理*/
ServerChat serverChat = new ServerChat();
serverChat.OnMessageEvent += OnMessageEvent;
return serverChat;
});
WebSocketServer.Start();
WebSocketStatus = $@"服务器监听地址:ws://{WebSocketServer.Address}:{WebSocketServer.Port}{WebSocketServer.WebSocketServices.Paths.ToList<string>()[0]}";
BtnServerStatus = "关闭服务";
}
else
{
WebSocketServer.Stop();
BtnServerStatus = "启动服务";
}
}
/*定义websocket监听行为*/
public class ServerChat : WebSocketBehavior
{
public EventHandler<string> OnMessageEvent;
private string _name;
public ServerChat() { }
private string getName()
{
var name = Context.QueryString["name"];
return name;
}
protected override void OnOpen()
{
_name = getName();
List<string> ids = Sessions.IDs.ToList<string>();
string id = this.ID;
}
protected override void OnMessage(MessageEventArgs e)
{
//Sessions.Broadcast(String.Format("{0}: {1}", _name, e.Data));
Send($"接收:{ e.Data}");
OnMessageEvent?.Invoke(this, $"{ID};{e.Data}");
}
}
websocket监听地址可以设为(WebSocketServerUrl):0.0.0.0:8080
。使用以上代码开启服务器后,访问连接可以为:ws://127.0.0.1:8080/Chat?Name=12223&password=123456
。每一个客户端连接成功后,会自动创建一个ServerChat
对象,在这个类里面可以定义相关的事件发布进行客户端管理。以上为最简单的websocket服务启动方式,详情可以参考作者官网信息:http://sta.github.io/websocket-sharp/。
连接websocket服务
创建好websocket服务后,可以进行客户端连接了,现使用本地连接:ws://127.0.0.1:8080/Chat?name=123456
作为测试。客户端连接代码如下:
private WebSocket WebSocketClient;
private void ClientConnectServer()
{
if (null == WebSocketClient)
{
WebSocketClient = new WebSocket($"ws://{ClientConnectUrl}");
WebSocketClient.OnMessage += WebSocketClient_OnMessage;
WebSocketClient.OnOpen += WebSocketClient_OnOpen;
WebSocketClient.ConnectAsync();
}
}
private void WebSocketClient_OnOpen(object sender, System.EventArgs e)
{
ConnectedStatus = "登录成功";
}
private void WebSocketClient_OnMessage(object sender, MessageEventArgs e)
{
if (e.IsText)
{
ClientShowReceivedData = e.Data;
}
}
至此,实现了简单的websocket服务和客户端连接。使用开源类库websocket-sharp非常方便的使用websocket进行服务器以及客户端开发,在此感谢类库作者的贡献,方便了后人,避免了重复造轮子。
使用vs开发C#项目的话,可以在NuGet中搜索WebSocketSharpFork
进行安装。
以上demo可以在项目:TopTools中找到,这个是本人一直致力开发的个人项目,意在开发出一款继承各种生产力的工具类库,欢迎指点。