我的代码似乎停止了Socket client = listener.AcceptSocket();
此代码在控制台应用程序中运行良好,但当我尝试在Windows窗体应用程序中使用它时,它无法启动/窗口没有显示
这是我的代码:
public Form1()
{
InitializeComponent();
Listen();
}
public void Listen()
{
try
{
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
Console.WriteLine("Starting TCP listener...");
TcpListener listener = new TcpListener(ipAddress, 1302);
listener.Start();
while (true)
{
Console.WriteLine("Server is listening on " + listener.LocalEndpoint);
Console.WriteLine("Waiting for a connection...");
Socket client = listener.AcceptSocket(); // <----- PROBLEM
Console.WriteLine("Connection accepted.");
Console.WriteLine("Reading data...");
byte[] data = new byte[100];
int size = client.Receive(data);
Console.WriteLine("Recieved data: ");
for (int i = 0; i < size; i++)
Console.Write(Convert.ToChar(data[i]));
Console.WriteLine();
client.Close();
}
listener.Stop();
}
catch (Exception e)
{
Console.WriteLine("Error: " + e.StackTrace);
Console.ReadLine();
}
}
private void button1_Click(object sender, EventArgs e)
{
if (richTextBox1.Text != "")
{
textToSend = richTextBox1.Text;
run = true;
}
else
{
MessageBox.Show("Box Cant Be Empty");
run = false;
}
if (run)
{
try
{
TCPclient = new TcpClient(SERVER_IP, PORT_NO);
nwStream = TCPclient.GetStream();
}
catch
{
}
byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes(textToSend);
//---send the text---
MessageBox.Show("Sending : " + textToSend);
nwStream.Write(bytesToSend, 0, bytesToSend.Length);
}
}
答案 0 :(得分:0)
即使正在运行的代码繁忙,控制台也会继续输出。它是在您的应用程序之外绘制的。
您正在使用的Windows窗体需要主应用程序线程才能更新并绘制表单。您应该查找async / await模式并学习使用它来阻止IO调用。这个主题太大了,无法给你一个简单的快速回答,但你可以在这里找到关于async / await的一些信息:https://msdn.microsoft.com/library/hh191443(vs.110).aspx虽然可能有更好的文章可以找到一些googlefu。
此处可以找到有关UI响应的一些其他信息: https://msdn.microsoft.com/en-us/library/windows/desktop/dd744765(v=vs.85).aspx
答案 1 :(得分:0)
Socket client = listener.AcceptSocket();
正在等待传入的数据包。 除非收到一个,否则WinForm UI将不会显示,因为您在表单构造函数中调用Listen();
,从而阻止了主线程(UI)。
在另一个帖子中运行Listen();
。