ZhiYi/WebSocketServerDemo/Program.cs

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();
}
}