public void TestTokenMessage() { TokenMessage msg = new TokenMessage(); msg.EncodeHiddenComm("A", "B"); TokenMessage msgTwo = new TokenMessage(); msgTwo.Decode(msg.ToSend); CompareTokenMessages(msg, msgTwo); msg.EncodeMessage("C", "D", "hello!! :D |"); msgTwo.Decode(msg.ToSend); CompareTokenMessages(msg, msgTwo); }
/// <summary> /// Handles the client comm. STarts a new thread for each node. /// </summary> /// <param name="clientObject">The client object.</param> private void HandleClientComm(object clientObject) { try { TcpClient client = (TcpClient)clientObject; NetworkStream clientStream = client.GetStream(); TokenMessage msg = new TokenMessage(); byte[] message; int bytesRead; while (true) { bytesRead = 0; message = GlobalConst.getSpaceByteArray(GlobalConst.BUFSIZE); try { //blocks until a client sends a message bytesRead = clientStream.Read(message, 0, GlobalConst.BUFSIZE); lock (stopwatch) { stopwatch.Reset(); } //Console.WriteLine("Got a message on tokenHub"); //RESET STOPWATCH } catch { //a socket error has occured break; } if (bytesRead == 0) { //the client has disconnected from the server break; } bool good = msg.Decode(message); if (msg.Token) { //SEND TOKEN TO NEXT PERSON this.tokenCount++; lock(this.nodes) { if (this.tokenCount >= this.nodes.Count) { break; } } } else if (!good) { continue; } else { this.tokenCount = 0; } int index = nodes.IndexOf(client) + 1; int max = nodes.Count; if (index >= max) { index = 0; } curIndex = index; TcpClient clientNew = null; lock(this.nodes) { clientNew = this.nodes[curIndex]; } actuallySend(clientNew, msg); //message has successfully been received //Send it to the next node. get the index of the current tcpclient then call send. } } catch (ThreadInterruptedException) { TcpClient c = (TcpClient)clientObject; c.Close(); } catch (Exception ex) { Console.WriteLine(ex); } }
/// <summary> /// Tokens the listening. /// </summary> private void TokenListening() { int bytesRead = 0; int countTimesSent = 0; byte[] message; NetworkStream stream = this.client.GetStream(); TokenMessage token = new TokenMessage(); //Whenever we receive something, we ALWAYS send something back. while (true) { bytesRead = 0; message = GlobalConst.getSpaceByteArray(GlobalConst.BUFSIZE); try { bytesRead = stream.Read(message, 0, GlobalConst.BUFSIZE); } catch { //socket error. WTF. break; } if(bytesRead == 0) { break; } TokenMessage msg = new TokenMessage(); bool msgOK = msg.Decode(message); if(msg.Token) { //Console.WriteLine("Got token on Node " + this.parentNode.Name); this.hasToken = true; if (this.senderThread.ThreadState.Equals(ThreadState.Stopped)) { UseDelegate(stream, msg); } else { while (this.SenderThread.ThreadState.Equals(ThreadState.WaitSleepJoin) == false) { Thread.Sleep(50); } this.SenderThread.Interrupt(); } } else if (!msgOK) { Console.WriteLine("Got a bad message on Node " + this.parentNode.Name); } else { //Console.WriteLine("Got message on Node {0} ", this.parentNode.Name); if (msg.Sender.Equals(this.parentNode.Name)) { if (msg.FS == '1' || countTimesSent > 3) { this.toSend.Dequeue(); token.EncodeHiddenComm(GlobalConst.serverName, GlobalConst.serverName); this.hasToken = false; while (!this.senderThread.ThreadState.Equals(ThreadState.WaitSleepJoin)) { Thread.Sleep(50); } this.SenderThread.Interrupt(); } else { countTimesSent++; token = msg; } } else if (msg.Destination.Equals(this.parentNode.Name)) { this.parentNode.writeOutMessage(msg); token = msg; token.FS = '1'; } else { token = msg; } UseDelegate(stream, token); } } this.doneReceiving = true; if(!this.doneSending) { SenderThread.Abort(); } while (!this.parentThread.ThreadState.Equals(ThreadState.WaitSleepJoin)) { Thread.Sleep(100); } this.parentThread.Interrupt(); }