Код: Выделить всё
class WebSocketServer
{
private static async Task HandleWebSocketAsync(HttpListenerContext context)
{
Console.WriteLine("Client connected");
var wsContext = await context.AcceptWebSocketAsync(null);
WebSocket webSocket = wsContext.WebSocket;
byte[] buffer = new byte[1024];
try
{
while (webSocket.State == WebSocketState.Open)
{
var result = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Text)
{
string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
Console.WriteLine("Received message: " + message);
// Invia un messaggio di risposta al client
string responseMessage = "Echo: " + message;
byte[] responseBuffer = Encoding.UTF8.GetBytes(responseMessage);
await webSocket.SendAsync(new ArraySegment(responseBuffer), WebSocketMessageType.Text, true, CancellationToken.None);
}
}
}
catch (Exception e)
{
Console.WriteLine("Error: " + e.Message);
}
finally
{
if (webSocket != null)
{
webSocket.Dispose();
}
}
}
public static async Task StartServerAsync(string url)
{
HttpListener httpListener = new HttpListener();
httpListener.Prefixes.Add(url);
httpListener.Start();
Console.WriteLine($"WebSocket server listening on {url}");
while (true)
{
try
{
HttpListenerContext context = await httpListener.GetContextAsync();
if (context.Request.IsWebSocketRequest)
{
_ = HandleWebSocketAsync(context); // Non-blocking call
}
else
{
context.Response.StatusCode = 400; // Bad Request
context.Response.Close();
}
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
}
static async Task Main(string[] args)
{
string url = "http://localhost:2080/";
await StartServerAsync(url);
}
}
Код для теста это:
Код: Выделить всё
class WebSocketClient
{
static async Task Main(string[] args)
{
// Indirizzo del server WebSocket
string serverUri = "ws://localhost:2080/"; // Cambia l'URL se necessario
using (ClientWebSocket clientWebSocket = new ClientWebSocket())
{
try
{
// Connessione al server WebSocket
await clientWebSocket.ConnectAsync(new Uri(serverUri), CancellationToken.None);
Console.WriteLine("Connected to WebSocket");
// Invia un messaggio di prova
string message = "Hello, Server!";
byte[] messageBuffer = Encoding.UTF8.GetBytes(message);
await clientWebSocket.SendAsync(new ArraySegment(messageBuffer), WebSocketMessageType.Text, true, CancellationToken.None);
Console.WriteLine($"Sent message: {message}");
// Ricezione della risposta dal server
byte[] receiveBuffer = new byte[1024];
WebSocketReceiveResult result = await clientWebSocket.ReceiveAsync(new ArraySegment(receiveBuffer), CancellationToken.None);
string responseMessage = Encoding.UTF8.GetString(receiveBuffer, 0, result.Count);
Console.WriteLine($"Received message from server: {responseMessage}");
// Chiudere la connessione
await clientWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None);
Console.WriteLine("WebSocket closed");
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
}
}
"Ошибка: сервер вернул код состояния «503», когда код состояния «101» ожидалось.
C:\Users\francesco.mv\OneDrive - Digitronica\Desktop\Scanner_Fra\Solutions\TestSender\bin\Debug\net6.0\TestSender.exe (процесс 16304) завершен с кодом 0."
Я ожидаю, что сообщение будет получено сервером WebSocket. Я также пытался написать аналогичные коды в Javascript с тем же хостом и портом, и они сработали, но когда я пытаюсь ответить то же самое на C#, это не работает.
Подробнее здесь: https://stackoverflow.com/questions/790 ... e-messages
Мобильная версия