46 lines
1.6 KiB
C#
46 lines
1.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Net.WebSockets;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using System.Web;
|
|
|
|
namespace AutobahnTestAppAspNet4
|
|
{
|
|
/// <summary>
|
|
/// Summary description for EchoSocket
|
|
/// </summary>
|
|
public class EchoSocket : IHttpHandler
|
|
{
|
|
public bool IsReusable => false;
|
|
|
|
public void ProcessRequest(HttpContext context)
|
|
{
|
|
if (context.IsWebSocketRequest)
|
|
{
|
|
context.AcceptWebSocketRequest(async socketContext =>
|
|
{
|
|
await Echo(socketContext.WebSocket);
|
|
});
|
|
}
|
|
else
|
|
{
|
|
context.Response.Write("Ready to accept WebSocket request at: " + context.Request.Url.ToString().Replace("https://", "wss://").Replace("http://", "ws://"));
|
|
context.Response.Flush();
|
|
}
|
|
}
|
|
|
|
private async Task Echo(WebSocket webSocket)
|
|
{
|
|
var buffer = new byte[1024 * 4];
|
|
var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
|
|
while (!result.CloseStatus.HasValue)
|
|
{
|
|
await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);
|
|
result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
|
|
}
|
|
await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
|
|
}
|
|
}
|
|
} |