客户端和服务器之间的UDP连接

时间:2012-10-03 06:35:28

标签: c# udpclient

这是我的程序的服务器代码,但是在它发送数据后它会卡住。我需要刷新它并准备再次发送数据。

服务器代码:

private void button1_Click(object sender, EventArgs e) {   
    try {
        String text = textBox1.Text;
        UdpClient udpc = new UdpClient(text,8899);
        IPEndPoint ep = null;

        while (true) {
            MessageBox.Show("Name: ");
            string name = textBox2.Text;

            if (name == "") break;

            byte[] sdata = Encoding.ASCII.GetBytes(name);
            udpc.Send(sdata, sdata.Length);

            if (udpc.Receive(ref ep)==null) {               
                MessageBox.Show("Host not found");
            } else {                
                byte[] rdata = udpc.Receive(ref ep);
                string job = Encoding.ASCII.GetString(rdata);
                MessageBox.Show(job);
            }
        }
    } catch {
        MessageBox.Show("Error Restarting");
    }

客户代码:

private void button1_Click(object sender, EventArgs e) {
    try {
        UdpClient subscriber = new UdpClient(8899);
        IPAddress addr = IPAddress.Parse("127.0.0.2");
        subscriber.JoinMulticastGroup(addr);
        IPEndPoint ep = null;

        for (int i = 0; i < 1; i++) {
            byte[] pdata = subscriber.Receive(ref ep);
            string strdata = Encoding.ASCII.GetString(pdata);
            MessageBox.Show(strdata);
            textBox1.Text = strdata;
            pass = strdata;
        }
        subscriber.DropMulticastGroup(addr);
    } catch {
        Refresh();
        MessageBox.Show("Not Found");
    }
}

服务器可以将数据发送到一个客户端。 我想一次发送一个客户端。但是在发送数据后,服务器卡住了。

我需要刷新并再次为客户端发送数据。

3 个答案:

答案 0 :(得分:0)

如果我理解你的代码,从服务器发送数据,然后等待答案。在客户端,您只是获取数据,但没有发回任何东西。除非你为套接字提供超时,它将无限期地等待,直到某些东西到来。

答案 1 :(得分:0)

服务器端的udpc.Receive()方法将阻止数据报从客户端接收。 UDP不可靠。这意味着服务器不期望来自另一方的任何ACK。所以你可以简单地删除这部分代码。或者如果您需要确保消息到达,请为每个客户运行一个单独的线程,如下所示:

private void button1_Click(object sender, EventArgs e) {   
    System.Threading.Thread Server_thread = new Thread(My_Send_Function);
    Server_thread .Start();
}

private void My_Send_Function() {   
    try {
        String text = textBox1.Text;
        UdpClient udpc = new UdpClient(text,8899);
        IPEndPoint ep = null;

        while (true) {
            MessageBox.Show("Name: ");
            string name = textBox2.Text;

            if (name == "") break;

            byte[] sdata = Encoding.ASCII.GetBytes(name);
            udpc.Send(sdata, sdata.Length);

            if (udpc.Receive(ref ep)==null) {
                MessageBox.Show("Host not found");
            } else {
                byte[] rdata = udpc.Receive(ref ep);
                string job = Encoding.ASCII.GetString(rdata);
                MessageBox.Show(job);
            }
        }
    } catch {
        MessageBox.Show("Error Restarting");
    }
}

答案 2 :(得分:0)

您不应在主UI线程中使用udpc.Receive()(在button1_Click内)。如果你这样做,你的应用程序将会挂起,直到某些东西到来。使用超时也不是解决方案。应用程序将挂起,直到超时到期。相反,您必须使用多个线程。您可以通过使用BeginReceive而不是Receive或显式创建新线程并在那里使用Receive来实现。如果你谷歌搜索“c#中的异步udp套接字”或类似内容,那么你会发现很多关于如何正确设置它的例子。