diff --git a/SimpleTCP.Tests/CommTest.cs b/SimpleTCP.Tests/CommTest.cs index 37040a3..0bcab44 100644 --- a/SimpleTCP.Tests/CommTest.cs +++ b/SimpleTCP.Tests/CommTest.cs @@ -2,6 +2,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Collections.Generic; using System.Linq; +using System.Text; namespace SimpleTCP.Tests { @@ -69,7 +70,41 @@ public void SimpleCommTest() Assert.IsTrue(true); - + + } + + + [TestMethod] + public void MultipleClientsTransmittingToSameServerTest() + { + SimpleTcpServer server = new SimpleTcpServer().Start(8911); + server.Delimiter = Encoding.UTF8.GetBytes("0")[0]; + SimpleTcpClient client1 = new SimpleTcpClient().Connect(server.GetListeningIPs().FirstOrDefault(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).ToString(), 8911); + SimpleTcpClient client2 = new SimpleTcpClient().Connect(server.GetListeningIPs().FirstOrDefault(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).ToString(), 8911); + + System.Threading.Thread.Sleep(1000); + if (server.ConnectedClientsCount < 2) + { + Assert.Fail("Server did not register 2 connected clients"); + } + + string dataRecievedByServer = ""; + server.DelimiterDataReceived += (sender, msg) => + { + dataRecievedByServer += msg.MessageString; + }; + + client1.Write("1111"); + System.Threading.Thread.Sleep(100); + client2.Write("2222"); + System.Threading.Thread.Sleep(100); + client1.Write("0"); + + System.Threading.Thread.Sleep(1000); + + Assert.AreEqual("1111", dataRecievedByServer); + + server.Stop(); } } } diff --git a/SimpleTCP/Server/ServerListener.cs b/SimpleTCP/Server/ServerListener.cs index 7f39d97..b4acf05 100644 --- a/SimpleTCP/Server/ServerListener.cs +++ b/SimpleTCP/Server/ServerListener.cs @@ -15,7 +15,7 @@ internal class ServerListener private List _connectedClients = new List(); private List _disconnectedClients = new List(); private SimpleTcpServer _parent = null; - private List _queuedMsg = new List(); + private Dictionary> _clientBuffers = new Dictionary>(); private byte _delimiter = 0x13; private Thread _rxThread = null; @@ -113,12 +113,12 @@ private void RunLoopStep() foreach (var c in _connectedClients) { - - if ( IsSocketConnected(c.Client) == false) + + if (IsSocketConnected(c.Client) == false) { _disconnectedClients.Add(c); } - + int bytesAvailable = c.Available; if (bytesAvailable == 0) { @@ -134,14 +134,21 @@ private void RunLoopStep() c.Client.Receive(nextByte, 0, 1, SocketFlags.None); bytesReceived.AddRange(nextByte); + string clientKey = c.Client.RemoteEndPoint.ToString(); + if (!_clientBuffers.ContainsKey(clientKey)) + { + _clientBuffers.Add(clientKey, new List()); + } + + List clientBuffer = _clientBuffers[clientKey]; if (nextByte[0] == _delimiter) { - byte[] msg = _queuedMsg.ToArray(); - _queuedMsg.Clear(); + byte[] msg = clientBuffer.ToArray(); + clientBuffer.Clear(); _parent.NotifyDelimiterMessageRx(this, c, msg); } else { - _queuedMsg.AddRange(nextByte); + clientBuffer.AddRange(nextByte); } }