using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
public class VoiceChatClient
{
private ClientWebSocket _mediaWs;
private ClientWebSocket _chatWs;
private readonly string _token;
private readonly string _host;
public VoiceChatClient(string token)
{
_token = token;
_host = "voice-chat-socket.med2lab.com";
_mediaWs = new ClientWebSocket();
_chatWs = new ClientWebSocket();
}
public async Task ConnectAsync()
{
// Connect to Media Stream
var mediaUri = new Uri($"wss://{_host}/media-stream?token={_token}&topic_id=102");
await _mediaWs.ConnectAsync(mediaUri, CancellationToken.None);
// Start receiving messages
_ = ReceiveMessagesAsync(_mediaWs);
}
private async Task ReceiveMessagesAsync(ClientWebSocket ws)
{
var buffer = new byte[4096];
try
{
while (ws.State == WebSocketState.Open)
{
var result = await ws.ReceiveAsync(
new ArraySegment<byte>(buffer), CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Text)
{
var message = Encoding.UTF8.GetString(buffer, 0, result.Count);
Console.WriteLine($"Received text: {message}");
}
else if (result.MessageType == WebSocketMessageType.Binary)
{
// Handle binary audio data
var audioData = new byte[result.Count];
Array.Copy(buffer, audioData, result.Count);
// Process audio...
}
else if (result.MessageType == WebSocketMessageType.Close)
{
await ws.CloseAsync(WebSocketCloseStatus.NormalClosure,
string.Empty, CancellationToken.None);
break;
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
public async Task SendAudioAsync(byte[] audioData)
{
if (_mediaWs.State == WebSocketState.Open)
{
await _mediaWs.SendAsync(
new ArraySegment<byte>(audioData),
WebSocketMessageType.Binary,
true,
CancellationToken.None);
}
}
public async Task CloseAsync()
{
if (_mediaWs.State == WebSocketState.Open)
await _mediaWs.CloseAsync(WebSocketCloseStatus.NormalClosure,
string.Empty, CancellationToken.None);
if (_chatWs.State == WebSocketState.Open)
await _chatWs.CloseAsync(WebSocketCloseStatus.NormalClosure,
string.Empty, CancellationToken.None);
}
}
// Usage example:
// var client = new VoiceChatClient("your_auth_token");
// await client.ConnectAsync();
// await client.SendAudioAsync(audioData);
// await client.CloseAsync();