WebSocket——SuperWebSocket實現服務端和客戶端具體實現如下:
注:本作者是基於vs2019 enterprise版本,所有項目均為.Net Framwork4.7版本(因為WebSocket需求是.Net Framwork4.0以上版本)
1、新建控制台項目ConsoleAppWebsocketServer-2,作為服務端,選擇項目右鍵管理Nuget程序包,搜索 SuperWebSocket ,選擇SuperWebSocketNETServer,點擊右側 安裝
安裝完成以后,項目會多出很多引用庫,如下
,
項目的Program.cs內容如下:
using SuperWebSocket;
using System;
using System.Web;
namespace ConsoleAppWebsocketServer_client
{
class Program
{
public static WebSocketServer ws = null;
static void Main(string[] args)
{
Console.WriteLine("WebSocket服務");
ws = new WebSocketServer();
ws.NewSessionConnected += Ws_NewSessionConnected;
ws.NewMessageReceived += Ws_NewMessageReceived;
ws.SessionClosed += Ws_SessionClosed;
if (!ws.Setup("127.0.0.1", 1234))
{
Console.WriteLine("ChatWebSocket 設置WebSocket服務偵聽地址失敗");
return;
}
if (!ws.Start())
{
Console.WriteLine("ChatWebSocket 啟動WebSocket服務偵聽失敗");
return;
}
Console.WriteLine("ChatWebSocket 啟動服務成功");
Console.ReadKey();
ws.Stop();
}
public static void Ws_NewSessionConnected(WebSocketSession session)
{
Console.WriteLine("{0:HH:MM:ss} 與客戶端:{1}創建新會話", DateTime.Now, GetSessionName(session));
var msg = string.Format("{0:HH:MM:ss} {1} 進入聊天室", DateTime.Now, GetSessionName(session));
SendToAll(session, msg);
}
private static void Ws_NewMessageReceived(WebSocketSession session, string value)
{
var msg = string.Format("{0:HH:MM:ss} {1}說: {2}", DateTime.Now, GetSessionName(session), value);
Console.WriteLine($"{msg}");
SendToAll(session, msg);
}
public static void Ws_SessionClosed(WebSocketSession session, SuperSocket.SocketBase.CloseReason value)
{
Console.WriteLine("{0:HH:MM:ss} 與客戶端:{1}的會話被關閉 原因:{2}", DateTime.Now, GetSessionName(session), value);
var msg = string.Format("{0:HH:MM:ss} {1} 離開聊天室", DateTime.Now, GetSessionName(session));
SendToAll(session, msg);
}
/// <summary>
/// 啟動服務
/// </summary>
/// <returns></returns>
public static void Start()
{
if (!ws.Setup("127.0.0.1", 1234))
{
Console.WriteLine("ChatWebSocket 設置WebSocket服務偵聽地址失敗");
return;
}
if (!ws.Start())
{
Console.WriteLine("ChatWebSocket 啟動WebSocket服務偵聽失敗");
return;
}
Console.WriteLine("ChatWebSocket 啟動服務成功");
}
/// <summary>
/// 停止偵聽服務
/// </summary>
public static void Stop()
{
if (ws != null)
{
ws.Stop();
}
}
public static string GetSessionName(WebSocketSession session)
{
return HttpUtility.UrlDecode(session.Path.TrimStart('/'));
}
public static void SendToAll(WebSocketSession session, string msg)
{
foreach (var sendSession in session.AppServer.GetAllSessions())
{
sendSession.Send(msg);
}
}
}
}
2、新建控制台項目ConsoleAppWebsocketClient-2,作為客戶端,選擇項目右鍵管理Nuget程序包,為了測試SuperWebSocket作為服務端的功能,本文客戶端使用了WebSocket4Net,同樣可以使用 SuperWebSocket ,選擇WebSocket4Net,點擊右側 安裝
安裝完成之后,同樣項目下會多一些引用庫,如下:
項目的Program.cs內容如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace ConsoleAppWebsocketClient
{
class Program
{
static WebSocket4Net.WebSocket webSocket4NetFaceValidate = null;
static void Main(string[] args)
{
Console.WriteLine("WebSocket客戶端");
Thread.Sleep(TimeSpan.FromSeconds(8));
webSocket4NetFaceValidate = new WebSocket4Net.WebSocket("ws://127.0.0.1:1234");
webSocket4NetFaceValidate.Opened += WebSocket4NetFaceValidate_Opened;
webSocket4NetFaceValidate.MessageReceived += WebSocket4NetFaceValidate_MessageReceived; ;
webSocket4NetFaceValidate.Open();
WebSocketSendmessage();
Thread thread = new Thread(WebSocketSendmessage);
thread.IsBackground = true;
thread.Start();
Console.ReadKey();
}
public static void WebSocketSendmessage()
{
int s = 88;
while (true)
{
webSocket4NetFaceValidate.Send(s.ToString());
s++;
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(3));
}
Console.WriteLine($"begin#123456");
byte[] bytess = Encoding.Default.GetBytes($"begin#123456");
IList<ArraySegment<byte>> list = new List<ArraySegment<byte>>();
list.Add(new ArraySegment<byte>(bytess));
webSocket4NetFaceValidate.Send(list);
}
private static void WebSocket4NetFaceValidate_Opened(object sender, EventArgs e)
{
Console.WriteLine($"begin#123456");
byte[] bytess = Encoding.Default.GetBytes($"begin#123456");
IList<ArraySegment<byte>> list = new List<ArraySegment<byte>>();
list.Add(new ArraySegment<byte>(bytess));
webSocket4NetFaceValidate.Send(list);
}
private static void WebSocket4NetFaceValidate_MessageReceived(object sender, WebSocket4Net.MessageReceivedEventArgs e)
{
try
{
string returnMessage = e.Message;
if (string.IsNullOrEmpty(returnMessage))
{
return;
}
Console.WriteLine(returnMessage);
}
catch (Exception ex)
{
}
finally
{
}
}
}
}
3、測試
為了看到測試效果,本作者又使用了js來測試,添加html文件,命名websockettest.html,內容如下:
websockettest.html:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html" />
<meta name="author" content="https://www.baidu.com" />
<title>websocket test</title>
<script>
var socket;
function Connect(){
try{
socket=new WebSocket('ws://127.0.0.1:1234');
}catch(e){
alert('error');
return;
}
socket.onopen = sOpen;
socket.onerror = sError;
socket.onmessage= sMessage;
socket.onclose= sClose;
}
function sOpen(){
alert('connect success!');
}
function sError(e){
alert("error " + e);
}
function sMessage(msg){
document.getElementById("msgrecv").value = msg.data;
}
function sClose(e){
alert("connect closed:" + e.code);
}
function Send(){
socket.send(document.getElementById("msg").value);
}
function Close(){
socket.close();
}
</script>
</head>
<body>
<input id="msg" type="text" size = "200" >
<input id="msgrecv" type="text" size = "200">
<button id="connect" onclick="Connect();">Connect</button>
<button id="send" onclick="Send();">Send</button>
<button id="close" onclick="Close();">Close</button>
</body>
</html>
到此位置所有的准備工作,都完成了,接下來運行項目
設置啟動項目如下:
運行效果: