77 lines
2.5 KiB
C#
77 lines
2.5 KiB
C#
// Copyright (c) .NET Foundation. All rights reserved.
|
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
|
|
using System;
|
|
using System.Net.WebSockets;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace WebSocketSample
|
|
{
|
|
public class Program
|
|
{
|
|
public static async Task<int> Main(string[] args)
|
|
{
|
|
if (args.Length < 1)
|
|
{
|
|
Console.Error.WriteLine("Usage: WebSocketSample <URL>");
|
|
Console.Error.WriteLine("");
|
|
Console.Error.WriteLine("To connect to an ASP.NET Connection Handler, use 'ws://example.com/path/to/hub' or 'wss://example.com/path/to/hub' (for HTTPS)");
|
|
return 1;
|
|
}
|
|
|
|
await RunWebSockets(args[0]);
|
|
return 0;
|
|
}
|
|
|
|
private static async Task RunWebSockets(string url)
|
|
{
|
|
var ws = new ClientWebSocket();
|
|
await ws.ConnectAsync(new Uri(url), CancellationToken.None);
|
|
|
|
Console.WriteLine("Connected");
|
|
|
|
var sending = Task.Run(async () =>
|
|
{
|
|
string line;
|
|
while ((line = Console.ReadLine()) != null)
|
|
{
|
|
var bytes = Encoding.UTF8.GetBytes(line);
|
|
await ws.SendAsync(new ArraySegment<byte>(bytes), WebSocketMessageType.Text, endOfMessage: true, cancellationToken: CancellationToken.None);
|
|
}
|
|
|
|
await ws.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
|
|
});
|
|
|
|
var receiving = Receiving(ws);
|
|
|
|
await Task.WhenAll(sending, receiving);
|
|
}
|
|
|
|
private static async Task Receiving(ClientWebSocket ws)
|
|
{
|
|
var buffer = new byte[2048];
|
|
|
|
while (true)
|
|
{
|
|
var result = await ws.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
|
|
|
|
if (result.MessageType == WebSocketMessageType.Text)
|
|
{
|
|
Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, result.Count));
|
|
}
|
|
else if (result.MessageType == WebSocketMessageType.Binary)
|
|
{
|
|
}
|
|
else if (result.MessageType == WebSocketMessageType.Close)
|
|
{
|
|
await ws.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
|
|
break;
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|