C#TCP客户端和服务器有问题

时间:2014-04-06 06:28:44

标签: c# .net winforms

我是构建客户端和服务器通信。所以我创建了两个独立的项目。问题是这不起作用。

服务器代码:

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窗体。我正在运行这两个应用程序,但屏幕上没有输出。请帮我解决一下。

提前致谢

1 个答案:

答案 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和匿名委托,因为捕获的变量可能不是线程安全的)。也为客户做同样的事情,你就完成了。