static void Main(string[] args) { System.Console.WriteLine("===== NW WORKER ====="); System.Console.WriteLine("= client connecting"); c = new TcpClient(); c.Connect(r_ip, r_port); System.Console.WriteLine("= refer host"); NetworkStream iostream = c.GetStream(); string curP = "red"; int i = 0; int i2 = 0; byte[] dataRead = new byte[1024]; // shpuld be large enough for my stuff DataStreamObject sendmessage; DataStreamObject recvdMessage; BinaryFormatter formatter = new BinaryFormatter(); string mode = "recv"; while (i <= 9000) { if (iostream.CanWrite && mode == "send") // eg us { //System.Console.WriteLine("=begin send"); sendmessage = new DataStreamObject(); sendmessage.AddInfo = i2.ToString(); i2++; formatter.Serialize(iostream, sendmessage); //System.Console.WriteLine("=end send"); mode = "recv"; } if (iostream.CanRead && mode == "recv") // them, read their move { //System.Console.WriteLine("=begin read"); recvdMessage = (DataStreamObject) formatter.Deserialize(iostream); System.Console.WriteLine("======= recvd: {0}", recvdMessage.AddInfo); //System.Console.WriteLine("=end read"); mode = "send"; } i++; } sendmessage = new DataStreamObject(); sendmessage.AddInfo = "STOP"; formatter.Serialize(iostream, sendmessage); //c.Close(); ~let the host close it System.Console.WriteLine("null | null | null"); Console.ReadKey(); }
// specific to host (ability to end / determines intiial); private void hostsgamelogicloop() { // host and client are connected now // sharing the iostream // this logic loop will use a multiplayer gamestate var // Current player:: // This player:: // Remote player:: // Multi state:: // This Player Move:: // Initial data: // player assignments / who starts (current player) // Subsequent data: // Move representation // after send/receive of this data, // use that info to set the appropriate states // DataStreamObject rcv = new DataStreamObject(); ; string gFlag = "send"; System.Console.WriteLine("gflag set to send"); int i = 10000; while (rcv.AddInfo != "STOP") { // System.Console.WriteLine("player {0} turn", data.Current_player); //System.Console.WriteLine(" recv bool is {0}", nw.IsRecv()); // if data.localturncompleted // then turn move ready to be sent // send turn move // change state to data.waitingformoveresponse // if data.waitingformoveresponse && nw.Recv() // change data state to data.applyingmoveresponse // change state to data.localturn etc.. if (data.Current_player == "red" && gFlag == "send") // and move ready to be sent { nw.flag = "send"; System.Console.WriteLine("nw.flag set to send"); DataStreamObject dso = new DataStreamObject(); dso.AddInfo = i.ToString(); i--; // send the move nw.Send = dso; // change the m state while(!nw.IsSentItem) { } // prepare to recv new again // logical to clear sent here (since should hav esent due to while loop) nw.IsRecvItem = false; gFlag = "recv"; System.Console.WriteLine("gflag set to recv"); //System.Console.WriteLine("Send: {0}", "some move"); // clear the move from data // change the current player, so will now be waiting on response //data.Current_player = "white"; //System.Console.WriteLine("sent a move ({0}), player is now white", dso.AddInfo); } if (data.Current_player == "red" && gFlag == "recv") { nw.flag = "recv"; System.Console.WriteLine("nw.flag set to recv"); // receive while (!nw.IsRecvItem) { } rcv = nw.Recv(); System.Console.WriteLine("======= recvd: {0}", rcv.AddInfo); // have recvd so now prepare to send // clear the old has sent nw.IsSentItem = false; // clear the item from nw.recv too gFlag = "processRecv"; System.Console.WriteLine("gflag set to processRecv"); //System.Console.WriteLine("i have received {0}", rcv.AddInfo); // apply the move // change player //data.Current_player = "red"; //System.Console.WriteLine("received a move ({0}), player is now red", rcv.AddInfo); } if (data.Current_player == "red" && gFlag == "processRecv") { // if rcv.AddInfo == STOP {endgame} // if recv.AddInfo == MOVE {apply move}(change state, apply, update gui) // change state // view.apply(MOVE(s)) {also updates gui} // change state } } System.Console.WriteLine("end routine"); }