tcplistener和客户端在同一个Forms应用程序中

时间:2017-08-30 14:52:39

标签: c# networking tcp

我的代码似乎停止了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);

        }
    }

2 个答案:

答案 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();