У меня есть поток, который будет неоднократно опрашивать этот ClientWebSocket, вызывая функция.
Код: Выделить всё
poll_thread = new Thread(poll);
poll_thread.Start();
Код: Выделить всё
private async void poll() {
while (true) {
// Wait 16 ms (1/60 of a second) before making another polling attempt.
Thread.Sleep(16);
switch (web_socket.State) {
case WebSocketState.Open: {
if (socket_connected == false) { socket_connected = true; }
try {
// RecieveAsync automatically polls and recieves the packet.
Memory memory = new Memory(new Byte[1024]);
Console.WriteLine("Awaiting started");
ValueWebSocketReceiveResult result = await web_socket.ReceiveAsync(memory, CancellationToken.None);
Console.WriteLine("Awaiting ended");
// Only attempt deserialization if a packet was recieved, aka the buffer is not empty.
if (result.Count != 0) {
deserialize_event(memory.Slice(0, result.Count).ToArray());
}
} catch (Exception exception) {
Console.WriteLine("Pusher polling error: " + exception.ToString());
}
} break;
case WebSocketState.Closed: {
connection_closed(web_socket.CloseStatus);
} break;
}
}
}
Вывод консоли
Как видно из вывода консоли, после первого получения данных и попытки опроса опять же, результат ValueWebSocketReceiveResult = await web_socket.ReceiveAsync(memory, CancellationToken.None); фактически никогда не завершает ожидание.
Если программа остается запущенной, в конечном итоге она вызывает исключение в этой строке
Код: Выделить всё
System.Net.WebSockets.WebSocketException: 'The remote party closed the WebSocket connection without completing the close handshake.'Реализация GDScript выглядит аналогично реализация C#.
Код: Выделить всё
func poll() -> void:
socket.poll()
match socket.get_ready_state():
WebSocketPeer.STATE_OPEN:
while socket.get_available_packet_count():
if not socket_connected:
socket_connected = true
call(&"emit_signal", &"connection_established")
var packet: PackedByteArray = socket.get_packet()
print(packet.size())
handle_event(packet)
WebSocketPeer.STATE_CLOSING:
# Keep polling to achieve proper close.
return
WebSocketPeer.STATE_CLOSED:
socket_connected = false
call(&"emit_signal", &"connection_closed", socket.get_close_code())
Подробнее здесь: https://stackoverflow.com/questions/788 ... r-returnin
Мобильная версия