/// <summary> /// Creates new instance. /// </summary> /// <param name="name"></param> public Client(string name) { _framer = new LengthPrefixFramer(MaxMessageSize); _framer.MessageReceived += this.OnMessageReceived; this.Name = name; }
public void ReceiveData_Multiple() { var receivedMessages = new List <byte[]>(); var maxMessageSize = 10; var framer = new LengthPrefixFramer(maxMessageSize); framer.MessageReceived += (msg => receivedMessages.Add(msg)); // Create messages var message1 = new byte[] { 1, 2, 3, 4, 5 }; var message2 = new byte[] { 5, 6, 7 }; var message3 = Encoding.UTF8.GetBytes("foobar"); // Put messages into one array var dataList = new List <byte>(); dataList.AddRange(framer.Frame(message1)); dataList.AddRange(framer.Frame(message2)); dataList.AddRange(framer.Frame(message3)); // Receive the array var data = dataList.ToArray(); framer.ReceiveData(data, data.Length); // Check Assert.Equal(3, receivedMessages.Count); Assert.Equal(message1, receivedMessages[0]); Assert.Equal(message2, receivedMessages[1]); Assert.Equal(message3, receivedMessages[2]); }
public void ReceiveData_FragmentedInvalid() { var receivedMessages = new List <byte[]>(); var maxMessageSize = 10; var framer = new LengthPrefixFramer(maxMessageSize); framer.MessageReceived += (msg => receivedMessages.Add(msg)); // Create messages var message1 = new byte[] { 1, 2, 3, 4, 5 }; var message2 = new byte[] { 5, 6, 7 }; var message3 = Encoding.UTF8.GetBytes("foobar too long"); var message4 = Encoding.UTF8.GetBytes("foobar"); // Put messages into one array var dataList = new List <byte>(); dataList.AddRange(framer.Frame(message1)); dataList.AddRange(framer.Frame(message2)); dataList.AddRange(new byte[] { 19, 0, 0, 0 }); dataList.AddRange(message3); dataList.AddRange(framer.Frame(message4)); // Receive data step by step var steps = 3; for (var i = 0; i < dataList.Count; i += steps) { var take = Math.Min(dataList.Count - i, steps); if (take < 0) { continue; } var data = dataList.Skip(i).Take(take).ToArray(); if (i < 18) { framer.ReceiveData(data, data.Length); } else { Assert.Throws <InvalidMessageSizeException>(() => framer.ReceiveData(data, data.Length)); break; } } // Check // After the third message failed due an exception for being // too long, we should've received only the first two. Assert.Equal(2, receivedMessages.Count); Assert.Equal(message1, receivedMessages[0]); Assert.Equal(message2, receivedMessages[1]); }
public void Frame() { var maxMessageSize = 10; var framer = new LengthPrefixFramer(maxMessageSize); // Check result var message = new byte[] { 1, 2, 3, 4, 5 }; Assert.Equal(new byte[] { 9, 0, 0, 0, 1, 2, 3, 4, 5 }, framer.Frame(message)); // Check max size exception var invalidMessage = new byte[maxMessageSize + 1]; Assert.Throws <InvalidMessageSizeException>(() => framer.Frame(invalidMessage)); }
public void ReceiveData_Single() { byte[] receivedMessage = null; var maxMessageSize = 10; var framer = new LengthPrefixFramer(maxMessageSize); framer.MessageReceived += (msg => receivedMessage = msg); var message = new byte[] { 1, 2, 3, 4, 5 }; var data = framer.Frame(message); framer.ReceiveData(data, data.Length); Assert.Equal(message, receivedMessage); }
public void ReceiveData_Fragmented() { var receivedMessages = new List <byte[]>(); var maxMessageSize = 10; var framer = new LengthPrefixFramer(maxMessageSize); framer.MessageReceived += (msg => receivedMessages.Add(msg)); // Check receiving a different amount of bytes each time foreach (var steps in new int[] { 1, 2, 3, 4, 5 }) { // Create messages var message1 = new byte[] { 1, 2, 3, 4, 5 }; var message2 = new byte[] { 5, 6, 7 }; var message3 = Encoding.UTF8.GetBytes("foobar"); // Put messages into one array var dataList = new List <byte>(); dataList.AddRange(framer.Frame(message1)); dataList.AddRange(framer.Frame(message2)); dataList.AddRange(framer.Frame(message3)); // Receive data step by step for (var i = 0; i < dataList.Count; i += steps) { var take = Math.Min(dataList.Count - i, steps); if (take < 0) { continue; } var data = dataList.Skip(i).Take(take).ToArray(); framer.ReceiveData(data, data.Length); } // Check Assert.Equal(3, receivedMessages.Count); Assert.Equal(message1, receivedMessages[0]); Assert.Equal(message2, receivedMessages[1]); Assert.Equal(message3, receivedMessages[2]); receivedMessages.Clear(); } }
/// <summary> /// Creates new instance. /// </summary> public Connection() { _framer = new LengthPrefixFramer(MaxMessageSize); _framer.MessageReceived += this.OnMessageReceived; }
public void DataExchange() { var connections = new List <TestConnection>(); var exceptions = new List <Exception>(); var acceptor = new TcpConnectionAcceptor <TestConnection>(); acceptor.ConnectionAccepted += (conn => connections.Add(conn)); acceptor.AcceptionException += (ex => exceptions.Add(ex)); acceptor.Listen(); var socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); var socket2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket1.Connect("127.0.0.1", acceptor.LocalEndPoint.Port); socket2.Connect("127.0.0.1", acceptor.LocalEndPoint.Port); Wait(50); var message1 = new byte[] { 1, 3, 5, 7 }; var message2 = new byte[] { 8, 52, 45, 6 }; var message3 = Encoding.UTF8.GetBytes("~foobar~"); // Test receiving messages var framer = new LengthPrefixFramer(50); socket1.Send(framer.Frame(message1)); socket1.Send(framer.Frame(message2)); socket2.Send(framer.Frame(message3)); Wait(50); Assert.Equal(2, connections[0].Messages.Count); Assert.Equal(1, connections[1].Messages.Count); Assert.Equal(message1, connections[0].Messages[0]); Assert.Equal(message2, connections[0].Messages[1]); Assert.Equal(message3, connections[1].Messages[0]); // Test receiving invalid message Exception receiveException = null; connections[0].ReceiveException += ((conn, ex) => receiveException = ex); socket1.Send(new byte[] { 0xFF, 0, 0, 0 }); Wait(50); Assert.NotEqual(null, receiveException); Assert.IsType <InvalidMessageSizeException>(receiveException); // Test sending message var message4 = new byte[] { 9, 8, 7, 6 }; connections[1].Send(message4); var buffer = new byte[10]; var len = socket2.Receive(buffer); Console.WriteLine(BitConverter.ToString(buffer)); Assert.Equal(8, len); Assert.Equal(new byte[] { 8, 0, 0, 0, 9, 8, 7, 6, 0, 0 }, buffer); // Close everything foreach (var conn in connections) { conn.Close(); } acceptor.Stop(); }
public TestConnection() { _framer = new LengthPrefixFramer(10); _framer.MessageReceived += this.OnMessageReceived; }