一 介绍

WebSocket# 提供了实现WebSocket协议客户端和服务器。

WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端

二 用法

创建一个控制台程序,从Nuget添加引用websocket-sharp

【websocket-sharp】使用-LMLPHP

public static void Main (string[] args)
{
var wssv=new WebSocketServer(null, );//创建一个websocket服务对象,2018是端口号
wssv.start();//开始接收websocket
Console.ReadKey (true);
wssv.Stop ();//关闭
}

如果需要使用wss(比如微信小程序中,只接受wss不接受ws,)

则在创建websocket服务对象的第三个参数中加入如下代码

  var ssl = new ServerSslConfiguration(new X509Certificate2
(@"D:证书\132456.pfx", ""), false,
System.Security.Authentication.SslProtocols.Tls11);
var wssv = new WebSocketServer(null, , ssl);

接着创建一个类继承WebSocketBehavior

public class ChatRoom : WebSocketBehavior
{
protected override async Task OnMessage(MessageEventArgs e)
{
//传来的消息
var memid = Context.GetQueryString().Result["memid"];//通过此方法可以获取传来的查询字符串值
memberEntity = new tb_memberEntity();//会员实体类,此处会意即可,不贴具体代码
if (!memid.IsEmpty())
{
memberEntity = new tb_memberBLL().GetEntity(memid);
}
else
{
memberEntity.nickname = "游客";
}
StreamReader reader = new StreamReader(e.Data, Encoding.UTF8);//读取发来的数据内容
var msgStr = reader.ReadToEnd();
await Sessions.Broadcast(new
{
content = msgStr,
name = memberEntity.nickname,
}.ToJson()); //将准备好的内容发送给“收听”的客户端
}
protected override async Task OnClose(CloseEventArgs e)
{
//处理关闭连接的响应
} protected override async Task OnOpen()
{
//处理打开连接的响应
} protected override async Task OnError(WebSocketSharp.ErrorEventArgs e)
{
//处理异常事件
Console.WriteLine(e.Message + "\t\r" + DateTime.Now);
}
}

回到刚刚的mian方法中,在wssv.Start();后插入如下代码,相当于创建了一个聊天间

wssv.AddWebSocketService<ChatRoom >("roomName");

写完收工,接着F5运行一下

三 测试

此处我通过html来实现客户端

 <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="messages">
</div>
<input type="text" id="content" value="" />
<a id="sendbt" href="javascript:void(0);">发送</a>
</body> <script src="https://cdn.bootcss.com/jquery/1.8.3/jquery.min.js"></script>
<script>
var ws;
function initWS() {
if ("WebSocket" in window) {
ws = new WebSocket("ws://localhost:2018/roomName");
ws.onopen = function (e) {
console.log("Openened connection to websocket");
};
ws.onclose = function () {
console.log("Close connection to websocket");
// 断线重连
initWS();
}
ws.onerror = function (e) {
console.info("出错了");
console.info(e);
}
ws.onmessage = function (e) {
console.log("收到", e.data)
$("#messages").append(e.data);
}
} else {
alert("您的浏览器不支持 WebSocket!");
}
}
initWS();
function sendMsg(msg, type) {
var sendJosn = JSON.stringify({ Msg: msg, msgType: 1 });
try {
ws.send(sendJosn);
} catch (e) {
console.info(e);
}
}
$(function () {
$("#sendbt").click(function () {
var text = $("#content").val();
sendMsg(text, "1")
$("#content").val("");
})
$("#changebt").click(function () {
sendMsg(text, "2")
})
})
</script>
</html>
05-11 14:37