示例#1
0
        public void TotMessageTest()
        {
            Assert.Equal(TotPurpose.Ping, TotPing.Instance.Purpose);
            Assert.Equal(TotPurpose.Pong, TotPong.Instance(TotMessageId.Random).Purpose);

            Assert.Equal(TotPurpose.Success, TotResponse.Success(TotMessageId.Random).Purpose);
            Assert.Equal(TotPurpose.BadRequest, TotResponse.BadRequest(TotMessageId.Random).Purpose);
            Assert.Equal(TotPurpose.VersionMismatch, TotResponse.VersionMismatch(TotMessageId.Random).Purpose);
            Assert.Equal(TotPurpose.UnsuccessfulRequest, TotResponse.UnsuccessfulRequest(TotMessageId.Random).Purpose);

            var x = new TotRequest("status");

            Assert.Equal(97, x.GetLastCellFullnessPercentage());
            Assert.Equal(1, x.GetNumberOfCells());
            Assert.Equal(497, x.GetNumberOfDummyBytesInLastCell());

            var messages = TotMessageBase.SplitByMessages(ByteHelpers.Combine(
                                                              TotPing.Instance.ToBytes(),
                                                              TotPong.Instance(TotMessageId.Random).ToBytes(),
                                                              TotResponse.BadRequest(TotMessageId.Random).ToBytes(),
                                                              TotResponse.Success(TotMessageId.Random).ToBytes(),
                                                              TotResponse.UnsuccessfulRequest(TotMessageId.Random).ToBytes(),
                                                              TotResponse.VersionMismatch(TotMessageId.Random).ToBytes(),
                                                              new TotRequest("fooPurpose", new TotContent("foo content")).ToBytes()));

            Assert.Equal(7, messages.Count());
        }
示例#2
0
        private async Task ListenNetworkStreamAsync()
        {
            while (true)
            {
                try
                {
                    var bufferSize   = TcpClient.ReceiveBufferSize;
                    var buffer       = new byte[bufferSize];
                    var stream       = TcpClient.GetStream();
                    var receiveCount = await stream.ReadAsync(buffer, 0, bufferSize).ConfigureAwait(false);                     // TcpClient.Disposep() will trigger ObjectDisposedException

                    if (receiveCount <= 0)
                    {
                        throw new ConnectionException($"Client lost connection.");
                    }

                    // if we could fit everything into our buffer, then we get our message
                    if (!stream.DataAvailable)
                    {
                        foreach (var messageBytes in TotMessageBase.SplitByMessages(buffer.Take(receiveCount).ToArray()))
                        {
                            ProcessMessageBytesAsync(messageBytes);
                        }
                        continue;
                    }

                    // while we have data available, start building a bytearray
                    var builder = new ByteArrayBuilder();
                    builder.Append(buffer.Take(receiveCount).ToArray());
                    while (stream.DataAvailable)
                    {
                        Array.Clear(buffer, 0, buffer.Length);
                        receiveCount = await stream.ReadAsync(buffer, 0, bufferSize).ConfigureAwait(false);

                        if (receiveCount <= 0)
                        {
                            throw new ConnectionException($"Client lost connection.");
                        }
                        builder.Append(buffer.Take(receiveCount).ToArray());
                    }

                    foreach (var messageBytes in TotMessageBase.SplitByMessages(builder.ToArray()))
                    {
                        ProcessMessageBytesAsync(messageBytes);
                    }
                    continue;
                }
                catch (ObjectDisposedException ex)
                {
                    // If TcpListener.Stop() is called, this exception will be triggered.
                    Logger.LogInfo <TotClient>("Client is disposed incoming connections.");
                    Logger.LogTrace <TotClient>(ex);
                    OnDisconnected(ex);
                    return;
                }
                catch (ConnectionException ex)
                {
                    Logger.LogDebug <TotClient>(ex, LogLevel.Debug);

                    OnDisconnected(ex);
                    await Task.Delay(3000).ConfigureAwait(false);                     // wait 3 sec, then retry
                }
                catch (IOException ex)
                {
                    Logger.LogDebug <TotClient>(ex, LogLevel.Debug);

                    OnDisconnected(ex);
                    await Task.Delay(3000).ConfigureAwait(false);                     // wait 3 sec, then retry
                }
                catch (Exception ex)
                {
                    Logger.LogWarning <TotClient>(ex, LogLevel.Debug);

                    OnDisconnected(ex);
                    await Task.Delay(3000).ConfigureAwait(false);                     // wait 3 sec, then retry
                }
            }
        }