我是构建客户端和服务器通信。所以我创建了两个独立的项目。问题是这不起作用。
服务器代码:
private void Form1_Load(object sender, EventArgs e)
{
IPAddress ipaddress = IPAddress.Parse("127.0.0.1");
int port = 13000;
TcpListener server = new TcpListener(ipaddress, port);
server.Start();
while (true)
{
TcpClient client = server.AcceptTcpClient();
label1.Text = "That Connected to Server";
}
}
客户代码:
private void Form1_Load(object sender, EventArgs e)
{
IPAddress ipaddress = IPAddress.Parse("127.0.0.1");
int port = 13000;
TcpClient obj = new TcpClient(ipaddress.ToString(), port);
while (true)
{
label1.Text = "connected";
}
}
此代码在控制台应用程序上正常工作。但不适用于Windows窗体。我正在运行这两个应用程序,但屏幕上没有输出。请帮我解决一下。
提前致谢
答案 0 :(得分:3)
Windows应用程序事件驱动。如果在while(true)
事件中放置Form.Load
循环,则它将不会退出该函数(并且您将看不到任何接口)。您必须在单独的线程中运行该代码,然后您将BeginInvoke
结果发送到您的UI线程。像这样:
private void Form1_Load(object sender, EventArgs e)
{
_thread = new Thread(ListenerThread);
_thread.IsBackground = true;
_thread.Start();
}
private Thread _thread;
private void ListenerThread()
{
IPAddress ipaddress = IPAddress.Parse("127.0.0.1");
int port = 13000;
TcpListener server = new TcpListener(ipaddress, port);
server.Start();
while (true)
{
TcpClient client = server.AcceptTcpClient();
BeginInvoke(new MethodInvoker(() => label1.Text = "That Connected to Server"));
}
}
当然,在UI回调方法中,您需要执行更多操作(小心使用lambdas和匿名委托,因为捕获的变量可能不是线程安全的)。也为客户做同样的事情,你就完成了。