Я пытаюсь создать клиент, который прослушивает данные на сервере и обновляет интерфейс на основе этого.
Также одним нажатием кнопки клиент должен иметь возможность отправлять сообщения на сервер и т. Д.
при нажатии кнопки подключения я создаю поток serverListener, который подключается к серверу и прослушивает входящие данные (?).
Когда клиент подключен, сервер отправляет данные (gamestatus) клиенту, и на основании этого я пытаюсь обновить пользовательский интерфейс (скрывая панель входа и показывая панель лобби). Я не знаю, насколько правильный код, но пока он там работает нормально, сервер передает данные игрового состояния клиенту и на этом основании я скрываю панель gameEntrance и показываю панель лобби. Также я успешно отправляю данные userName от клиента к серверу внутри serverListener. Затем для тестирования я пытаюсь передать данные от клиента к серверу, используя trashButtonClick, который находится в лобби-панели, но кажется, что я не могу получить доступ к потоку, поэтому я не могу отправить данные на сервер.
NetworkStream stream = client.GetStream();//in trashbuttonclick
дает System.ObjectDisposedException
ошибку.
using System;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
// This is the code for your desktop app.
// Press Ctrl+F5 (or go to Debug > Start Without Debugging) to run your app.
namespace quizclient
{
public partial class Form1 : Form
{
TcpClient client = new TcpClient();
public Form1()
{
InitializeComponent();
ipTextBox.Text = "127.0.0.1";
portTextBox.Text = "8080";
}
private void Form1_Load(object sender, EventArgs e)
{
}
async void serverListener(String ip,int port)
{
try
{
IPAddress IP = IPAddress.Parse(ip);
await client.ConnectAsync(IP, port);
if (client.Connected)
{
NetworkStream stream = client.GetStream();
StringBuilder serverStringBuilder = new StringBuilder();
string serverString;
string clientString;
while (client.Connected)
{
byte[] buffer = new byte[client.ReceiveBufferSize];
int read = await stream.ReadAsync(buffer, 0, buffer.Length);
if (read > 0)
{
foreach(byte a in buffer)
{
if (a.Equals(00))
{
break;
}
else
{
serverStringBuilder.Append(Convert.ToChar(a).ToString());
}
}
serverString = serverStringBuilder.ToString();
if (serverString.All(char.IsDigit))
{
if (Convert.ToInt32(serverString) == 1)
{
MessageBox.Show("Game has already started.You cant join.");
break;
}
else if (Convert.ToInt32(serverString) == 0)
{
clientString = "username:" + userNameTextBox.Text;
this.Invoke((Action)delegate () // updating form this might be wrong
{
entrancePanel.Visible = false;
lobbyPanel.Visible = true;
});
Console.WriteLine("sending username to server...");
byte[] sendData = new byte[Encoding.ASCII.GetByteCount(clientString)];
sendData = Encoding.ASCII.GetBytes(clientString);
stream.Write(sendData, 0, sendData.Length);
}
}
}
}
}
}
catch (Exception ex)
{
client.Close();
}
}
private void connectButton_Click(object sender, EventArgs e)
{
string serverIp = ipTextBox.Text;
Console.WriteLine(serverIp);
int port;
if (!int.TryParse(portTextBox.Text, out port))
{
// input wasn't parseable to an integer, show a message perhaps?
}
Console.WriteLine(port);
string userName = userNameTextBox.Text;
Thread t = new Thread(() => serverListener(serverIp,port));
t.IsBackground = true;
t.Start();
}
private void label6_Click(object sender, EventArgs e)
{
}
private void trashButton_Click(object sender, EventArgs e)
{
NetworkStream stream = client.GetStream(); //crashes when i press this button.
byte[] sendData = new byte[Encoding.ASCII.GetByteCount("testmessagefromclienttoserver")];
sendData = Encoding.ASCII.GetBytes("testmessagefromclienttoserver");
stream.Write(sendData, 0, sendData.Length);
}
}
}