使用 C#创建 WebSocket 服务端的方法
1. 引入必要的命名空间
using System.Text; // 用于发送和接收信息时处理文本
using System.Net; // 用于处理网络连接
using System.Net.WebSockets; // 用于处理WebSocket连接
2. 实例化 HttpListener
const string HOST = "localhost"; // 监听的主机名
const int PORT = 3030; // 监听的端口号
HttpListener listener = new HttpListener(); // 实例化HttpListener,这个需要作为一个全局变量
listener.Prefixes.Add($"http://{HOST}:{PORT}/"); // 设置监听的URL
listener.Start(); // 开始监听
3. 处理客户端的请求
async static Task ListenClientConnections()
{
while (true)
{
// 等待客户端的连接
Console.WriteLine("等待客户端连接");
HttpListenerContext context = await listener.GetContextAsync();
// 判断此连接是否为WebSocket的请求
if (context.Request.IsWebSocketRequest)
{
Console.WriteLine($"接收到客户端连接");
// 这时候,我们可以用WebSocket来接受客户端的连接
WebSocket webSocket = context.AcceptWebSocketAsync(null).Result.WebSocket;
// 这时候我们可以根据需要来处理客户端的消息
while (webSocket.State == WebSocketState.Open)
{
// 等待客户端的消息
byte[] buffer = new byte[1024]; // 定义一个缓冲区大小为1KB
ArraySegment<byte> segment = new ArraySegment<byte>(buffer); // 定义一个数组段
CancellationToken cancellationToken = CancellationToken.None; // 定义一个取消标记
// 这时候这里一直等待客户端的消息
Console.WriteLine("等待客户端消息");
WebSocketReceiveResult result = await webSocket.ReceiveAsync(segment, cancellationToken);
// 文本类型的消息
if (result.MessageType == WebSocketMessageType.Text)
{
// 这里可以对客户端的消息进行处理
string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
// 给客户端发送消息
string responseMessage = $"接收到客户端的消息: {message}";
Console.WriteLine(responseMessage);
byte[] responseBuffer = Encoding.UTF8.GetBytes(responseMessage);
await webSocket.SendAsync(
responseBuffer, // 发送的消息,字节数组类型
WebSocketMessageType.Text, // 消息类型为文本
true, // 最后一帧,如果为false,则表示后面还有数据
CancellationToken.None // 取消标记
);
}
}
Console.WriteLine("客户端连接断开");
}
}
}
4. 启动服务端
ListenClientConnections().Wait(); // 启动监听客户端连接的异步方法
5. 客户端连接
在这里我们用 javascript 的 WebSocket 来模拟客户端的连接,并向服务端发送消息。
let ws = new WebSocket("ws://localhost:3030/");
ws.onopen = function () {
console.log("连接到服务端");
// 发送消息
ws.send("Hello World!!!");
};
ws.onclose = function () {
console.log("与服务端连接断开");
};
ws.onmessage = function ({ data }) {
console.log("接收到服务端消息");
console.log(data);
// ws.send("Hello World!!!"); // 猜猜会发生什么?
ws.close(); // 关闭连接
console.log("关闭与服务端的连接");
};
ws.onerror = function () {
console.log("WebSocket连接发生错误");
};
6. 运行结果
在服务端的控制台中,我们可以看到:
等待客户端连接
接收到客户端连接
等待客户端消息
接收到客户端的消息: Hello World!!!
等待客户端消息
客户端连接断开
等待客户端连接
在客户端的控制台中,我们可以看到:
连接到服务端
接收到服务端消息
接收到客户端的消息: Hello World!!!
关闭与服务端的连接
与服务端连接断开
到这里,我们就完成了 C# 创建 WebSocket 服务端的方法。
完整代码
using System.Text; // 用于发送和接收信息时处理文本
using System.Net; // 用于处理网络连接
using System.Net.WebSockets; // 用于处理WebSocket连接
namespace Test.Program
{
static class Program
{
static HttpListener listener;
static void Main(string[] args)
{
const string HOST = "localhost"; // 监听的主机名
const int PORT = 3030; // 监听的端口号
listener = new HttpListener(); // 实例化HttpListener
listener.Prefixes.Add($"http://{HOST}:{PORT}/"); // 设置监听的URL
listener.Start(); // 开始监听
ListenClientConnections()
.Wait();
}
async static Task ListenClientConnections()
{
while (true)
{
// 等待客户端的连接
Console.WriteLine("等待客户端连接");
HttpListenerContext context = await listener.GetContextAsync();
// 判断此连接是否为WebSocket的请求
if (context.Request.IsWebSocketRequest)
{
Console.WriteLine($"接收到客户端连接");
// 这时候,我们可以用WebSocket来接受客户端的连接
WebSocket webSocket = context.AcceptWebSocketAsync(null).Result.WebSocket;
// 这时候我们可以根据需要来处理客户端的消息
while (webSocket.State == WebSocketState.Open)
{
// 等待客户端的消息
byte[] buffer = new byte[1024]; // 定义一个缓冲区大小为1KB
ArraySegment<byte> segment = new ArraySegment<byte>(buffer); // 定义一个数组段
CancellationToken cancellationToken = CancellationToken.None; // 定义一个取消标记
// 这时候这里一直等待客户端的消息
Console.WriteLine("等待客户端消息");
WebSocketReceiveResult result = await webSocket.ReceiveAsync(segment, cancellationToken);
// 文本类型的消息
if (result.MessageType == WebSocketMessageType.Text)
{
// 这里可以对客户端的消息进行处理
string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
// 给客户端发送消息
string responseMessage = $"接收到客户端的消息: {message}";
Console.WriteLine(responseMessage);
byte[] responseBuffer = Encoding.UTF8.GetBytes(responseMessage);
await webSocket.SendAsync(
responseBuffer, // 发送的消息,字节数组类型
WebSocketMessageType.Text, // 消息类型为文本
true, // 最后一帧,如果为false,则表示后面还有数据
CancellationToken.None // 取消标记
);
}
}
Console.WriteLine("客户端连接断开");
}
}
}
}
}
客户端
let ws = new WebSocket("ws://localhost:3030/");
ws.onopen = function () {
console.log("连接到服务端");
// 发送消息
ws.send("Hello World!!!");
};
ws.onclose = function () {
console.log("与服务端连接断开");
};
ws.onmessage = function ({ data }) {
console.log("接收到服务端消息");
console.log(data);
// ws.send("Hello World!!!"); // 猜猜会发生什么?
ws.close(); // 关闭连接
console.log("关闭与服务端的连接");
};
ws.onerror = function () {
console.log("WebSocket连接发生错误");
};
标签:WebSocket,C#,ws,消息,连接,服务端,客户端
From: https://www.cnblogs.com/musehanzhi/p/18593804