diff --git a/LiveScanServer/LiveScanServer.csproj b/LiveScanServer/LiveScanServer.csproj index f3dcbba..18c2276 100644 --- a/LiveScanServer/LiveScanServer.csproj +++ b/LiveScanServer/LiveScanServer.csproj @@ -65,6 +65,8 @@ SettingsForm.cs + + MainWindowForm.cs diff --git a/LiveScanServer/MainWindowForm.cs b/LiveScanServer/MainWindowForm.cs index 930cebc..f4632a0 100644 --- a/LiveScanServer/MainWindowForm.cs +++ b/LiveScanServer/MainWindowForm.cs @@ -42,6 +42,7 @@ namespace KinectServer static extern float ICP(IntPtr verts1, IntPtr verts2, int nVerts1, int nVerts2, float[] R, float[] t, int maxIter = 200); KinectServer oServer; + TransferServer oTranfserServer; //Those three variables are shared with the OpenGLWindow class and are used to exchange data with it. //Vertices from all of the sensors @@ -82,6 +83,9 @@ namespace KinectServer oServer = new KinectServer(oSettings); oServer.eSocketListChanged += new SocketListChangedHandler(UpdateListView); + oTranfserServer = new TransferServer(); + oTranfserServer.lVertices = lAllVertices; + oTranfserServer.lColors = lAllColors; InitializeComponent(); } @@ -96,6 +100,7 @@ namespace KinectServer stream.Close(); oServer.StopServer(); + oTranfserServer.StopServer(); } //Starts the server @@ -106,11 +111,13 @@ namespace KinectServer if (bServerRunning) { oServer.StartServer(); + oTranfserServer.StartServer(); btStart.Text = "Stop server"; } else { oServer.StopServer(); + oTranfserServer.StopServer(); btStart.Text = "Start server"; } } diff --git a/LiveScanServer/TransferServer.cs b/LiveScanServer/TransferServer.cs new file mode 100644 index 0000000..70ccd06 --- /dev/null +++ b/LiveScanServer/TransferServer.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Threading; + +using System.Net.Sockets; +using System.Net; + + +namespace KinectServer +{ + class TransferServer + { + public List lVertices = new List(); + public List lColors = new List(); + + TcpListener oListener; + List lClientSockets = new List(); + + object oClientSocketLock = new object(); + bool bServerRunning = false; + + public void StartServer() + { + if (!bServerRunning) + { + oListener = new TcpListener(IPAddress.Any, 48002); + oListener.Start(); + + bServerRunning = true; + Thread listeningThread = new Thread(this.ListeningWorker); + listeningThread.Start(); + Thread receivingThread = new Thread(this.ReceivingWorker); + receivingThread.Start(); + } + } + + public void StopServer() + { + if (bServerRunning) + { + bServerRunning = false; + + oListener.Stop(); + lock (oClientSocketLock) + lClientSockets.Clear(); + } + } + + private void ListeningWorker() + { + while (bServerRunning) + { + try + { + TcpClient newClient = oListener.AcceptTcpClient(); + + lock (oClientSocketLock) + { + lClientSockets.Add(new TransferSocket(newClient)); + } + } + catch (SocketException) + { + } + System.Threading.Thread.Sleep(100); + } + } + + private void ReceivingWorker() + { + System.Timers.Timer checkConnectionTimer = new System.Timers.Timer(); + checkConnectionTimer.Interval = 1000; + + checkConnectionTimer.Elapsed += delegate (object sender, System.Timers.ElapsedEventArgs e) + { + lock (oClientSocketLock) + { + for (int i = 0; i < lClientSockets.Count; i++) + { + if (!lClientSockets[i].SocketConnected()) + { + lClientSockets.RemoveAt(i); + i--; + } + } + } + }; + + checkConnectionTimer.Start(); + + while (bServerRunning) + { + lock (oClientSocketLock) + { + for (int i = 0; i < lClientSockets.Count; i++) + { + byte[] buffer = lClientSockets[i].Receive(1); + + while (buffer.Length != 0) + { + if (buffer[0] == 0) + { + lock (lVertices) + { + lClientSockets[i].SendFrame(lVertices, lColors); + } + } + + buffer = lClientSockets[i].Receive(1); + } + } + } + + Thread.Sleep(10); + } + + checkConnectionTimer.Stop(); + } + } +} diff --git a/LiveScanServer/TransferSocket.cs b/LiveScanServer/TransferSocket.cs new file mode 100644 index 0000000..9d2c141 --- /dev/null +++ b/LiveScanServer/TransferSocket.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using System.Net.Sockets; +using System.Runtime.Serialization.Formatters.Binary; + +namespace KinectServer +{ + class TransferSocket + { + TcpClient oSocket; + + public TransferSocket(TcpClient clientSocket) + { + oSocket = clientSocket; + } + + public byte[] Receive(int nBytes) + { + byte[] buffer; + if (oSocket.Available != 0) + { + buffer = new byte[Math.Min(nBytes, oSocket.Available)]; + oSocket.GetStream().Read(buffer, 0, nBytes); + } + else + buffer = new byte[0]; + + return buffer; + } + + public bool SocketConnected() + { + return oSocket.Connected; + } + + public void WriteInt(int val) + { + oSocket.GetStream().Write(BitConverter.GetBytes(val), 0, 4); + } + + public void WriteFloat(float val) + { + oSocket.GetStream().Write(BitConverter.GetBytes(val), 0, 4); + } + + public void SendFrame(List vertices, List colors) + { + short[] sVertices = Array.ConvertAll(vertices.ToArray(), x => (short)(x * 1000)); + + + int nVerticesToSend = vertices.Count / 3; + byte[] buffer = new byte[sizeof(short) * 3 * nVerticesToSend]; + Buffer.BlockCopy(sVertices, 0, buffer, 0, sizeof(short) * 3 * nVerticesToSend); + try + { + WriteInt(nVerticesToSend); + oSocket.GetStream().Write(buffer, 0, buffer.Length); + oSocket.GetStream().Write(colors.ToArray(), 0, sizeof(byte) * 3 * nVerticesToSend); + } + catch (Exception ex) + { + } + } + } +}