/// <summary> /// In context of receiver thread. Takes in data and performs game updates. /// </summary> private void ReceiveData(byte[] buffer) { BinaryFormatter bf = new BinaryFormatter(); GuessFrame receiveframe = null; try { //attempt serialization receiveframe = (GuessFrame)bf.Deserialize(new MemoryStream(buffer)); } catch { try { Invoke(new Action(() => UpdateStatus("Recieved invalid package from server."))); Invoke(new Action(() => ReceiverDisconnect())); } //failed to update UI catch { } } if (receiveframe != null) { //update game try { Invoke(new Action(() => UpdateGame(receiveframe._GuessOrResponse))); } //failed to update UI catch { } } }
//save the trackbar val and send guess to server private void GuessButton_Click(object sender, EventArgs e) { try { ListBoxStatus.Items.Insert(0, $"Guess: {TrackBarGuess.Value}"); GuessFrame gf = new GuessFrame(); gf.Value = TrackBarGuess.Value; MemoryStream ms = new MemoryStream(); _bf.Serialize(ms, gf); _socket.Send(ms.GetBuffer(), (int)ms.Length, SocketFlags.None); Thread.Sleep(200);// pause between sends } catch (Exception err) { ListBoxStatus.Items.Insert(0, $"guess: error {err.Message}"); } }
private void UI_Bttn_Guess_Click(object sender, EventArgs e) { int guessVal; // Validate text is a number if (!int.TryParse(UI_TxBx_GuessNum.Text, out guessVal)) { MessageBox.Show("Guess must be a number", "Input Error"); UI_TxBx_GuessNum.Text = UI_TrBr_GuessValue.Minimum.ToString(); guessVal = UI_TrBr_GuessValue.Minimum; } // Validate number is less than max if (guessVal > UI_TrBr_GuessValue.Maximum) { guessVal = UI_TrBr_GuessValue.Maximum; UI_TxBx_GuessNum.Text = UI_TrBr_GuessValue.Maximum.ToString(); } // Validate number is greater than min else if (guessVal < UI_TrBr_GuessValue.Minimum) { guessVal = UI_TrBr_GuessValue.Minimum; UI_TxBx_GuessNum.Text = UI_TrBr_GuessValue.Minimum.ToString(); } UI_TrBr_GuessValue.Value = guessVal; // New guessframe GuessFrame frame = new GuessFrame(guessVal); // Memorystream to serialize to MemoryStream ms = new MemoryStream(); // Need to know how to serialize BinaryFormatter bf = new BinaryFormatter(); //serialize bf.Serialize(ms, frame); // Send the serialized guessframe try { _sokTalk.Send(ms.GetBuffer(), (int)ms.Length, SocketFlags.None); } catch { Console.WriteLine("failed sending the guess"); } }
/// <summary> /// Packages and sends a guess. /// </summary> private void UI_B_Guess_Click(object sender, EventArgs e) { //package guess GuessFrame sendFrame = new GuessFrame(UI_TBr_Guess.Value); MemoryStream ms = new MemoryStream(); BinaryFormatter bf = new BinaryFormatter(); try { bf.Serialize(ms, sendFrame); _SockConnection.Send(ms.GetBuffer(), (int)ms.Length, SocketFlags.None); //assume success _guess = UI_TBr_Guess.Value; } catch (Exception ex) { UI_TB_Status.Text = "Failed to send guess."; } }
private void ReceiveThreadMethod(object obj) { // Possible optimization of how many bytes we need to accept byte[] buffer = new byte[2000]; int gameNumber = _Rnd.Next(1, 1001); Socket sock = (Socket)obj; // Prevent possible cross thread sock.ReceiveTimeout = 0; while (true) { // Make sure label is the game number and display it safetly Invoke(new Action(() => UI_L_GeneratedNumber.Text = gameNumber.ToString())); int bytes = 0; try { // blocking receive bytes = sock.Receive(buffer); } catch (Exception ex) { // hard disconnection Invoke(new Action(() => ReceiverDisconnect("RecieveThreadMethod : Hard disconnection detected"))); return; } // Detection for soft disconnection if (bytes == 0) { Invoke(new Action(() => ReceiverDisconnect("RecieveThreadMethod : Soft disconnection detected"))); return; } // Assuming we have the whole information -------------------------------------------------------- // Recieving BinaryFormatter bf = new BinaryFormatter(); GuessFrame receiveframe = null; try { receiveframe = (GuessFrame)bf.Deserialize(new MemoryStream(buffer)); } catch (Exception ex) { try { Invoke(new Action(() => LogError("The data recieved is not the correct type."))); } catch { Console.WriteLine("Got some real problems on line 193 : Form_Server"); } } if (receiveframe != null) { try { Invoke(new Action(() => LogError("The data recieved is : " + receiveframe._GuessOrResponse))); } catch (Exception ex) { Console.WriteLine("Got some real problems on line 204 : Form_Server"); } // Sending GuessFrame sendFrame = new GuessFrame(receiveframe._GuessOrResponse.CompareTo(gameNumber)); MemoryStream ms = new MemoryStream(); try { bf.Serialize(ms, sendFrame); try { Invoke(new Action(() => LogError( "The data sent is : " + receiveframe._GuessOrResponse.CompareTo(gameNumber)))); } catch (Exception ex) { Console.WriteLine("Got some real problems on line 212 : Form_Server"); } } catch (Exception ex) { try { Invoke(new Action(() => LogError("Problems serializing the send frame"))); } catch { Console.WriteLine("Got some real problems on line 224 : Form_Server"); } } try { sock.Send(ms.GetBuffer(), (int)ms.Length, SocketFlags.None); } catch (Exception ex) { try { Invoke(new Action(() => LogError("Error sending the frame."))); } catch { Console.WriteLine("Got some real problems on line 225 : Form_Server"); } } // Start new game! if (receiveframe._GuessOrResponse.CompareTo(gameNumber) == 0) { gameNumber = _Rnd.Next(1, 1001); try { Invoke(new Action(() => LogError("The client guessed the correct number : "))); } catch (Exception ex) { Console.WriteLine("Got some real problems on line 254 : Form_Server"); } } } else { Invoke(new Action(() => ReceiverDisconnect("ReceiveThreadMethod : Received wrong frame type, booted client"))); return; } } }
private void Th_SocketThread(object obj) { // Socket is connected // The socket Socket sock = (Socket)obj; //byte array for data byte[] buff = new byte[2000]; // Receive calls shouldn't time out sock.ReceiveTimeout = 0; Invoke(new Action(() => { UI_Lbl_Messages.Text = "Connected. Please guess a number"; })); while (true) { // store received bytes int bytesReceived = 0; try { // Throws on a hard disconnect bytesReceived = sock.Receive(buff); } catch (Exception err) { // Hard disconnect occurred Console.WriteLine("SocketThread: " + err.Message); try { Invoke(new Action(() => { NewGame(); DisconnectButton(); UI_Lbl_Messages.Text = "Server disconnected. Please reconnect to play a new game."; })); } catch (Exception erry) { Console.WriteLine(erry.Message); } return; } if (bytesReceived == 0) { // Soft disconnect occurred Console.WriteLine("SocketThread: socket disconnect detected"); try { Invoke(new Action(() => { NewGame(); DisconnectButton(); UI_Lbl_Messages.Text = "Server disconnected. Please reconnect to play a new game."; })); } catch (Exception erry) { Console.WriteLine(erry.Message); } return; } // Deserialize data from buffer BinaryFormatter bf = new BinaryFormatter(); GuessFrame guess = null; try { guess = (GuessFrame)bf.Deserialize(new MemoryStream(buff)); } catch (Exception err) { // bad info given - unexpected data Console.WriteLine("SocketThread: " + err.Message); try { Invoke(new Action(() => { NewGame(); DisconnectButton(); UI_Lbl_Messages.Text = "Disconnected from server. Stop hacking my microwave! Please reconnect to play again."; })); } catch (Exception erry) { Console.WriteLine(erry.Message); } return; } string guessResponse = ""; if (guess._GuessOrResponse < 0) { guessResponse = "Guess was too low!"; // Make the lowest value on the trackbar the guess as the number cannot be any lower // Update the minimum label try { Invoke(new Action(() => { UI_TrBr_GuessValue.Minimum = UI_TrBr_GuessValue.Value + 1; UI_Lbl_Min.Text = UI_TrBr_GuessValue.Minimum.ToString(); })); } catch (Exception err) { Console.WriteLine(err.Message); } } else if (guess._GuessOrResponse > 0) { guessResponse = "Guess was too high!"; // Make the highest value on the trackbar the guess as the number cannot be any higher // Update the maximum label try { Invoke(new Action(() => { UI_TrBr_GuessValue.Maximum = UI_TrBr_GuessValue.Value - 1; UI_Lbl_Max.Text = UI_TrBr_GuessValue.Maximum.ToString(); })); } catch (Exception err) { Console.WriteLine(err.Message); } } else { guessResponse = "Correct! Enter another guess to start a new game..."; // Reset controls Invoke(new Action(() => NewGame())); } // Now update the UI based on guess Invoke(new Action(() => UI_Lbl_Messages.Text = guessResponse)); } }
/// <summary> /// Main receiving thread /// </summary> /// <param name="sok"></param> private void MainRXThread(object obj) { byte[] buffer = new byte[2000]; Socket sok = (Socket)obj; sok.ReceiveTimeout = 0; while (true) { int bytes = 0; try { bytes = sok.Receive(buffer); } catch (Exception err) { Console.WriteLine("RXthread : " + err.Message); try { Invoke(new Action(() => { GetNewNum(); UI_Lbl_ServerGuess.Text = _secretNum.ToString(); })); } catch (Exception erry) { Console.WriteLine(erry.Message); } // Start listener again since disconnect InitSokcet(); return; } if (bytes == 0) { Console.WriteLine("RXthread : soft disconnect"); try { Invoke(new Action(() => { GetNewNum(); UI_Lbl_ServerGuess.Text = _secretNum.ToString(); })); } catch (Exception erry) { Console.WriteLine(erry.Message); } // Start listener again since disconnect InitSokcet(); return; } // Process data GuessFrame gf = null; try { gf = (GuessFrame)_bf.Deserialize(new MemoryStream(buffer)); } catch (Exception err) { // bad info given - unexpected data Console.WriteLine("SocketThread: " + err.Message); //MessageBox.Show("Stop hacking my microwave!", "Data Error"); sok.Close(); InitSokcet(); Invoke(new Action(() => { GetNewNum(); UI_Lbl_ServerGuess.Text = _secretNum.ToString(); })); return; } Console.WriteLine(gf._GuessOrResponse); int howClose = gf._GuessOrResponse.CompareTo(_secretNum); MemoryStream ms = new MemoryStream(); _bf.Serialize(ms, new GuessFrame(howClose)); // Too low if (howClose < 0) { try { sok.Send(ms.GetBuffer(), (int)ms.Length, SocketFlags.None); } catch { Console.WriteLine("Failed send"); } } // Too high else if (howClose > 0) { try { sok.Send(ms.GetBuffer(), (int)ms.Length, SocketFlags.None); } catch { Console.WriteLine("Failed send"); } } // Correct guess else { try { sok.Send(ms.GetBuffer(), (int)ms.Length, SocketFlags.None); // Get new number and update UI GetNewNum(); try { Invoke(new Action(() => UI_Lbl_ServerGuess.Text = _secretNum.ToString())); } catch (Exception err) { Console.WriteLine(err.Message); } } catch { Console.WriteLine("Failed send"); } } } }