aspnetcore/test/WebRoot/WebSocket/OtherExamples/HandleBinaryEcho.ashx

166 lines
5.1 KiB
Plaintext

<%@ WebHandler Language="C#" Class="Handler" %>
using System;
using System.Web;
using System.Net.WebSockets;
using System.Web.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Net;
using System.Collections.Generic;
using System.Linq;
public class Handler : IHttpHandler
{
const int BUFFER = 1000 * 1000;
public void ProcessRequest(HttpContext context)
{
if (!context.IsWebSocketRequest)
{
HttpRequest Request = context.Request;
HttpResponse Response = context.Response;
Response.Write("Simple Http");
return;
}
context.AcceptWebSocketRequest(async wsContext =>
{
// set up the loop
WebSocket socket = wsContext.WebSocket;
////determine return type
List<string> query = wsContext.SecWebSocketProtocols.ToList();
WebSocketMessageType responseType = WebSocketMessageType.Text;
if (query[0].Split('-')[0] == WebSocketMessageType.Binary.ToString())
{
responseType = WebSocketMessageType.Binary;
}
WebSocketMessageType requestType = WebSocketMessageType.Text;
if (query[0].Split('-')[1] == WebSocketMessageType.Binary.ToString())
{
requestType = WebSocketMessageType.Binary;
}
int returnSize = Int32.Parse(query[0].Split('-')[2]);
int requestSize = Int32.Parse(query[0].Split('-')[3]);
bool canSend = Boolean.Parse(query[0].Split('-')[4]);
bool canReceive = Boolean.Parse(query[0].Split('-')[5]);
if (canSend && !canReceive)
{
await Send(socket, responseType, returnSize);
}
else if (canReceive && !canSend)
{
await Recieve(socket, requestType);
}
else if (canReceive && canSend)
{
Task.Run(() =>
{
Recieve(socket, requestType);
});
while (socket.State == WebSocketState.Open)
{
int bytesLeft = returnSize;
var tempString = string.Empty;
while (bytesLeft > BUFFER)
{
tempString = RandomString(BUFFER);
bytesLeft -= BUFFER;
await socket.SendAsync(new ArraySegment<byte>(Encoding.UTF8.GetBytes(tempString)), responseType, false, CancellationToken.None);
Thread.Sleep(200);
}
if (bytesLeft <= BUFFER && bytesLeft >= 0)
{
tempString = RandomString(bytesLeft);
await socket.SendAsync(new ArraySegment<byte>(Encoding.UTF8.GetBytes(tempString)), responseType, true, CancellationToken.None);
Thread.Sleep(500);
}
}
}
else
{
Task.Run(() =>
{
Recieve(socket, requestType);
});
}
});
}
async Task Recieve(WebSocket webSocket, WebSocketMessageType messageType)
{
ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);
while (webSocket.State == WebSocketState.Open)
{
WebSocketReceiveResult input = await webSocket.ReceiveAsync(buffer, CancellationToken.None);
if (input.CloseStatus == WebSocketCloseStatus.NormalClosure)
{
await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
break;
}
}
}
async Task Send(WebSocket socket, WebSocketMessageType responseType, int returnSize)
{
while (socket.State == WebSocketState.Open)
{
int bytesLeft = returnSize;
while (bytesLeft > BUFFER)
{
bytesLeft -= BUFFER;
await socket.SendAsync(new ArraySegment<byte>(Encoding.UTF8.GetBytes(RandomString(BUFFER))), responseType, false, CancellationToken.None);
Thread.Sleep(200);
}
if (bytesLeft <= BUFFER && bytesLeft >= 0)
{
await socket.SendAsync(new ArraySegment<byte>(Encoding.UTF8.GetBytes(RandomString(bytesLeft))), responseType, true, CancellationToken.None);
Thread.Sleep(500);
}
}
}
public bool IsReusable
{
get
{
return false;
}
}
public string RandomString(int size)
{
if (size < 1)
return string.Empty;
Random random = new Random((int)DateTime.Now.Ticks);
StringBuilder builder = new StringBuilder();
char ch;
for (int i = 0; i < size; i++)
{
ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
builder.Append(ch);
}
return builder.ToString();
}
}