WebSocket Server не получает сообщенияC#

Место общения программистов C#
Ответить
Anonymous
 WebSocket Server не получает сообщения

Сообщение Anonymous »

Я пытаюсь создать и использовать сервер веб-сокетов на C#. Это код для ws:

Код: Выделить всё

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);
}
}
и это работает, потому что в консоли я читаю сообщение: «Сервер WebSocket прослушивает http://localhost:2080/»
Код для теста это:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»