Files
CrystalConnector/ConnectorTest/Program.cs
T
秋雨落 9695222e42 ✨ It works!
Signed-off-by: 秋雨落 <i@rain.cx>
2023-09-17 18:47:46 +08:00

164 lines
4.6 KiB
C#

using System.Formats.Cbor;
using System.Net.WebSockets;
var webSocket = new ClientWebSocket();
var cborWriter = new CborWriter();
while (true)
{
try
{
await Process();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
async Task Receive()
{
var buffer = new byte[1024 * 4];
var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
while (!result.CloseStatus.HasValue)
{
var reader = new CborReader(new ReadOnlyMemory<byte>(buffer, 0, result.Count));
Console.WriteLine("Response length: " + reader.BytesRemaining);
reader.ReadStartArray();
Console.WriteLine("Result: " + reader.ReadTextString());
result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
}
}
async Task Process()
{
Console.Write("> ");
var operation = Console.ReadLine();
if (operation == "")
{
return;
}
if (operation == "connect")
{
var uri = Console.ReadLine();
await webSocket.ConnectAsync(new Uri(uri!), CancellationToken.None);
new Thread(() => Receive()).Start();
}
else if (operation == "message")
{
cborWriter.Reset();
cborWriter.WriteStartArray(null);
}
else if (operation == "send")
{
cborWriter.WriteEndArray();
var bytes = cborWriter.Encode();
await webSocket.SendAsync(bytes, WebSocketMessageType.Binary, true, CancellationToken.None);
}
else if (operation == "bye")
{
await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
webSocket = new ClientWebSocket();
}
else if (operation == "help")
{
Console.WriteLine("Every space should use enter.");
Console.WriteLine("Connect to a server: connect <uri>");
Console.WriteLine("New message: message");
Console.WriteLine("Send message: send");
Console.WriteLine("Close websocket: bye");
Console.WriteLine("Insert data: data <type> <value>");
}
else if (operation == "data")
{
var type = Console.ReadLine();
var valueStr = Console.ReadLine();
if (type == "string")
{
cborWriter.WriteTextString(valueStr!);
}
else if (type == "byte")
{
var bytes = Convert.FromBase64String(valueStr);
cborWriter.WriteByteString(bytes);
}
else if (type == "int")
{
var result = int.TryParse(valueStr, out var value);
while (!result)
{
valueStr = Console.ReadLine();
result = int.TryParse(valueStr, out value);
}
cborWriter.WriteInt32(value);
}
else if (type == "long")
{
var result = long.TryParse(valueStr, out var value);
while (!result)
{
valueStr = Console.ReadLine();
result = long.TryParse(valueStr, out value);
}
cborWriter.WriteInt64(value);
}
else if (type == "bool")
{
var result = bool.TryParse(valueStr, out var value);
while (!result)
{
valueStr = Console.ReadLine();
result = bool.TryParse(valueStr, out value);
}
cborWriter.WriteBoolean(value);
}
else if (type == "float")
{
var result = float.TryParse(valueStr, out var value);
while (!result)
{
valueStr = Console.ReadLine();
result = float.TryParse(valueStr, out value);
}
cborWriter.WriteSingle(value);
}
else if (type == "double")
{
var result = double.TryParse(valueStr, out var value);
while (!result)
{
valueStr = Console.ReadLine();
result = double.TryParse(valueStr, out value);
}
cborWriter.WriteDouble(value);
}
else if (type == "decimal")
{
var result = decimal.TryParse(valueStr, out var value);
while (!result)
{
valueStr = Console.ReadLine();
result = decimal.TryParse(valueStr, out value);
}
cborWriter.WriteDecimal(value);
}
else if (type == "null")
{
cborWriter.WriteNull();
}
}
Console.WriteLine("Done!");
}