< Summary - ReFlex - Library

Information
Class: ReFlex.Core.Networking.Components.NetworkServer
Assembly: ReFlex.Core.Networking
File(s): D:\a\reflex\reflex\library\src\Core\Networking\Components\NetworkServer.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 108
Coverable lines: 108
Total lines: 187
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 38
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
.cctor()100%210%
get_Type()100%210%
get_IsReady()100%210%
get_IsStarted()100%210%
get_Id()100%210%
get_Address()100%210%
set_Address(...)0%4260%
get_Port()100%210%
get_Endpoint()100%210%
Init(...)0%620%
OnClientMessageReceived(...)100%210%
Start()0%4260%
Stop()0%2040%
Broadcast(...)0%2040%
Broadcast(...)0%620%
Broadcast(...)0%620%
Decode(...)100%210%
BroadcastAsync()0%4260%
BroadcastAsync()0%4260%
SendAsync()100%210%
SendAsync()100%210%

File(s)

D:\a\reflex\reflex\library\src\Core\Networking\Components\NetworkServer.cs

#LineLine coverage
 1using System;
 2using System.Linq;
 3using System.Net;
 4using System.Text;
 5using System.Threading.Tasks;
 6using NLog;
 7using ReFlex.Core.Common.Components;
 8using ReFlex.Core.Networking.Interfaces;
 9using ReFlex.Core.Networking.Util;
 10using WatsonTcp;
 11
 12namespace ReFlex.Core.Networking.Components
 13{
 14    public class NetworkServer : IServer
 15    {
 016        private readonly Guid _serverId = Guid.NewGuid();
 17
 018        private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
 19
 20        private WatsonTcpServer _server;
 21        private IPAddress _address;
 22        private int _port;
 23
 024        public NetworkInterface Type => NetworkInterface.Tcp;
 25
 026        public bool IsReady => _server != null;
 27
 028        public bool IsStarted { get; private set; }
 29
 030        public string Id => _serverId.ToString();
 31
 32        public string Address
 33        {
 034            get => $"{_address}:{_port}";
 35            set
 036            { var p1 = value.IndexOf(':');
 37
 038                var address = _address != null ? _address.ToString() : "";
 39
 040                if (p1 > 0)
 041                {
 042                    address =  value.Substring(0, p1);
 043                }
 44
 045                var portStr = value.Substring(p1 + 1);
 046                var p2 = portStr.IndexOf('/');
 047                if (p2 > 0)
 048                {
 049                    portStr = portStr.Substring(0, p2);
 050                }
 51
 052                var success = int.TryParse(portStr, out var port);
 53
 054                Stop();
 55
 056                Init(address, port);
 057            }
 58        }
 59
 060        public string Port => _port.ToString();
 61
 062        public string Endpoint => "";
 63
 064        public NetworkServer(string ipAddress, int port)
 065        {
 066            Init(ipAddress, port);
 067        }
 68
 69        private void Init(string ipAddress, int port)
 070        {
 071            var success = IPAddress.TryParse(ipAddress, out _address);
 072            if (!success)
 073                throw new ArgumentOutOfRangeException($"Provided IP Address {ipAddress} is not valid for {GetType().Name
 74
 075            _port = port;
 76
 077            _server = new WatsonTcpServer(_address.ToString(), _port);
 078            _server.Events.MessageReceived += OnClientMessageReceived;
 079        }
 80
 81        private void OnClientMessageReceived(object sender, MessageReceivedEventArgs e)
 082        {
 083            Logger.Debug($"client from {e.Client.IpPort} sent data: {Encoding.UTF8.GetString(e.Data)}{Environment.NewLin
 084        }
 85
 86        public void Start()
 087        {
 088            if (IsStarted)
 089                return;
 90
 091            if (_server == null)
 092                Init(_address.ToString(), _port);
 93
 094            if (_server == null)
 095                return;
 96
 097            _server.Start();
 098            _server.Events.MessageReceived+= OnClientMessageReceived;
 099            IsStarted = true;
 0100        }
 101
 102        public void Stop()
 0103        {
 0104            if (!IsStarted || _server == null)
 0105                return;
 106
 107
 0108            _server.Events.MessageReceived-= OnClientMessageReceived;
 0109            _server.Dispose();
 0110            _server = null;
 0111            IsStarted = false;
 0112        }
 113
 114        public void Broadcast(object data)
 0115        {
 0116            if (!IsReady || !IsStarted)
 0117                return;
 118
 0119            var json = SerializationUtils.SerializeToJson(data);
 0120            Broadcast(json);
 0121        }
 122
 123        public void Broadcast(byte[] data)
 0124        {
 0125            var success = Task.Run(() => BroadcastAsync(data)).GetAwaiter().GetResult();
 0126            if (!success)
 0127            {
 0128              Logger.Warn($"broadcast data of length {data.Length} to {Address} failed.");
 0129            }
 0130        }
 131
 132        public void Broadcast(string message)
 0133        {
 0134          var success = Task.Run(() => BroadcastAsync(message)).GetAwaiter().GetResult();
 0135          if (!success)
 0136          {
 0137            Logger.Warn($"broadcast message {message} to {Address} failed.");
 0138          }
 0139        }
 140
 0141        public static byte[] Decode(string message) => Encoding.UTF8.GetBytes(message);
 142
 143        private async Task<bool> BroadcastAsync(string message)
 0144        {
 145          // @todo: refactor duplicate code
 0146          var result = true;
 147
 0148          if (!IsReady || !IsStarted)
 0149            return false;
 150
 0151          foreach (var client in _server.ListClients().ToList())
 0152          {
 0153            var success = await SendAsync(client.Guid, message);
 0154            result = result && success;
 0155          }
 156
 0157          return result;
 0158        }
 159
 160        private async Task<bool> BroadcastAsync(byte[] data)
 0161        {
 0162          var result = true;
 163
 0164          if (!IsReady || !IsStarted)
 0165            return false;
 166
 0167          foreach (var client in _server.ListClients().ToList())
 0168          {
 0169            var success = await SendAsync(client.Guid, data);
 0170            result = result && success;
 0171          }
 172
 0173          return result;
 0174        }
 175
 176        private async Task<bool> SendAsync(Guid clientId,string message)
 0177        {
 0178            return await _server.SendAsync(clientId, message);
 0179        }
 180
 181        private async Task<bool> SendAsync(Guid clientId,byte[] data)
 0182        {
 0183          return await _server.SendAsync(clientId, data);
 0184        }
 185
 186    }
 187}