gpt4 book ai didi

C# 是什么导致我的简单消息传递服务器在启动时没有响应

转载 作者:行者123 更新时间:2023-12-03 01:56:25 25 4
gpt4 key购买 nike

我对使用 C# 的网络非常陌生,第一次尝试它时,我决定编写一个非常非常简单的服务器程序,但不幸的是应用程序停止响应......这里是服务器代码:

public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();
stat.Text = "Status";


}

private void StatusAndMsg_TextChanged(object sender, EventArgs e)
{

}

private void stat_TextChanged(object sender, EventArgs e)
{

}

public void SetText(string text)
{

}

private void StartBtn_Click(object sender, EventArgs e)
{
try
{
TcpListener listener = new TcpListener(IPAddress.Parse("192.168.1.31"), 60000);
listener.Start();
StatusAndMsg.Text = "lisening for connection requests";

while (true)
{
StatusAndMsg.Text = "lisening for connection requests";

TcpClient client = listener.AcceptTcpClient();

StreamReader sr = new StreamReader(client.GetStream());
StreamWriter sw = new StreamWriter(client.GetStream());
string s = null;

while (s != "Exit")
{
StatusAndMsg.Text = "you can now start typing";
sw.WriteLine(textBox1.Text);
sw.Flush();
StatusAndMsg.Text = "client : " + sr.ReadLine();
}
sw.Close();
sr.Close();
client.Close();
}


}catch (Exception b)
{
StatusAndMsg.Text = "error : " + b;
}
}

private void textBox1_TextChanged(object sender, EventArgs e)
{

}
}

正如您所看到的,在我单击开始按钮之前,一切都与开始按钮相关联,一切正常,它在文本框中写入“状态”一词,但是当我单击开始按钮时,窗口停止响应,我什至无法按按钮或者在文本框中输入我尝试更改端口重新启动程序,但它仍然无法正常工作我想我可能犯了一个非常新手的错误,对此感到抱歉,但有人可以找到程序不响应的原因,以便我可以继续学习网络编程

提前致谢

最佳答案

是的,您犯了一个非常常见的错误,您将代码放置在 UI 事件中,这意味着代码正在 UI 线程上执行。如果您用代码锁定该线程(您有一个无限循环),那么 UI 将永远不会再次可用。

为此,您需要使用异步代码或单独的线程,“最简单”的解决方案是线程:

private void StartBtn_Click(object sender, EventArgs e)
{
Thread listenerThread = new Thread(listen);
listenerThread.Start();
}

void listen(object State)
{

try
{
TcpListener listener = new TcpListener(IPAddress.Parse("192.168.1.31"), 60000);
listener.Start();
this.BeginInvoke((Action)(() => {StatusAndMsg.Text = "lisening for connection requests";}));


while (true)
{
this.BeginInvoke((Action)(() => {StatusAndMsg.Text = "lisening for connection requests";}));

TcpClient client = listener.AcceptTcpClient();

StreamReader sr = new StreamReader(client.GetStream());
StreamWriter sw = new StreamWriter(client.GetStream());
string s = null;

while (s != "Exit")
{
this.BeginInvoke((Action)(() => {StatusAndMsg.Text = "you can now start typing";}));
sw.WriteLine(textBox1.Text);
sw.Flush();
this.BeginInvoke((Action)(() => {StatusAndMsg.Text = "client : " + sr.ReadLine();}));

}
sw.Close();
sr.Close();
client.Close();
}


}catch (Exception b)
{
this.BeginInvoke((Action)(() => {StatusAndMsg.Text = "error : " + b;}));

}

}

另请注意在辅助线程上使用 BeginInvoke,因为您无法从辅助线程与主线程交互。

关于C# 是什么导致我的简单消息传递服务器在启动时没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45336699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com