Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 客户端和服务器之间的UDP连接_C#_Udpclient - Fatal编程技术网

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

C# 客户端和服务器之间的UDP连接,c#,udpclient,C#,Udpclient,这是我的程序的服务器代码,它正在工作,但在发送数据后,它被卡住了。我需要它被刷新,并准备再次发送数据 服务器代码: private void button1_Click(object sender, EventArgs e) { try { String text = textBox1.Text; UdpClient udpc = new UdpClient(text,8899); IPEndPoint ep = null;

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

服务器代码:

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");
    }
}
private void按钮1\u单击(对象发送者,事件参数e){
试一试{
UdpClient订户=新的UdpClient(8899);
IPAddress addr=IPAddress.Parse(“127.0.0.2”);
联合多播组(addr);
IPEndPoint ep=null;
对于(int i=0;i<1;i++){
字节[]pdata=订户接收(参考ep);
字符串strdata=Encoding.ASCII.GetString(pdata);
MessageBox.Show(strdata);
textBox1.Text=strdata;
通过=标准数据;
}
多播组(addr);
}抓住{
刷新();
MessageBox.Show(“未找到”);
}
}
服务器可以向一个客户端发送数据我想一次发送一个客户机。但发送数据后,服务器卡住了


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

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

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

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

你说的什么意思:它卡住了?是否有错误或挂起?我无法访问按钮和任何东西,我必须通过任务管理器将其关闭。您正在等待响应,但UDP是无状态的,数据接收不保证,因此,如果出于任何原因,它发送了数据,但它从未到达,则不会像TCP一样进行排序。。如果您需要保证交付,您需要TCPI认为这是问题所在,但如何给予时间我认为UDPClient不可能。尝试Socket类并从那里扩展。。。