You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

143 lines
4.6 KiB

using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using TouchSocket.Core;
using TouchSocket.Http;
using TouchSocket.Http.WebSockets;
using TouchSocket.Sockets;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace ForwardingServerUI.Class
{
public class AsyncWebSocketServer
{
public static HttpService service = new HttpService();
public static async Task WebSocketMain()
{
//var service = new HttpService();
var config = new TouchSocketConfig();
config.SetListenIPHosts(7792)
.ConfigureContainer(a =>
{
a.AddConsoleLogger();
})
.ConfigurePlugins(a =>
{
//添加WebSocket功能
a.UseWebSocket(options =>
{
options.SetVerifyConnection(async (client, context) =>
{
if (!context.Request.IsUpgrade())
{
//如果不包含升级协议的header,就直接返回false。
return false;
}
// 在此处添加验证逻辑,例如:匹配特定的URL
if (true) // context.Request.UrlEquals("/ws"))
{
var url = context.Request.URL;
return true; // 允许连接
}
//如果url不匹配,则可以直接拒绝。
//await context.Response
//.SetStatus(403, "url不正确")
//.AnswerAsync();
return false;
});
});
a.Add<MyWebSocketReceivePlugin>();
a.Add<MyWebSocketClosedPlugin>();
});
//加载配置
await service.SetupAsync(config);
//启动服务
await service.StartAsync();
Console.WriteLine("WebSocketService:Run");
}
public async Task WebSocketSendAsync(string id,string dat) {
var clients = service.Clients;
foreach (var client in clients)
{
if (client.Protocol == Protocol.WebSocket)//先判断是不是websocket协议
{
if (client.Id == id)//再按指定id发送,或者直接广播发送
{
var webSocket = client.WebSocket;
await webSocket.SendAsync(dat);
}
}
}
}
private class MyWebSocketClosedPlugin : PluginBase, IWebSocketClosedPlugin
{
public async Task OnWebSocketClosed(IWebSocket webSocket, ClosedEventArgs e)
{
var ClientId = (webSocket as IIdClient)!.Id;
}
}
private class MyWebSocketReceivePlugin : PluginBase, IWebSocketReceivedPlugin
{
public async Task OnWebSocketReceived(IWebSocket webSocket, WSDataFrameEventArgs e)
{
//处理接收的数据
var dataFrame = e.DataFrame;
switch (dataFrame.Opcode)
{
case WSDataType.Cont:
//处理中继包
break;
case WSDataType.Text:
//处理文本包
Console.WriteLine(dataFrame.ToText());
break;
case WSDataType.Binary:
//处理二进制包
var data = dataFrame.PayloadData;
Console.WriteLine($"收到二进制数据,长度:{data.Length}");
break;
case WSDataType.Close:
//处理关闭包
break;
case WSDataType.Ping:
//处理Ping包
break;
case WSDataType.Pong:
//处理Pong包
break;
default:
//处理其他包
break;
}
await e.InvokeNext();
}
}
}
}