예제 #1
0
        private void Server_MessageFromClient(object sender, MessageFromClientEventArgs e)
        {
            int    clientId = e.ClientId;
            string msg      = Encoding.Default.GetString(e.RawMessage);

            Log("Client " + e.ClientId.ToString() + ": " + msg);
        }
예제 #2
0
        private async void ServOnOnMessageReceived(object?sender, MessageFromClientEventArgs e)
        {
            try
            {
                switch (e.Message.Type)
                {
                case NetworkOperation.Identifer:
                    var id = Encoding.UTF8.GetString(e.Message.Data);
                    LogMessage("Recived Id {Id}", id);

                    if (_pendingOperations.TryGetValue(id, out var op))
                    {
                        LogMessage("Id Accepted {Id}", id);
                        op.EndpointId = e.Client;


                        LogMessage("Bind {Id} To {Client}", id, e.Client);
                        if (!_runningOperations.TryAdd(e.Client, op))
                        {
                            SendDeny(e.Client);
                            op.Dispose();
                        }
                        else
                        {
                            var result = await BuildData(id, op);

                            if (result == null)
                            {
                                SendDeny(e.Client);
                                op.Dispose();
                            }
                            else
                            {
                                LogMessage("Sending Data {Id}", id);
                                var pool = ArrayPool <byte> .Shared;
                                op.Sender = new Sender(result.Zip.Stream, e.Client, _dataServer.Value,
                                                       () => pool.Rent(50_000), bytes => pool.Return(bytes, true),
                                                       exception => LogMessage("Error on Processing Message \"{Message}\" {Id}", exception.Message, id));

                                op.Result = result;
                                op.Sender.ProcessMessage(e.Message);
                            }
                        }

                        _pendingOperations.TryRemove(id, out _);
                    }
                    else
                    {
                        LogMessage("No Operation Found {Id}", id);
                        SendDeny(e.Client);
                    }
                    break;

                default:
                    if (_runningOperations.TryGetValue(e.Client, out var running) && running.Sender != null && running.Result != null)
                    {
                        if (!running.Sender.ProcessMessage(e.Message))
                        {
                            LogMessage("Transmission Compled {Client}", e.Client);
                            running.Result.Compled();
                            running.Dispose();
                        }
                    }
                    else
                    {
                        SendDeny(e.Client);
                    }
                    break;
                }
            }
            catch (Exception exception)
            {
                LogMessage("Error on Processing Message {Error}", exception.Message);
                SendDeny(e.Client);
            }
        }