fixed: websocket server wrong execution thread
This commit is contained in:
@@ -5,7 +5,6 @@ namespace Ragon.Core.Game;
|
|||||||
|
|
||||||
public class EntityState
|
public class EntityState
|
||||||
{
|
{
|
||||||
private Logger _logger = LogManager.GetCurrentClassLogger();
|
|
||||||
private List<EntityStateProperty> _properties;
|
private List<EntityStateProperty> _properties;
|
||||||
private Entity _entity;
|
private Entity _entity;
|
||||||
|
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ public class EntityStateProperty
|
|||||||
public ReadOnlySpan<byte> Read()
|
public ReadOnlySpan<byte> Read()
|
||||||
{
|
{
|
||||||
var dataSpan = _data.AsSpan();
|
var dataSpan = _data.AsSpan();
|
||||||
|
var src = dataSpan.Slice(0, Size);
|
||||||
return dataSpan.Slice(0, Size);
|
return src;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Write(ref ReadOnlySpan<byte> src)
|
public void Write(ref ReadOnlySpan<byte> src)
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ public sealed class EntityStateHandler: IHandler
|
|||||||
for (var entityIndex = 0; entityIndex < entitiesCount; entityIndex++)
|
for (var entityIndex = 0; entityIndex < entitiesCount; entityIndex++)
|
||||||
{
|
{
|
||||||
var entityId = reader.ReadUShort();
|
var entityId = reader.ReadUShort();
|
||||||
|
|
||||||
if (room.Entities.TryGetValue(entityId, out var entity))
|
if (room.Entities.TryGetValue(entityId, out var entity))
|
||||||
{
|
{
|
||||||
entity.State.Read(reader);
|
entity.State.Read(reader);
|
||||||
|
|||||||
@@ -76,6 +76,6 @@ public sealed class JoinOrCreateHandler : IHandler
|
|||||||
var sendData = writer.ToArray();
|
var sendData = writer.ToArray();
|
||||||
player.Connection.Reliable.Send(sendData);
|
player.Connection.Reliable.Send(sendData);
|
||||||
|
|
||||||
_logger.Trace($"Joined to room {room.Id}");
|
_logger.Trace($"{player.Connection.Id}|{player.Name} joined to room {room.Id}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -36,10 +36,11 @@ public sealed class SceneLoadedHandler : IHandler
|
|||||||
entity.State.AddProperty(new EntityStateProperty(propertySize, propertyType));
|
entity.State.AddProperty(new EntityStateProperty(propertySize, propertyType));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_logger.Trace($"Player {context.Connection.Id}|{context.LobbyPlayer.Name} created entity {entity.Id}:{entity.Type}");
|
||||||
room.AttachEntity(player, entity);
|
room.AttachEntity(player, entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.Trace($"Player {context.Connection.Id}|{context.LobbyPlayer.Name} loaded with {statics} scene entities");
|
_logger.Trace($"Player {context.Connection.Id}|{context.LobbyPlayer.Name} loaded");
|
||||||
|
|
||||||
room.WaitPlayersList.Add(player);
|
room.WaitPlayersList.Add(player);
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ namespace Ragon.Server.ENet
|
|||||||
_host.Create(address, _connections.Length, 2, 0, 0, 1024 * 1024);
|
_host.Create(address, _connections.Length, 2, 0, 0, 1024 * 1024);
|
||||||
|
|
||||||
var protocolDecoded = RagonVersion.Parse(_protocol);
|
var protocolDecoded = RagonVersion.Parse(_protocol);
|
||||||
_logger.Info($"Network listening on {configuration.Port}");
|
_logger.Info($"Listen at 127.0.0.1:{configuration.Port}");
|
||||||
_logger.Info($"Protocol: {protocolDecoded}");
|
_logger.Info($"Protocol: {protocolDecoded}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,17 +19,18 @@ public class NativeWebSocketServer : INetworkServer
|
|||||||
private Executor _executor;
|
private Executor _executor;
|
||||||
private HttpListener _httpListener;
|
private HttpListener _httpListener;
|
||||||
private WebSocketConnection[] _connections;
|
private WebSocketConnection[] _connections;
|
||||||
private ushort _lastPeerId;
|
private List<WebSocketConnection> _activeConnections;
|
||||||
private CancellationTokenSource _cancellationTokenSource;
|
private CancellationTokenSource _cancellationTokenSource;
|
||||||
|
|
||||||
public NativeWebSocketServer(Executor executor)
|
public NativeWebSocketServer(Executor executor)
|
||||||
{
|
{
|
||||||
_sequencer = new Stack<ushort>();
|
_sequencer = new Stack<ushort>();
|
||||||
_connections = Array.Empty<WebSocketConnection>();
|
_connections = Array.Empty<WebSocketConnection>();
|
||||||
|
_activeConnections = new List<WebSocketConnection>();
|
||||||
_executor = executor;
|
_executor = executor;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task StartAccept(CancellationToken cancellationToken)
|
public async void StartAccept(CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
while (!cancellationToken.IsCancellationRequested)
|
while (!cancellationToken.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
@@ -42,15 +43,16 @@ public class NativeWebSocketServer : INetworkServer
|
|||||||
var peerId = _sequencer.Pop();
|
var peerId = _sequencer.Pop();
|
||||||
var connection = new WebSocketConnection(webSocket, peerId);
|
var connection = new WebSocketConnection(webSocket, peerId);
|
||||||
|
|
||||||
_lastPeerId = peerId;
|
|
||||||
_connections[peerId] = connection;
|
_connections[peerId] = connection;
|
||||||
_networkListener.OnConnected(connection);
|
StartListen(connection, cancellationToken);
|
||||||
_executor.Run(StartListen(connection, cancellationToken));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async Task StartListen(WebSocketConnection connection, CancellationToken cancellationToken)
|
async void StartListen(WebSocketConnection connection, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
|
_activeConnections.Add(connection);
|
||||||
|
_networkListener.OnConnected(connection);
|
||||||
|
|
||||||
var webSocket = connection.Socket;
|
var webSocket = connection.Socket;
|
||||||
var bytes = new byte[2048];
|
var bytes = new byte[2048];
|
||||||
var buffer = new Memory<byte>(bytes);
|
var buffer = new Memory<byte>(bytes);
|
||||||
@@ -72,19 +74,20 @@ public class NativeWebSocketServer : INetworkServer
|
|||||||
}
|
}
|
||||||
|
|
||||||
_sequencer.Push(connection.Id);
|
_sequencer.Push(connection.Id);
|
||||||
|
_activeConnections.Remove(connection);
|
||||||
_networkListener.OnDisconnected(connection);
|
_networkListener.OnDisconnected(connection);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async void Poll()
|
public void Poll()
|
||||||
{
|
{
|
||||||
foreach (var conn in _connections)
|
Flush();
|
||||||
{
|
}
|
||||||
if (conn != null)
|
|
||||||
|
public async void Flush()
|
||||||
{
|
{
|
||||||
|
foreach (var conn in _activeConnections)
|
||||||
await conn.Flush();
|
await conn.Flush();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Start(
|
public void Start(
|
||||||
INetworkListener listener,
|
INetworkListener listener,
|
||||||
@@ -106,10 +109,10 @@ public class NativeWebSocketServer : INetworkServer
|
|||||||
_httpListener.Prefixes.Add($"http://127.0.0.1:{configuration.Port}/");
|
_httpListener.Prefixes.Add($"http://127.0.0.1:{configuration.Port}/");
|
||||||
_httpListener.Start();
|
_httpListener.Start();
|
||||||
|
|
||||||
_executor.Run(StartAccept(_cancellationTokenSource.Token));
|
_executor.Run(() => StartAccept(_cancellationTokenSource.Token));
|
||||||
|
|
||||||
var protocolDecoded = RagonVersion.Parse(configuration.Protocol);
|
var protocolDecoded = RagonVersion.Parse(configuration.Protocol);
|
||||||
_logger.Info($"Network listening on http://*:{configuration.Port}/");
|
_logger.Info($"Listen at http://*:{configuration.Port}/");
|
||||||
_logger.Info($"Protocol: {protocolDecoded}");
|
_logger.Info($"Protocol: {protocolDecoded}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,9 +9,9 @@ public class Executor: TaskScheduler
|
|||||||
private Queue<Task> _pendingTasks;
|
private Queue<Task> _pendingTasks;
|
||||||
private TaskFactory _taskFactory;
|
private TaskFactory _taskFactory;
|
||||||
|
|
||||||
public void Run(Task task)
|
public void Run(Action action)
|
||||||
{
|
{
|
||||||
_taskFactory.StartNew(() => task);
|
_taskFactory.StartNew(action);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Executor()
|
public Executor()
|
||||||
|
|||||||
@@ -6,14 +6,12 @@
|
|||||||
|
|
||||||
Ragon is fully free, small and high perfomance room based game server with plugin based architecture.
|
Ragon is fully free, small and high perfomance room based game server with plugin based architecture.
|
||||||
|
|
||||||
<a href="https://ragon-server.com/docs/category/basics">Documentation</a>
|
<a href="http://localhost:3000/docs/installation">Documentation</a>
|
||||||
<br>
|
|
||||||
<a href="https://ragon-server.com/docs/get-started">Get started</a>
|
|
||||||
|
|
||||||
### Features:
|
### Features:
|
||||||
- Effective
|
- Effective
|
||||||
- Free
|
- Free
|
||||||
- Simple matchmaking
|
- Lobby
|
||||||
- Room based architecture
|
- Room based architecture
|
||||||
- Сustomizable authorization
|
- Сustomizable authorization
|
||||||
- Сustomizable server-side logic via plugins with flexible API*(2)
|
- Сustomizable server-side logic via plugins with flexible API*(2)
|
||||||
@@ -33,5 +31,4 @@ MIT
|
|||||||
|
|
||||||
### Tips
|
### Tips
|
||||||
\* Limited to 4095 CCU by library ENet-Sharp (1)
|
\* Limited to 4095 CCU by library ENet-Sharp (1)
|
||||||
|
|
||||||
\* Non finally (2)
|
\* Non finally (2)
|
||||||
|
|||||||
Reference in New Issue
Block a user