void SendTcpMethod(string[] args)
		{
			//Check for correct amount of arguments
			if (args.Length != 2)
				throw new ArgumentException("Parameters: <Destination> <Port>");

			string server = args[0];
			int servPort = Int32.Parse(args[1]);

			//Create a socket that is connected to a server on a specifed port
			TcpClient client = new TcpClient(server, servPort);
			NetworkStream netStream = client.GetStream();

			//Make an item to quote
			ItemQuote quote = new ItemQuote(12345678909876554L, "5mm Super Widgets", 1000, 1299, true, false);

			//Send text-encoded quote
			ItemQuoteEncoderText coder = new ItemQuoteEncoderText();
			byte[] codedQuote = coder.encode(quote);
			Console.WriteLine("Sening text-encoded quote (" + codedQuote.Length + " bytes): ");
			Console.WriteLine(quote);

			netStream.Write(codedQuote, 0, codedQuote.Length);

			//Receive binary-encoded quote
			ItemQuoteDecoder decoder = new ItemQuoteDecoderBin();
			ItemQuote receivedQuote = decoder.decode(client.GetStream());
			Console.WriteLine("Reveived Binary-Encode Quote:");
			Console.WriteLine(receivedQuote);

		}
		void SendUdpMethod(string[] args)
		{
			//Check for correct amount of arguments
			if ((args.Length < 2) || (args.Length > 3))
				throw new ArgumentException("Parameters: <Destination> <Port> [<Encoding>]");

			string server = args[0];
			int destPort = Int32.Parse(args[1]);

			//Make an item to quote
			ItemQuote quote = new ItemQuote(12345678909876554L, "5mm Super Widgets", 1000, 1299, true, false);

			UdpClient client = new UdpClient();

			ItemQuoteEncoder encoder = ((args.Length == 3) ? new ItemQuoteEncoderText(args[2]) : new ItemQuoteEncoderText());
			byte[] codedQuote = encoder.encode(quote);
			
			client.Send(codedQuote, codedQuote.Length, server, destPort);
			client.Close();
		}
		public byte[] encode(ItemQuote item)
		{
			MemoryStream mem = new MemoryStream();
			BinaryWriter output = new BinaryWriter(new BufferedStream(mem));

			output.Write(IPAddress.HostToNetworkOrder(item.itemNumber));
			output.Write(IPAddress.HostToNetworkOrder(item.quantity));
			output.Write(IPAddress.HostToNetworkOrder(item.unitPrice));

			byte flags = 0;
			if (item.discounted)
				flags |= ItemQuoteBinConst.DISCOUNT_FLAG;
			if (item.inStock)
				flags |= ItemQuoteBinConst.IN_STOCK_FLAG;
			output.Write(flags);

			byte[] encodedDesc = encoding.GetBytes(item.itemDescription);
			if (encodedDesc.Length > ItemQuoteBinConst.MAX_DESC_LEN)
				throw new IOException("Item description eceeds encoded length limit (" + ItemQuoteBinConst.MAX_DESC_LEN + ")");
			output.Write((byte)encodedDesc.Length);
			output.Write(encodedDesc);

			output.Flush();

			return mem.ToArray();
		}
		public byte[] encode(ItemQuote item)
		{
			string EncodedString = item.itemNumber + " ";
			if (item.itemDescription.IndexOf('\n') != -1)
				throw new IOException("Invalid description (contains newline).");
			EncodedString += item.itemDescription + "\n";
			EncodedString += item.quantity + " ";
			EncodedString += item.unitPrice + " ";

			if (item.discounted)
				//Only include 'd' if the item is discounted
				EncodedString += "d";
			if (item.inStock)
				//Only include 's' if the item is in stock
				EncodedString += "s";
			EncodedString += "\n";

			if (EncodedString.Length > ItemQuoteTextConst.MAX_WIRE_LENGTH)
				throw new IOException("Encoded length too long.");

			byte[] buf = encoding.GetBytes(EncodedString);
			return buf;
		}