Сокет равен нулю. Пожалуйста, проверьте, правильно ли принят вызов [закрыто]C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Сокет равен нулю. Пожалуйста, проверьте, правильно ли принят вызов [закрыто]

Сообщение Anonymous »

почему отображается сообщение «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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Веб-сокет не уведомляет отправителя или получателя, когда запрос на добавление в друзья принят
    Anonymous » » в форуме Android
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Вызов метода, если он не равен нулю в C#
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • DetailViewController UISplitViewController равен нулю, если для параметра overrideUserInterfaceStyle установлено значени
    Anonymous » » в форуме IOS
    0 Ответы
    62 Просмотры
    Последнее сообщение Anonymous
  • ActiveConversation всегда равен нулю при разработке приложения iMessage.
    Гость » » в форуме IOS
    0 Ответы
    78 Просмотры
    Последнее сообщение Гость
  • Почему движок равен нулю или мне нужно скачать библиотеку [дубликат]
    Гость » » в форуме JAVA
    0 Ответы
    43 Просмотры
    Последнее сообщение Гость

Вернуться в «C#»