Anonymous
Сокет равен нулю. Пожалуйста, проверьте, правильно ли принят вызов [закрыто]
Сообщение
Anonymous » 17 июл 2024, 07:29
почему отображается сообщение «Socket имеет значение null. Пожалуйста, проверьте, правильно ли принят вызов». после нажатия кнопок «крестики-нолики», даже если игрок принял вызов?
мой проект посвящен многопользовательским играм «крестики-нолики» в winforms C#.
я пытался спросить второго пилота и чатgpt, но до сих пор не могу исправить это.
Код: Выделить всё
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Net.Sockets;
using System.Net;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
namespace NavigationView.UserControls
{
public partial class UserControl4 : UserControl
{
private const string connectionString = "Server=localhost;Database=tictactoe;Uid=time;Pwd=admin;";
private List players = new List();
private char PlayerChar;
private char OpponentChar;
private Socket connectedSocket;
private BackgroundWorker MessageReceiver = new BackgroundWorker();
private BackgroundWorker HostListener = new BackgroundWorker();
private TcpListener server = null;
private bool isChallengeAccepted = false;
public UserControl4()
{
InitializeComponent();
MessageReceiver.DoWork += MessageReceiver_DoWork;
HostListener.DoWork += HostListener_DoWork;
CheckForIllegalCrossThreadCalls = false;
LoadPlayers();
}
private void Connect_Click(object sender, EventArgs e)
{
// This method should be used for connecting as a client, not hosting.
// If it's for hosting, you can call StartHost directly.
}
private void LoadPlayers()
{
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
try
{
connection.Open();
string query = "SELECT username FROM players";
MySqlCommand cmd = new MySqlCommand(query, connection);
MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
players.Add(reader.GetString("username"));
}
UpdatePlayerList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
private void UpdatePlayerList()
{
checkedListBox1.Items.Clear();
foreach (var player in players)
{
checkedListBox1.Items.Add(player, false);
}
}
private void AddPlayer(string player, bool isReady)
{
players.Add(player + (isReady ? " (Ready)" : " (Not Ready)"));
UpdatePlayerList();
}
private void MessageReceiver_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
if (connectedSocket == null) return;
byte[] buffer = new byte[1];
connectedSocket.Receive(buffer);
this.Invoke((MethodInvoker)delegate
{
ProcessMove(buffer[0]);
});
if (CheckState())
return;
}
}
private void HostListener_DoWork(object sender, DoWorkEventArgs e)
{
server = new TcpListener(IPAddress.Loopback, 5732);
server.Start();
connectedSocket = server.AcceptSocket();
this.Invoke((MethodInvoker)delegate
{
AddPlayer("Host", true);
EnableGameButtons();
MessageReceiver.RunWorkerAsync();
});
}
private void ProcessMove(byte move)
{
Button button = GetButtonByMove(move);
if (button != null)
{
button.Text = OpponentChar.ToString();
button.Enabled = false;
}
}
private Button GetButtonByMove(byte move)
{
switch (move)
{
case 1: return button1;
case 2: return button2;
case 3: return button3;
case 4: return button4;
case 5: return button5;
case 6: return button6;
case 7: return button7;
case 8: return button8;
case 9: return button9;
default: return null;
}
}
private bool CheckState()
{
// Check for win, draw, or continue the game as before
// Return true if game is over, false otherwise
// Horizontals
if (button1.Text == button2.Text && button2.Text == button3.Text && button3.Text != "")
{
GameOver(button1.Text[0] == PlayerChar);
return true;
}
else if (button4.Text == button5.Text && button5.Text == button6.Text && button6.Text != "")
{
GameOver(button4.Text[0] == PlayerChar);
return true;
}
else if (button7.Text == button8.Text && button8.Text == button9.Text && button9.Text != "")
{
GameOver(button7.Text[0] == PlayerChar);
return true;
}
// Verticals
else if (button1.Text == button4.Text && button4.Text == button7.Text && button7.Text != "")
{
GameOver(button1.Text[0] == PlayerChar);
return true;
}
else if (button2.Text == button5.Text && button5.Text == button8.Text && button8.Text != "")
{
GameOver(button2.Text[0] == PlayerChar);
return true;
}
else if (button3.Text == button6.Text && button6.Text == button9.Text && button9.Text != "")
{
GameOver(button3.Text[0] == PlayerChar);
return true;
}
// Diagonals
else if (button1.Text == button5.Text && button5.Text == button9.Text && button9.Text != "")
{
GameOver(button1.Text[0] == PlayerChar);
return true;
}
else if (button3.Text == button5.Text && button5.Text == button7.Text && button7.Text != "")
{
GameOver(button3.Text[0] == PlayerChar);
return true;
}
// Draw
else if (button1.Text != "" && button2.Text != "" && button3.Text != "" &&
button4.Text != "" && button5.Text != "" && button6.Text != "" &&
button7.Text != "" && button8.Text != "" && button9.Text != "")
{
label1.Text = "It's a draw!";
MessageBox.Show("It's a draw!");
return true;
}
return false;
}
private void GameOver(bool isWinner)
{
label1.Text = isWinner ? "You Won!" : "You Lost!";
MessageBox.Show(isWinner ? "You Won!" : "You Lost!");
}
private void button_Click(object sender, EventArgs e)
{
if (!isChallengeAccepted || connectedSocket == null)
{
MessageBox.Show("Socket is null. Please check if the challenge has been accepted correctly.");
return;
}
var button = (Button)sender;
byte move = GetButtonMove(button.Name);
if (move != 0)
{
button.Text = PlayerChar.ToString();
button.Enabled = false;
connectedSocket.Send(new byte[] { move });
if (!CheckState())
{
MessageReceiver.RunWorkerAsync();
}
}
}
private byte GetButtonMove(string buttonName)
{
switch (buttonName)
{
case "button1": return 1;
case "button2": return 2;
case "button3": return 3;
case "button4": return 4;
case "button5": return 5;
case "button6": return 6;
case "button7": return 7;
case "button8": return 8;
case "button9": return 9;
default: return 0;
}
}
private void UserControl4_Load(object sender, EventArgs e)
{
DisableGameButtons();
}
private void StartHost()
{
PlayerChar = 'X';
OpponentChar = 'O';
HostListener.RunWorkerAsync();
}
private void EnableGameButtons()
{
button1.Enabled = true;
button2.Enabled = true;
button3.Enabled = true;
button4.Enabled = true;
button5.Enabled = true;
button6.Enabled = true;
button7.Enabled = true;
button8.Enabled = true;
button9.Enabled = true;
}
private void DisableGameButtons()
{
button1.Enabled = false;
button2.Enabled = false;
button3.Enabled = false;
button4.Enabled = false;
button5.Enabled = false;
button6.Enabled = false;
button7.Enabled = false;
button8.Enabled = false;
button9.Enabled = false;
}
private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e)
{
// Placeholder for checkedListBox selected index change handling
}
private void button1_Click(object sender, EventArgs e) { button_Click(sender, e); }
private void button2_Click(object sender, EventArgs e) { button_Click(sender, e); }
private void button3_Click_1(object sender, EventArgs e) { button_Click(sender, e); }
private void button4_Click(object sender, EventArgs e) { button_Click(sender, e); }
private void button5_Click(object sender, EventArgs e) { button_Click(sender, e); }
private void button6_Click(object sender, EventArgs e) { button_Click(sender, e); }
private void button7_Click(object sender, EventArgs e) { button_Click(sender, e); }
private void button8_Click(object sender, EventArgs e) { button_Click(sender, e); }
private void button9_Click(object sender, EventArgs e) { button_Click(sender, e); }
private void challengeButton_Click(object sender, EventArgs e)
{
if (checkedListBox1.CheckedItems.Count == 0)
{
MessageBox.Show("Please select a player to challenge.");
return;
}
string player = checkedListBox1.CheckedItems[0].ToString().Split(' ')[0];
// Notify player to accept challenge
DialogResult result = MessageBox.Show($"{player}, do you accept the challenge?", "Challenge", MessageBoxButtons.YesNo);
if (result == DialogResult.Yes)
{
MessageBox.Show("Challenge accepted! Starting game...");
isChallengeAccepted = true;
StartHost();
EnableGameButtons();
}
else
{
MessageBox.Show($"{player} declined the challenge.");
}
}
}
}
Я пытался получить помощь от ChatGPT и Copilot, чтобы решить проблему с кодом, но проблема не устранена.
Подробнее здесь:
https://stackoverflow.com/questions/787 ... -correctly
1721190596
Anonymous
почему отображается сообщение «Socket имеет значение null. Пожалуйста, проверьте, правильно ли принят вызов». после нажатия кнопок «крестики-нолики», даже если игрок принял вызов? мой проект посвящен многопользовательским играм «крестики-нолики» в winforms C#. я пытался спросить второго пилота и чатgpt, но до сих пор не могу исправить это. [code]using System; using System.Collections.Generic; using System.ComponentModel; using System.Net.Sockets; using System.Net; using System.Windows.Forms; using MySql.Data.MySqlClient; namespace NavigationView.UserControls { public partial class UserControl4 : UserControl { private const string connectionString = "Server=localhost;Database=tictactoe;Uid=time;Pwd=admin;"; private List players = new List(); private char PlayerChar; private char OpponentChar; private Socket connectedSocket; private BackgroundWorker MessageReceiver = new BackgroundWorker(); private BackgroundWorker HostListener = new BackgroundWorker(); private TcpListener server = null; private bool isChallengeAccepted = false; public UserControl4() { InitializeComponent(); MessageReceiver.DoWork += MessageReceiver_DoWork; HostListener.DoWork += HostListener_DoWork; CheckForIllegalCrossThreadCalls = false; LoadPlayers(); } private void Connect_Click(object sender, EventArgs e) { // This method should be used for connecting as a client, not hosting. // If it's for hosting, you can call StartHost directly. } private void LoadPlayers() { using (MySqlConnection connection = new MySqlConnection(connectionString)) { try { connection.Open(); string query = "SELECT username FROM players"; MySqlCommand cmd = new MySqlCommand(query, connection); MySqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { players.Add(reader.GetString("username")); } UpdatePlayerList(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } private void UpdatePlayerList() { checkedListBox1.Items.Clear(); foreach (var player in players) { checkedListBox1.Items.Add(player, false); } } private void AddPlayer(string player, bool isReady) { players.Add(player + (isReady ? " (Ready)" : " (Not Ready)")); UpdatePlayerList(); } private void MessageReceiver_DoWork(object sender, DoWorkEventArgs e) { while (true) { if (connectedSocket == null) return; byte[] buffer = new byte[1]; connectedSocket.Receive(buffer); this.Invoke((MethodInvoker)delegate { ProcessMove(buffer[0]); }); if (CheckState()) return; } } private void HostListener_DoWork(object sender, DoWorkEventArgs e) { server = new TcpListener(IPAddress.Loopback, 5732); server.Start(); connectedSocket = server.AcceptSocket(); this.Invoke((MethodInvoker)delegate { AddPlayer("Host", true); EnableGameButtons(); MessageReceiver.RunWorkerAsync(); }); } private void ProcessMove(byte move) { Button button = GetButtonByMove(move); if (button != null) { button.Text = OpponentChar.ToString(); button.Enabled = false; } } private Button GetButtonByMove(byte move) { switch (move) { case 1: return button1; case 2: return button2; case 3: return button3; case 4: return button4; case 5: return button5; case 6: return button6; case 7: return button7; case 8: return button8; case 9: return button9; default: return null; } } private bool CheckState() { // Check for win, draw, or continue the game as before // Return true if game is over, false otherwise // Horizontals if (button1.Text == button2.Text && button2.Text == button3.Text && button3.Text != "") { GameOver(button1.Text[0] == PlayerChar); return true; } else if (button4.Text == button5.Text && button5.Text == button6.Text && button6.Text != "") { GameOver(button4.Text[0] == PlayerChar); return true; } else if (button7.Text == button8.Text && button8.Text == button9.Text && button9.Text != "") { GameOver(button7.Text[0] == PlayerChar); return true; } // Verticals else if (button1.Text == button4.Text && button4.Text == button7.Text && button7.Text != "") { GameOver(button1.Text[0] == PlayerChar); return true; } else if (button2.Text == button5.Text && button5.Text == button8.Text && button8.Text != "") { GameOver(button2.Text[0] == PlayerChar); return true; } else if (button3.Text == button6.Text && button6.Text == button9.Text && button9.Text != "") { GameOver(button3.Text[0] == PlayerChar); return true; } // Diagonals else if (button1.Text == button5.Text && button5.Text == button9.Text && button9.Text != "") { GameOver(button1.Text[0] == PlayerChar); return true; } else if (button3.Text == button5.Text && button5.Text == button7.Text && button7.Text != "") { GameOver(button3.Text[0] == PlayerChar); return true; } // Draw else if (button1.Text != "" && button2.Text != "" && button3.Text != "" && button4.Text != "" && button5.Text != "" && button6.Text != "" && button7.Text != "" && button8.Text != "" && button9.Text != "") { label1.Text = "It's a draw!"; MessageBox.Show("It's a draw!"); return true; } return false; } private void GameOver(bool isWinner) { label1.Text = isWinner ? "You Won!" : "You Lost!"; MessageBox.Show(isWinner ? "You Won!" : "You Lost!"); } private void button_Click(object sender, EventArgs e) { if (!isChallengeAccepted || connectedSocket == null) { MessageBox.Show("Socket is null. Please check if the challenge has been accepted correctly."); return; } var button = (Button)sender; byte move = GetButtonMove(button.Name); if (move != 0) { button.Text = PlayerChar.ToString(); button.Enabled = false; connectedSocket.Send(new byte[] { move }); if (!CheckState()) { MessageReceiver.RunWorkerAsync(); } } } private byte GetButtonMove(string buttonName) { switch (buttonName) { case "button1": return 1; case "button2": return 2; case "button3": return 3; case "button4": return 4; case "button5": return 5; case "button6": return 6; case "button7": return 7; case "button8": return 8; case "button9": return 9; default: return 0; } } private void UserControl4_Load(object sender, EventArgs e) { DisableGameButtons(); } private void StartHost() { PlayerChar = 'X'; OpponentChar = 'O'; HostListener.RunWorkerAsync(); } private void EnableGameButtons() { button1.Enabled = true; button2.Enabled = true; button3.Enabled = true; button4.Enabled = true; button5.Enabled = true; button6.Enabled = true; button7.Enabled = true; button8.Enabled = true; button9.Enabled = true; } private void DisableGameButtons() { button1.Enabled = false; button2.Enabled = false; button3.Enabled = false; button4.Enabled = false; button5.Enabled = false; button6.Enabled = false; button7.Enabled = false; button8.Enabled = false; button9.Enabled = false; } private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e) { // Placeholder for checkedListBox selected index change handling } private void button1_Click(object sender, EventArgs e) { button_Click(sender, e); } private void button2_Click(object sender, EventArgs e) { button_Click(sender, e); } private void button3_Click_1(object sender, EventArgs e) { button_Click(sender, e); } private void button4_Click(object sender, EventArgs e) { button_Click(sender, e); } private void button5_Click(object sender, EventArgs e) { button_Click(sender, e); } private void button6_Click(object sender, EventArgs e) { button_Click(sender, e); } private void button7_Click(object sender, EventArgs e) { button_Click(sender, e); } private void button8_Click(object sender, EventArgs e) { button_Click(sender, e); } private void button9_Click(object sender, EventArgs e) { button_Click(sender, e); } private void challengeButton_Click(object sender, EventArgs e) { if (checkedListBox1.CheckedItems.Count == 0) { MessageBox.Show("Please select a player to challenge."); return; } string player = checkedListBox1.CheckedItems[0].ToString().Split(' ')[0]; // Notify player to accept challenge DialogResult result = MessageBox.Show($"{player}, do you accept the challenge?", "Challenge", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) { MessageBox.Show("Challenge accepted! Starting game..."); isChallengeAccepted = true; StartHost(); EnableGameButtons(); } else { MessageBox.Show($"{player} declined the challenge."); } } } } [/code] Я пытался получить помощь от ChatGPT и Copilot, чтобы решить проблему с кодом, но проблема не устранена. Подробнее здесь: [url]https://stackoverflow.com/questions/78757641/socket-is-null-please-check-if-the-challenge-has-been-accepted-correctly[/url]