【问题标题】:UDP Connection Between Client and Server客户端和服务器之间的 UDP 连接
【发布时间】:2012-10-03 06:35:28
【问题描述】:

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

服务器代码:

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");
    }
}

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

我需要它为客户再次刷新和发送数据。

【问题讨论】:

  • 什么意思:卡住了?是有错误还是只是挂了?
  • 我无法访问按钮,我必须通过任务管理器关闭它
  • 您正在等待响应,但是 UDP 是无状态的,并且无法保证数据接收,因此如果出于某种原因它发送它并且它从未到达它不会像 TCP 那样排序......如果你需要保证投递,需要TCP

标签: c# udpclient


【解决方案1】:

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

【讨论】:

  • 我认为这是问题所在,但如何给自己一个时间
  • 我认为 UDPClient 不可能。尝试 Socket 类并从那里扩展......
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    服务器端的 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");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-02-16
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 2022-01-24
      • 2010-12-25
      • 2017-05-25
      • 2012-04-24
      相关资源
      最近更新 更多