c# - 我如何正确实现客户端服务器侦听器并根据传入的服务器数据更新 ui
问题描述
我正在尝试创建一个客户端,它正在侦听服务器的数据并基于此更新 ui。同样通过单击按钮,客户端应该能够向服务器等发送消息。
单击连接按钮时,我创建了一个 serverListener 线程,该线程连接到服务器并侦听传入数据(?)。
当客户端连接时,服务器向客户端发送数据(游戏状态)并基于此我正在尝试更新 Ui。(隐藏入口面板并显示大厅面板)。我不知道代码有多正确,但直到它工作正常,服务器向客户端发送游戏状态数据,并基于此我隐藏游戏入口面板并显示大厅面板。此外,我在 serverListener 内成功地将用户名数据从客户端发送到服务器。然后为了测试,我尝试使用垃圾按钮单击从客户端向服务器发送数据,这是在大堂面板中,但似乎我无法访问流,因此我无法将数据发送到服务器。
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);
}
}
}
解决方案
推荐阅读
- ruby-on-rails - 如何调试“Articles#show 中的 NoMethodError”?
- python - 使用 python 应用程序进行多处理以缩短当前 36 小时的运行时间
- python - 我可以选择手动更新我的神经网络中的权重以允许基本上无限的批量大小吗?
- javascript - 使用 InjectionToken 进行注入?
- php - 如何在 Wordpress 中显示图像
- ios - IOS app crash with CFNetwork,但找不到问题
- ios - 在 mapbox 地图上用一根手指缩放似乎也改变了中心位置?
- python - 如何传递生成器以创建 threading.Thread 并访问参数数组中生成器的元素
- load - 寄存器编号如何影响 ISA 中的加载和存储次数?
- python - 熊猫映射到下周的星期一