c# - 编写TcpClient client = list.AcceptTcpClient();后程序无法打开。

标签 c# sockets network-programming

我必须在Windows窗体的标签上显示客户端ip地址
这是我写的代码

    private void Form1_Load(object sender, EventArgs e)
    {
        IPEndPoint end = new IPEndPoint(IPAddress.Any, 8000);
        TcpListener list = new TcpListener(end);
        list.Start();

        TcpClient client = list.AcceptTcpClient();

        label5.Text = client.Client.LocalEndPoint.ToString();
    }

当我在TcpClient client = list.AcceptTcpClient()上发表评论时,我的程序启动了,但绝对不会显示客户端的IP地址

有什么建议吗

最佳答案

AcceptTcpClient()是一种阻止方法。如果从Load事件处理程序(在UI线程中本身被调用)调用它,则将阻塞应该处理用户界面的线程。直到客户端实际尝试连接并且AcceptTcpClient()方法返回之前,程序中什么都不会发生。

您可以通过使用方法的异步版本来解决此问题。例如:

private async void Form1_Load(object sender, EventArgs e)
{
    IPEndPoint end = new IPEndPoint(IPAddress.Any, 8000);
    TcpListener list = new TcpListener(end);
    list.Start();

    TcpClient client = await list.AcceptTcpClientAsync();

    label5.Text = client.Client.LocalEndPoint.ToString();
}

这将在调用Form1_Load()方法时让AcceptTcpClientAsync()方法返回,从而允许UI线程继续工作。如果并且当客户端确实连接时,将继续执行Form1_Load()方法,将accept操作的结果复制到client变量中,然后执行下一条语句(即,更新label5.Text)。

当然,就目前的代码而言,您似乎对接受的TcpClient没有做任何事情(除了报告其IP/端口信息)。大概您打算添加更多代码来处理实际的客户端连接。在执行操作时,请始终牢记以上几点;您需要始终保持UI线程自由运行,并且使用async/await惯用法是做到这一点的最佳方法。

关于c# - 编写TcpClient client = list.AcceptTcpClient();后程序无法打开。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33583114/

相关文章:

c# - 文件浏览器对话框实现

java - Android:在应用程序生命周期中仅初始化一次套接字

c++ - 字符数组不会在我的服务器中打印

c - 将应用程序从小端架构移植到大端架构

network-programming - nat遍历: UPnP/IGD vs NAT-PMP

c# - 如何从可观察集合中正确填充列表框?

c# - Entity Framework 4 中的 DataGrid 绑定(bind)不更新

c# - 为什么文本框验证不起作用

sockets - Nginx +瘦套接字权限错误==错误的网关

java - 为什么我会失去蓝牙客户端/服务器连接?