为什么在Load事件中连接到套接字时不显示我的表单?

时间:2017-04-02 15:08:04

标签: c# winforms sockets

此代码中的表单不会出现。我该怎么把它展示出来?通过控制台,一切正常。

 void Form1_Load(object sender, EventArgs e)
        {
            String host = Dns.GetHostName();//name kompa
            //ip pc
            IPAddress ip = Dns.GetHostByName(host).AddressList[0];
            const int port = 2222;
            label1.Text = host;
            label2.Text = "Сервер запущен на " + ip.ToString() + ":" + port.ToString();
            server.serversocket = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            server.serversocket.Bind(new IPEndPoint(ip, port));
            server.serversocket.Listen(100);

            //ошибочка в цикле
            while (server.work)
            {
                MessageBox.Show("dsff");
                Socket handle = server.serversocket.Accept();
                richTextBox1.AppendText("новое подключение" + handle.RemoteEndPoint.ToString());
                new user(handle);


            }

2 个答案:

答案 0 :(得分:1)

正如Hans Passant所说,你用一个while循环来阻止GUI线程。那就是不行。事件必须尽快返回,并且永远不能无限期地运行。在服务器停止工作之前,此Form_Load无法返回。

这是一个非常常见的错误,基本上是本世纪我们都为多任务和多线程而疯狂的原因。如果没有它,你甚至不能再使用文字处理器了。

答案 1 :(得分:1)

您正在阻止ui线程。对同步套接字服务器使用单独的thread将是一种解决方案。另一种选择是使用异步套接字,以便在等待连接时不阻止应用程序的执行。基于套接字代码samples

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        InitSocketServer();
    }

    internal void InitSocketServer()
    {
        IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
        var ipAddress = ipHostInfo.AddressList[0];
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
        try
        {
            Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            listener.Bind(localEndPoint);
            listener.Listen(100);
            listener.BeginAccept(AcceptCallback, listener);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    private void AcceptCallback(IAsyncResult ar)
    {
        Socket listener = (Socket)ar.AsyncState;
        Socket handler = listener.EndAccept(ar);

        string data = null;

        while (true)
        {
            var bytes = new byte[1024];
            int bytesRec = handler.Receive(bytes);
            data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
            if (data.IndexOf("<EOF>") > -1)
            {
                break;
            }
        }


        MessageBox.Show(handler.RemoteEndPoint + " : " + data);

        byte[] msg = Encoding.ASCII.GetBytes(data);

        handler.Send(msg);
        handler.Shutdown(SocketShutdown.Both);
        handler.Close();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("Test button click");
    }
}