我运行我的服务器succsessfully,但当我打印我以前在控制台屏幕上打印的数据,以解决我正在发生的事情,我想在文本框上显示所有,但它不显示,当我关闭连接时客户端显示所有信息。为什么会这样?
这是我的代码
public void GetData()
{
Form1 f = new Form1();
string ipadd = getip();
IPAddress ipAd = IPAddress.Parse("192.168.0.15"); //use local m/c IP address, and use the same in the client
// IPAddress ip = IPAddress.Parse(ipadd);
txtip.Text = ipAd.ToString();
txtport.Text = "3030";
/* Initializes the Listener */
TcpListener myList = new TcpListener(ipAd, 3030);
/* Start Listeneting at the specified port */
myList.Start();
txtdata.Text = "The server is running at port 3030...";
txtdata.Text = txtdata.Text + Environment.NewLine + "The local End point is :" + myList.LocalEndpoint;
txtdata.Text = txtdata.Text + Environment.NewLine + "Waiting for a connection.....";
Socket s = myList.AcceptSocket();
txtdata.Text = txtdata.Text + Environment.NewLine +"Connection accepted from " + s.RemoteEndPoint;
// txtdata.Text = "Connection accepted from " + s.RemoteEndPoint;
}
当我在控制台上写数据时看看上面的代码,但我想在txtdata(文本框)上打印,但它不打印,直到客户端连接关闭。
答案 0 :(得分:0)
您正在阻止UI线程。在您的方法完成执行之前,UI无法更新,因为它只能从UI线程更新。
理想情况下,您希望使用异步I / O而不是阻止UI线程。或者,在最坏的情况下,使用单独的线程来处理通信。
var listener = new TcpListener(IPAddress.Any, 24221);
listener.Start();
txtdata.Text = "The server is running...";
var client = await listener.AcceptTcpClientAsync();
此代码避免阻塞UI线程 - 相反,UI线程可以自由地执行它需要做的任何事情,直到客户端连接,这将导致代码执行在await
点继续,再次打开UI线程。
此外,尝试使用可用的最高抽象 - 在这种情况下,AcceptTcpClient
而不是AcceptSocket
。当TcpClient
为您提供简单的基于流的界面时,无需使用原始套接字。