1.新建WebSocketService.cs
代码如下
using System;
using System.Net;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
internal class WebSocketService
{
HttpListener m_httpListener;
private WebSocket m_webSocket;
public event EventHandler<string> m_DataReceive;
private bool m_isDoThread;
public void Listening()
{
Console.WriteLine("正在监听...");
//监听Ip、端口
m_httpListener = new HttpListener();
m_httpListener.Prefixes.Add("http://127.0.0.1:8888/");
m_httpListener.Start();
var httpListenContext = m_httpListener.GetContext();
var webSocketContext = httpListenContext.AcceptWebSocketAsync(null);
m_webSocket = webSocketContext.Result.WebSocket;
m_isDoThread = true;
//开启后台线程,持续接收客户端消息
Task.Run(() =>
{
while (m_isDoThread)
{
//接收消息
string msg = Receive(m_webSocket);
if (msg != null)
{
m_DataReceive?.Invoke(m_webSocket, msg); //数据处理
}
}
Console.WriteLine("接收信息线程结束。");
});
Console.WriteLine("连接建立成功!");
}
/// <summary>
/// 发送信息
/// </summary>
/// <param name="content">发送的内容</param>
public void Send(string content)
{
//同客户端,WebSocketState要求
if (m_webSocket != null && (m_webSocket.State == WebSocketState.Open || m_webSocket.State == WebSocketState.CloseReceived))
{
ArraySegment<byte> array = new ArraySegment<byte>(Encoding.UTF8.GetBytes(content));
var task = m_webSocket.SendAsync(array, WebSocketMessageType.Binary, true, CancellationToken.None);
task.Wait();
Console.WriteLine("发送了一个消息到客户端。");
}
}
/// <summary>
/// 接收信息
/// </summary>
/// <param name="webSocket"></param>
/// <returns></returns>
private string Receive(WebSocket webSocket)
{
if (webSocket != null && (webSocket.State == WebSocketState.Open || webSocket.State == WebSocketState.CloseSent))
{
byte[] arrry = new byte[1024];
ArraySegment<byte> buffer = new ArraySegment<byte>(arrry);
var task = webSocket.ReceiveAsync(buffer, CancellationToken.None);
task.Wait();
Console.WriteLine("当前socket状态:" + webSocket.State);
if (webSocket.State == WebSocketState.CloseReceived || task.Result.MessageType == WebSocketMessageType.Close)
{
webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "Acknowledge Close frame", CancellationToken.None);
Console.WriteLine("当前socket状态:" + webSocket.State);
Console.WriteLine("连接已断开。");
m_isDoThread = false;
return null;
}
return Encoding.UTF8.GetString(buffer.Array, 0, task.Result.Count);
}
else
{
return null;
}
}
}
2.新建Program.cs
代码如下:
using System;
using System.Threading.Tasks;
internal class Program
{
//创建一个WebSocketService
private static WebSocketService m_serviceSocket;
static void Main(string[] args)
{
//开启后台线程,监听客户端连接
Task.Run(() =>
{
m_serviceSocket = new WebSocketService();
m_serviceSocket.m_DataReceive += HandleDataRecive;
m_serviceSocket.Listening();
});
while (true)
{
//输入内容,发送消息到客户端
string msg = Console.ReadLine();
m_serviceSocket.Send(msg);
}
}
/// <summary>
/// 消息事件处理函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private static void HandleDataRecive(object sender, string e)
{
Console.WriteLine("接收的客户端消息:" + e);
}
}
可根据具体使用场景进行修改,目前只实现了消息的收发
可结合Unitywebsocket进行搭配使用