コード例 #1
0
ファイル: Player.cs プロジェクト: PeterWaher/RetroSharp
		public override bool MoveStep()
		{
			if (Program.NrPlayers == 1)
				return base.MoveStep();
			else if (this.playerNr == 1)
			{
				int X = this.x;
				int Y = this.y;

				bool Result = base.MoveStep();

				if (this.x != X || this.y != Y || Result)
				{
					BinaryOutput Output = new BinaryOutput();
					Output.WriteByte(8);
					Output.WriteInt(this.x);
					Output.WriteInt(this.y);
					Output.WriteInt(this.vx);
					Output.WriteInt(this.vy);
					Output.WriteBool(Result);

					Program.MPE.SendUdpToAll(Output.GetPacket(), 3);
				}

				return Result;
			}
			else
				return false;
		}
コード例 #2
0
        private void CloseMqtt()
        {
            if (!(this.mqttConnection is null))
            {
                if (this.mqttConnection.State == MqttState.Connected)
                {
                    BinaryOutput Output = new BinaryOutput();
                    Output.WriteByte(2);
                    Output.WriteString(this.applicationName);
                    Output.WriteGuid(this.localPlayer.PlayerId);

                    this.mqttTerminatedPacketIdentifier = this.mqttConnection.PUBLISH(this.mqttNegotiationTopic, MqttQualityOfService.AtLeastOne, false, Output);
                    this.mqttConnection.OnPublished    += new PacketAcknowledgedEventHandler(mqttConnection_OnPublished);

#if LineListener
                    Console.Out.WriteLine("Tx: BYE(" + this.localPlayer.ToString() + ")");
#endif
                }
                else
                {
                    this.mqttConnection.Dispose();
                    this.mqttConnection = null;
                }
            }
        }
コード例 #3
0
        /// <summary>
        /// Creates inter-player peer-to-peer connections between known players.
        /// </summary>
        public void ConnectPlayers()
        {
            if (this.state != MultiPlayerState.FindingPlayers)
            {
                throw new Exception("The multiplayer environment is not in the state of finding players.");
            }

            this.State = MultiPlayerState.ConnectingPlayers;

            int          Index  = 0;
            BinaryOutput Output = new BinaryOutput();

            Output.WriteByte(1);
            Output.WriteString(this.applicationName);
            this.localPlayer.Index = Index++;
            this.Serialize(this.localPlayer, Output);

#if LineListener
            Console.Out.Write("Tx: INTERCONNECT(" + this.localPlayer.ToString());
#endif
            lock (this.remotePlayersByEndpoint)
            {
                Output.WriteUInt((uint)this.remotePlayersByEndpoint.Count);

                foreach (Player Player in this.remotePlayersByEndpoint.Values)
                {
                    Player.Index = Index++;
                    this.Serialize(Player, Output);

#if LineListener
                    Console.Out.Write("," + Player.ToString());
#endif
                }
            }

            this.mqttTerminatedPacketIdentifier = this.mqttConnection.PUBLISH(this.mqttNegotiationTopic, MqttQualityOfService.AtLeastOne, false, Output);
            this.mqttConnection.OnPublished    += new PacketAcknowledgedEventHandler(mqttConnection_OnPublished);

#if LineListener
            Console.Out.WriteLine(")");
#endif
            this.StartConnecting();
        }
コード例 #4
0
        private void mqttConnection_OnStateChanged(MqttConnection Sender, MqttState NewState)
        {
            if (NewState == MqttState.Connected)
            {
                this.mqttConnection.SUBSCRIBE(this.mqttNegotiationTopic);

                BinaryOutput Output = new BinaryOutput();
                Output.WriteByte(0);
                Output.WriteString(this.applicationName);

                this.localPlayer.SetEndpoints(this.p2pNetwork.ExternalEndpoint, this.p2pNetwork.LocalEndpoint);
                this.Serialize(this.localPlayer, Output);

                this.mqttConnection.PUBLISH(this.mqttNegotiationTopic, MqttQualityOfService.AtLeastOne, false, Output);

#if LineListener
                Console.Out.WriteLine("Tx: HELLO(" + this.localPlayer.ToString() + ")");
#endif
            }
        }
コード例 #5
0
ファイル: Player.cs プロジェクト: PeterWaher/RetroSharp
		public override void AfterMove()
		{
			Color DestPixel = RetroApplication.Raster[this.x, this.y];

			if (DestPixel.ToArgb() != Color.Black.ToArgb())
			{
				if (DestPixel.R == 255 && DestPixel.B == 0)
				{
					RetroApplication.FillFlood(this.x, this.y, Color.Black);

					if (this.playerNr == 1)
					{
						BinaryOutput Output = new BinaryOutput();
						int Gift = RetroApplication.Random(0, 31);

						Output.WriteByte(7);
						Output.WriteInt(Gift);

						this.GetGift(1, Gift, Output, null);

						if (Program.NrPlayers > 1)
							Program.MPE.SendUdpToAll(Output.GetPacket(), 3);
					}
				}
				else if (!this.immortal)
				{
					this.Die();
					return;
				}
			}

			if (!this.invisible || this.playerNr == 2)
				RetroApplication.Raster[this.x, this.y] = this.headColor;

			if (this.immortal)
			{
				int SecondsLeft = 10 - (int)(DateTime.Now - this.immortalStart).TotalSeconds;

				if (SecondsLeft != this.immortalSecondsLeft)
				{
					if (SecondsLeft < 0)
					{
						this.immortal = false;
						Program.PlayerMsg(this.playerNr, string.Empty);
					}
					else
					{
						this.immortalSecondsLeft = SecondsLeft;
						Program.PlayerMsg(this.playerNr, "Immortal " + SecondsLeft.ToString());
					}
				}
			}
		}
コード例 #6
0
ファイル: Program.cs プロジェクト: PeterWaher/RetroSharp
		public static void Main(string[] args)
		{
			Initialize();

			Console.Out.Write("Host Name (default iot.eclipse.org): ");
			string Host = Console.In.ReadLine();

			if (string.IsNullOrEmpty(Host))
			{
				Console.Out.WriteLine("Using iot.eclipse.org.");
				Host = "iot.eclipse.org";
			}

			Console.Out.WriteLine();
			Console.Out.Write("Port Number (default 1883): ");
			string s = Console.In.ReadLine();
			int Port;

			if (string.IsNullOrEmpty(s))
			{
				Console.Out.WriteLine("Using port 1883.");
				Port = 1883;
			}
			else
				Port = int.Parse(s);

			Console.Out.WriteLine();

			BinaryOutput Payload;
			int PacketsLeft = NrTestsPerQoS;

			using (MqttConnection MqttConnection = ConnectToMqttServer("iot.eclipse.org", Port, string.Empty, string.Empty))
			{
				WriteLine("<" + MqttConnection.State.ToString() + ">", C64Colors.LightGreen);

				MqttConnection.TrustServer = true;

				MqttConnection.OnConnectionError += (sender, ex) =>
				{
					WriteLine("Unable to connect:", C64Colors.Red);
				};

				MqttConnection.OnError += (sender, ex) =>
				{
					WriteLine(ex.Message, C64Colors.Red);
				};

				MqttConnection.OnContentReceived += (sender, Content) =>
				{
					string ClientId = Content.DataInput.ReadString();
					if (ClientId == sender.ClientId)
					{
						DateTime TP = Content.DataInput.ReadDateTime();
						MqttQualityOfService QoS = (MqttQualityOfService)Content.DataInput.ReadByte();
						Console.Out.WriteLine("Latency: " + (DateTime.Now - TP).TotalMilliseconds + " ms (" + QoS.ToString() + ")");

						bool Resend;

						if (--PacketsLeft > 0)
							Resend = true;
						else if (QoS < MqttQualityOfService.ExactlyOne)
						{
							QoS = (MqttQualityOfService)((int)QoS + 1);
							PacketsLeft = NrTestsPerQoS;
							Resend = true;
						}
						else
							Resend = false;

						if (Resend)
						{
							Payload = new BinaryOutput();
							Payload.WriteString(MqttConnection.ClientId);
							Payload.WriteDateTime(DateTime.Now);
							Payload.WriteByte((byte)QoS);

							MqttConnection.PUBLISH("RetroSharp/Examples/Networking/Latency", QoS, false, Payload);
						}
						else
							Console.Out.WriteLine("Press ENTER to continue.");
					}
				};

				MqttConnection.OnStateChanged += (sender, state) =>
				{
					WriteLine("<" + MqttConnection.State.ToString() + ">", C64Colors.LightGreen);

					if (state == MqttState.Connected)
					{
						MqttConnection.SUBSCRIBE("RetroSharp/Examples/Networking/Latency");

						Payload = new BinaryOutput();
						Payload.WriteString(MqttConnection.ClientId);
						Payload.WriteDateTime(DateTime.Now);
						Payload.WriteByte((byte)MqttQualityOfService.AtMostOne);

						MqttConnection.PUBLISH("RetroSharp/Examples/Networking/Latency", MqttQualityOfService.AtMostOne, false, Payload);
					}
				};

				Console.In.ReadLine();
			}

			Terminate();
		}
コード例 #7
0
ファイル: Program.cs プロジェクト: PeterWaher/RetroSharp
		public static void Main(string[] args)
		{
			Initialize();

			Guid PlayerId = Guid.NewGuid();
			string Player1Name;
			string Player2Name;

			Console.Out.WriteLine("Welcome to Mask! (Worms/Tron)");
			Console.Out.WriteLine(new string('-', 70));
			Console.Out.WriteLine("You control the work using the cursor keys.");
			Console.Out.WriteLine("Fire, using SPACE.");
			Console.Out.WriteLine("If you die, press ENTER to restart the game.");
			Console.Out.WriteLine("You can chat during the game.");
			Console.Out.WriteLine("Remember to try to fetch the gifts. You do that by moving into them.");
			Console.Out.WriteLine();
			Console.Out.WriteLine("Hello. What is your name?");
			Player1Name = Player2Name = Console.ReadLine();

			using (MPE = new MultiPlayerEnvironment("Mask", false, "iot.eclipse.org", 1883, false, string.Empty, string.Empty,
				"RetroSharp/Examples/Games/Mask", 2, PlayerId, new KeyValuePair<string, string>("NAME", Player1Name)))
			{
				MPE.OnStateChange += (sender, state) =>
				{
					switch (state)
					{
						case MultiPlayerState.SearchingForGateway:
							Console.Out.WriteLine("Searching for Internet Gateway.");
							break;

						case MultiPlayerState.RegisteringApplicationInGateway:
							Console.Out.WriteLine("Registering game in gateway.");
							break;

						case MultiPlayerState.FindingPlayers:
							Console.Out.WriteLine("Waiting for another player to connect.");
							Console.Out.WriteLine("Press ESC to play in single player mode.");
							OnKeyDown += new KeyEventHandler(MPE_Wait_OnKeyDown);
							break;

						case MultiPlayerState.ConnectingPlayers:
							Console.Out.WriteLine("Connecting to players.");
							break;
					}
				};

				MPE.OnPlayerAvailable += (sender, player) =>
				{
					Console.Out.WriteLine("New player available: " + player["NAME"]);
					MPE.ConnectPlayers();
				};

				MPE.OnPlayerConnected += (sender, player) =>
				{
					Player2Name = player["NAME"];
				};

				MPE.OnPlayerDisconnected += (sender, player) =>
				{
					PlayerMsg(2, "Disconnected");
					NrPlayers = 1;
					LocalMachineIsGameServer = true;
				};

				if (MPE.Wait(int.MaxValue))
				{
					NrPlayers = MPE.PlayerCount;
					LocalMachineIsGameServer = MPE.LocalPlayerIsFirst;
				}
				else
				{
					PlayerMsg(2, "Network error");
					NrPlayers = 1;
				}

				OnKeyDown -= new KeyEventHandler(MPE_Wait_OnKeyDown);

				ManualResetEvent Done = new ManualResetEvent(false);
				LinkedList<Shot> Shots = new LinkedList<Shot>();
				LinkedList<Explosion> Explosions = new LinkedList<Explosion>();
				LinkedList<Present> Presents = new LinkedList<Present>();
				LinkedList<PlayerPosition> Player2Positions = new LinkedList<PlayerPosition>();
				Player Player1 = new Player(1, 20, 28, 1, 0, 3, Color.Green, Color.LightGreen, 15);
				Player Player2 = new Player(2, 299, 179, -1, 0, 3, Color.Blue, Color.LightBlue, 15);
				bool Player1Up = false;
				bool Player1Down = false;
				bool Player1Left = false;
				bool Player1Right = false;
				bool Player1Fire = false;
				bool Player2Up = false;
				bool Player2Down = false;
				bool Player2Left = false;
				bool Player2Right = false;
				bool Player2Fire = false;

				Player1.Opponent = Player2;
				Player2.Opponent = Player1;

				Clear();
				FillRectangle(0, 0, 319, 7, Color.FromKnownColor(KnownColor.DimGray));
				SetClipArea(0, 8, 319, 199);

				string s = Player1Name.Length <= 10 ? Player1Name : Player1Name.Substring(0, 10);
				Console.Out.Write(s);

				s = Player2Name.Length <= 10 ? Player2Name : Player2Name.Substring(0, 10);
				GotoXY(ConsoleWidth - s.Length, 0);
				Console.Out.Write(s);

				OnKeyDown += (sender, e) =>
				{
					switch (e.Key)
					{
						case Key.Escape:
							if (MPE.State == MultiPlayerState.FindingPlayers)
								MPE.ConnectPlayers();
							else
								Done.Set();
							break;

						case Key.C:
							if (e.Control)
								Done.Set();
							break;

						case Key.Up:
							if (!Player1.Dead && Player1.VY != 1)
							{
								Player1Up = true;

								if (NrPlayers == 1)
								{
									if (!Player2.Dead)
										Player2Down = true;
								}
								else
									MPE.SendUdpToAll(new byte[] { 0 }, 3);
							}
							break;

						case Key.Down:
							if (!Player1.Dead && Player1.VY != -1)
							{
								Player1Down = true;

								if (NrPlayers == 1)
								{
									if (!Player2.Dead)
										Player2Up = true;
								}
								else
									MPE.SendUdpToAll(new byte[] { 1 }, 3);
							}
							break;

						case Key.Left:
							if (!Player1.Dead && Player1.VX != 1)
							{
								Player1Left = true;

								if (NrPlayers == 1)
								{
									if (!Player2.Dead)
										Player2Right = true;
								}
								else
									MPE.SendUdpToAll(new byte[] { 2 }, 3);
							}
							break;

						case Key.Right:
							if (!Player1.Dead && Player1.VX != -1)
							{
								Player1Right = true;

								if (NrPlayers == 1)
								{
									if (!Player2.Dead)
										Player2Left = true;
								}
								else
									MPE.SendUdpToAll(new byte[] { 3 }, 3);
							}
							break;

						case Key.Space:
							if (!Player1.Dead)
							{
								Player1Fire = true;

								if (NrPlayers == 1)
								{
									if (!Player2.Dead)
										Player2Fire = true;
								}
								else
									MPE.SendUdpToAll(new byte[] { 4 }, 3);
							}
							break;

						case Key.Enter:
							if (Player1.Dead)
							{
								if (NrPlayers > 1)
									MPE.SendUdpToAll(new byte[] { 5 }, 3);
								else
								{
									lock (Player2Positions)
									{
										Player2Positions.Clear();
									}

									Shots.Clear();
									Explosions.Clear();
									Presents.Clear();
									Player1 = new Player(1, 20, 28, 1, 0, 3, Color.Green, Color.LightGreen, 15);
									Player2 = new Player(2, 299, 179, -1, 0, 3, Color.Blue, Color.LightBlue, 15);
									Player1Up = false;
									Player1Down = false;
									Player1Left = false;
									Player1Right = false;
									Player1Fire = false;

									Player1.Opponent = Player2;
									Player2.Opponent = Player1;

									FillRectangle(0, 8, 319, 199, Color.Black);
									PlayerMsg(1, string.Empty);
									PlayerMsg(2, string.Empty);
								}
							}
							break;
					}
				};

				OnKeyPressed += (sender, e) =>
				{
					ChatCharacter(1, e.Character);
					MPE.SendTcpToAll(new byte[] { 10, (byte)(e.Character >> 8), (byte)(e.Character) });
				};

				OnUpdateModel += (sender, e) =>
				{
					if (LocalMachineIsGameServer && Random() < 0.005)
					{
						int x1, y1;

						do
						{
							x1 = Random(30, 285);
							y1 = Random(38, 165);
						}
						while (!Present.CanPlace(x1, y1, x1 + 5, y1 + 5));

						Presents.AddLast(new Present(x1, y1, x1 + 5, y1 + 5));

						if (NrPlayers > 1)
						{
							BinaryOutput Output = new BinaryOutput();

							Output.WriteByte(6);
							Output.WriteInt(x1);
							Output.WriteInt(y1);

							MPE.SendUdpToAll(Output.GetPacket(), 3);
						}
					}

					LinkedListNode<Present> PresentObj, NextPresentObj;

					PresentObj = Presents.First;
					while (PresentObj != null)
					{
						NextPresentObj = PresentObj.Next;
						if (PresentObj.Value.Move())
							Presents.Remove(PresentObj);

						PresentObj = NextPresentObj;
					}

					if (Player1Up)
					{
						Player1.Up();
						Player1Up = false;
					}
					else if (Player1Down)
					{
						Player1.Down();
						Player1Down = false;
					}
					else if (Player1Left)
					{
						Player1.Left();
						Player1Left = false;
					}
					else if (Player1Right)
					{
						Player1.Right();
						Player1Right = false;
					}

					if (Player2Up)
					{
						Player2.Up();
						Player2Up = false;
					}
					else if (Player2Down)
					{
						Player2.Down();
						Player2Down = false;
					}
					else if (Player2Left)
					{
						Player2.Left();
						Player2Left = false;
					}
					else if (Player2Right)
					{
						Player2.Right();
						Player2Right = false;
					}

					if (!Player1.Dead && Player1.Move())
						Explosions.AddLast(new Explosion(Player1.X, Player1.Y, 30, Color.White));

					if (!Player2.Dead)
					{
						if (NrPlayers == 1)
						{
							if (Player2.Move())
								Explosions.AddLast(new Explosion(Player2.X, Player2.Y, 30, Color.White));
						}
						else
						{
							lock (Player2Positions)
							{
								try
								{
									foreach (PlayerPosition P in Player2Positions)
									{
										Player2.BeforeMove();
										Player2.SetPosition(P.X, P.Y, P.VX, P.VY);
										Player2.AfterMove();

										if (P.Dead)
										{
											Player2.Die();
											Explosions.AddLast(new Explosion(Player2.X, Player2.Y, 30, Color.White));
										}
									}
								}
								finally
								{
									Player2Positions.Clear();
								}
							}
						}
					}

					if (Player1Fire)
					{
						Player1.Fire(Shots);
						Player1Fire = false;
					}

					if (Player2Fire)
					{
						Player2.Fire(Shots);
						Player2Fire = false;
					}

					LinkedListNode<Shot> ShotObj, NextShotObj;

					ShotObj = Shots.First;
					while (ShotObj != null)
					{
						NextShotObj = ShotObj.Next;
						if (ShotObj.Value.Move())
						{
							Shots.Remove(ShotObj);
							Explosions.AddLast(new Explosion(ShotObj.Value.X, ShotObj.Value.Y, ShotObj.Value.Power, Color.White));
						}

						ShotObj = NextShotObj;
					}

					LinkedListNode<Explosion> ExplosionObj, NextExplosionObj;

					ExplosionObj = Explosions.First;
					while (ExplosionObj != null)
					{
						NextExplosionObj = ExplosionObj.Next;
						if (ExplosionObj.Value.Move())
							Explosions.Remove(ExplosionObj);

						ExplosionObj = NextExplosionObj;
					}
				};

				MPE.OnGameDataReceived += (sender, e) =>
				{
					byte Command = e.Data.ReadByte();

					switch (Command)
					{
						case 0:	// Remote player presses UP
							if (!Player2.Dead)
								Player2Down = true;
							break;

						case 1:	// Remote player presses DOWN
							if (!Player2.Dead)
								Player2Up = true;
							break;

						case 2:	// Remote player presses LEFT
							if (!Player2.Dead)
								Player2Right = true;
							break;

						case 3:	// Remote player presses RIGHT
							if (!Player2.Dead)
								Player2Left = true;
							break;

						case 4:	// Remote player presses SPACE (Fire)
							if (!Player2.Dead)
								Player2Fire = true;
							break;

						case 5:	// Remote player presses ENTER (Restart)
						case 9:	// Acknowledgement of remote player presses ENTER (Restart)

							if (Command == 5)
								MPE.SendUdpToAll(new byte[] { 9 }, 3);

							lock (Player2Positions)
							{
								Player2Positions.Clear();
							}

							Shots.Clear();
							Explosions.Clear();
							Presents.Clear();
							Player1 = new Player(1, 20, 28, 1, 0, 3, Color.Green, Color.LightGreen, 15);
							Player2 = new Player(2, 299, 179, -1, 0, 3, Color.Blue, Color.LightBlue, 15);
							Player1Up = false;
							Player1Down = false;
							Player1Left = false;
							Player1Right = false;
							Player1Fire = false;

							Player1.Opponent = Player2;
							Player2.Opponent = Player1;

							FillRectangle(0, 8, 319, 199, Color.Black);
							PlayerMsg(1, string.Empty);
							PlayerMsg(2, string.Empty);

							BorderColor = Color.FromKnownColor(KnownColor.DimGray);
							break;

						case 6:	// New Present
							int x1 = 315 - (int)e.Data.ReadInt();
							int y1 = 203 - (int)e.Data.ReadInt();

							Presents.AddLast(new Present(x1, y1, x1 + 5, y1 + 5));
							break;

						case 7:	// Gift
							x1 = (int)e.Data.ReadInt();
							Player2.GetGift(2, x1, null, e.Data);
							break;

						case 8:	// Move player 2
							lock (Player2Positions)
							{
								Player2Positions.AddLast(new PlayerPosition(e.Data));
							}
							break;

						case 10:	// chat character
							char ch = (char)e.Data.ReadUInt16();
							ChatCharacter(2, ch);
							break;
					}
				};

				while (!Done.WaitOne(1000))
					;
			}

			Terminate();
		}
コード例 #8
0
		/// <summary>
		/// Creates inter-player peer-to-peer connections between known players.
		/// </summary>
		public void ConnectPlayers()
		{
			if (this.state != MultiPlayerState.FindingPlayers)
				throw new Exception("The multiplayer environment is not in the state of finding players.");

			this.State = MultiPlayerState.ConnectingPlayers;

			int Index = 0;
			BinaryOutput Output = new BinaryOutput();
			Output.WriteByte(1);
			Output.WriteString(this.applicationName);
			this.localPlayer.Index = Index++;
			this.Serialize(this.localPlayer, Output);

#if LineListener
			Console.Out.Write("Tx: INTERCONNECT(" + this.localPlayer.ToString());
#endif
			lock (this.remotePlayersByEndpoint)
			{
				Output.WriteUInt((uint)this.remotePlayersByEndpoint.Count);

				foreach (Player Player in this.remotePlayersByEndpoint.Values)
				{
					Player.Index = Index++;
					this.Serialize(Player, Output);

#if LineListener
					Console.Out.Write("," + Player.ToString());
#endif
				}
			}

			this.mqttTerminatedPacketIdentifier = this.mqttConnection.PUBLISH(this.mqttNegotiationTopic, MqttQualityOfService.AtLeastOne, false, Output);
			this.mqttConnection.OnPublished += new PacketAcknowledgedEventHandler(mqttConnection_OnPublished);

#if LineListener
			Console.Out.WriteLine(")");
#endif
			this.StartConnecting();
		}
コード例 #9
0
		private void mqttConnection_OnStateChanged(MqttConnection Sender, MqttState NewState)
		{
			if (NewState == MqttState.Connected)
			{
				this.mqttConnection.SUBSCRIBE(this.mqttNegotiationTopic);

				BinaryOutput Output = new BinaryOutput();
				Output.WriteByte(0);
				Output.WriteString(this.applicationName);

				this.localPlayer.SetEndpoints(this.p2pNetwork.ExternalEndpoint, this.p2pNetwork.LocalEndpoint);
				this.Serialize(this.localPlayer, Output);

				this.mqttConnection.PUBLISH(this.mqttNegotiationTopic, MqttQualityOfService.AtLeastOne, false, Output);

#if LineListener
				Console.Out.WriteLine("Tx: HELLO(" + this.localPlayer.ToString() + ")");
#endif
			}
		}
コード例 #10
0
		private void CloseMqtt()
		{
			if (this.mqttConnection != null)
			{
				if (this.mqttConnection.State == MqttState.Connected)
				{
					BinaryOutput Output = new BinaryOutput();
					Output.WriteByte(2);
					Output.WriteString(this.applicationName);
					Output.WriteGuid(this.localPlayer.PlayerId);

					this.mqttTerminatedPacketIdentifier = this.mqttConnection.PUBLISH(this.mqttNegotiationTopic, MqttQualityOfService.AtLeastOne, false, Output);
					this.mqttConnection.OnPublished += new PacketAcknowledgedEventHandler(mqttConnection_OnPublished);

#if LineListener
					Console.Out.WriteLine("Tx: BYE(" + this.localPlayer.ToString() + ")");
#endif
				}
				else
				{
					this.mqttConnection.Dispose();
					this.mqttConnection = null;
				}
			}
		}
コード例 #11
0
ファイル: Program.cs プロジェクト: PeterWaher/RetroSharp
		public static void Main(string[] args)
		{
			Initialize();

			WriteLine("What is your name?", C64Colors.LightBlue);
			string Name = Console.In.ReadLine();
			BinaryOutput Payload;

			WriteLine("Hello " + Name + ".", C64Colors.LightBlue);
			WriteLine("Strings entered below will be seen by everybody running the application.", C64Colors.LightBlue);
			WriteLine("Enter an empty string to close the application.", C64Colors.LightBlue);
			WriteLine(new string('-', ConsoleWidth), C64Colors.LightBlue);

			using (MqttConnection MqttConnection = ConnectToMqttServer("iot.eclipse.org", true, string.Empty, string.Empty))
			{
				WriteLine("<" + MqttConnection.State.ToString() + ">", C64Colors.LightGreen);

				MqttConnection.TrustServer = true;

				MqttConnection.OnConnectionError += (sender, ex) =>
				{
					WriteLine("Unable to connect:", C64Colors.Red);
				};

				MqttConnection.OnError += (sender, ex) =>
				{
					WriteLine(ex.Message, C64Colors.Red);
				};

				MqttConnection.OnStateChanged += (sender, state) =>
				{
					WriteLine("<" + MqttConnection.State.ToString() + ">", C64Colors.LightGreen);

					if (state == MqttState.Connected)
					{
						MqttConnection.SUBSCRIBE("RetroSharp/Examples/Networking/MultiUserChat");

						Payload = new BinaryOutput();
						Payload.WriteString(MqttConnection.ClientId);
						Payload.WriteString(Name);
						Payload.WriteByte(0);

						MqttConnection.PUBLISH("RetroSharp/Examples/Networking/MultiUserChat", MqttQualityOfService.AtLeastOne, false, Payload);
					}
				};

				MqttConnection.OnContentReceived += (sender, Content) =>
				{
					string ClientId = Content.DataInput.ReadString();
					if (ClientId != sender.ClientId)
					{
						string Author = Content.DataInput.ReadString();
						byte Command = Content.DataInput.ReadByte();

						switch (Command)
						{
							case 0:
								WriteLine("<" + Author + " enters the room.>", C64Colors.LightGreen);
								break;

							case 1:
								string Text = Content.DataInput.ReadString();
								WriteLine(Author + ": " + Text, C64Colors.LightBlue);
								break;

							case 2:
								WriteLine("<" + Author + " left the room.>", C64Colors.LightGreen);
								break;
						}
					}
				};

				while (true)
				{
					string s = Console.In.ReadLine();
					if (string.IsNullOrEmpty(s))
						break;

					Payload = new BinaryOutput();
					Payload.WriteString(MqttConnection.ClientId);
					Payload.WriteString(Name);
					Payload.WriteByte(1);
					Payload.WriteString(s);

					MqttConnection.PUBLISH("RetroSharp/Examples/Networking/MultiUserChat", MqttQualityOfService.AtLeastOne, false, Payload);
				}

				MqttConnection.UNSUBSCRIBE("RetroSharp/Examples/Networking/MultiUserChat");

				int PacketIdentifier = 0;
				ManualResetEvent Terminated = new ManualResetEvent(false);

				MqttConnection.OnPublished += (sender, e) =>
				{
					if (PacketIdentifier == e)
						Terminated.Set();
				};

				Payload = new BinaryOutput();
				Payload.WriteString(MqttConnection.ClientId);
				Payload.WriteString(Name);
				Payload.WriteByte(2);

				PacketIdentifier = MqttConnection.PUBLISH("RetroSharp/Examples/Networking/MultiUserChat", MqttQualityOfService.AtLeastOne, false, Payload);

				Terminated.WaitOne(5000);
			}

			Terminate();
		}