C# 写入TcpClient client=list.AcceptTcpClient()后,程序未打开;
我必须在windows窗体的标签上显示客户端ip地址 这是我写的代码C# 写入TcpClient client=list.AcceptTcpClient()后,程序未打开;,c#,sockets,network-programming,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 c
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地址
任何建议请接受TcpClient()是一种阻止方法。如果您从Load
事件处理程序调用它(它本身在UI线程中调用),您将阻止应该处理用户界面的线程。在客户端实际尝试连接并返回acceptcClient()
方法之前,程序中不会发生任何事情
您可以使用该方法的异步版本修复此问题。例如:
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\u Load()
方法在调用AcceptTcpClientAsync()
方法时返回,从而允许UI线程继续工作。如果客户端确实连接,将继续执行Form1\u Load()
方法,将接受操作的结果复制到client
变量中,然后执行下一条语句(即更新label5.Text
)
当然,就目前的代码而言,您似乎没有对已接受的TcpClient
执行任何操作(除了报告其IP/端口信息)。您可能打算添加更多代码来处理实际的客户端连接。当你这样做的时候,请始终记住上述内容;您需要始终保持UI线程自由运行,使用async
/wait
习惯用法是最好的方法。好的,LocalEndPoint就是本地端点。您可能需要远程端点。看起来代码是从某个地方复制的。是的,正是从我的visual studio复制的。我的windows窗体在写入list.Start()后被冻结;TcpClient client=list.AcceptTcpClient();谢谢你的帮助,先生