88 lines
2.3 KiB
C#
88 lines
2.3 KiB
C#
|
using TouchSocket.Core;
|
|||
|
using TouchSocket.Http;
|
|||
|
using TouchSocket.Http.WebSockets;
|
|||
|
using TouchSocket.Sockets;
|
|||
|
|
|||
|
var service = new HttpService();
|
|||
|
await service.SetupAsync(new TouchSocketConfig()//加载配置
|
|||
|
.SetListenIPHosts(7789)
|
|||
|
.ConfigureContainer(a =>
|
|||
|
{
|
|||
|
a.AddConsoleLogger();
|
|||
|
})
|
|||
|
.ConfigurePlugins(a =>
|
|||
|
{
|
|||
|
a.UseWebSocket()//添加WebSocket功能
|
|||
|
.SetWSUrl("/ws")//设置url直接可以连接。
|
|||
|
.UseAutoPong();//当收到ping报文时自动回应pong
|
|||
|
a.Add<MyReadWebSocketPlugin>();
|
|||
|
}));
|
|||
|
|
|||
|
await service.StartAsync();
|
|||
|
service.Logger.Info("websocket服务器已启动");
|
|||
|
Console.ReadLine();
|
|||
|
|
|||
|
|
|||
|
class MyReadWebSocketPlugin : PluginBase, IWebSocketReceivedPlugin, IWebSocketHandshakedPlugin
|
|||
|
{
|
|||
|
private readonly ILog m_logger;
|
|||
|
|
|||
|
public MyReadWebSocketPlugin(ILog logger)
|
|||
|
{
|
|||
|
this.m_logger = logger;
|
|||
|
}
|
|||
|
|
|||
|
public async Task OnWebSocketHandshaked(IWebSocket client, HttpContextEventArgs e)
|
|||
|
{
|
|||
|
await e.InvokeNext();
|
|||
|
if (client.Client is IHttpSessionClient httpSessionClient)
|
|||
|
{
|
|||
|
var serviceStr = httpSessionClient.Id;
|
|||
|
await client.SendAsync(serviceStr);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public async Task OnWebSocketReceived(IWebSocket client, WSDataFrameEventArgs e)
|
|||
|
{
|
|||
|
switch (e.DataFrame.Opcode)
|
|||
|
{
|
|||
|
case WSDataType.Cont:
|
|||
|
m_logger.Info($"收到中间数据,长度为:{e.DataFrame.PayloadLength}");
|
|||
|
return;
|
|||
|
|
|||
|
case WSDataType.Text:
|
|||
|
m_logger.Info(e.DataFrame.ToText());
|
|||
|
return;
|
|||
|
|
|||
|
case WSDataType.Binary:
|
|||
|
if (e.DataFrame.FIN)
|
|||
|
{
|
|||
|
m_logger.Info($"收到二进制数据,长度为:{e.DataFrame.PayloadLength}");
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
m_logger.Info($"收到未结束的二进制数据,长度为:{e.DataFrame.PayloadLength}");
|
|||
|
}
|
|||
|
return;
|
|||
|
|
|||
|
case WSDataType.Close:
|
|||
|
{
|
|||
|
}
|
|||
|
return;
|
|||
|
|
|||
|
case WSDataType.Ping:
|
|||
|
break;
|
|||
|
|
|||
|
case WSDataType.Pong:
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
await e.InvokeNext();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|