0

これは私のプログラムのサーバーコードです。これは機能していますが、データを送信した後に動かなくなります。リフレッシュして、データを再度送信できるようにする必要があります。

サーバーコード:

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

サーバーは 1 つのクライアントにデータを送信できます。一度に 1 人のクライアントを送信したい。 しかし、データを送信した後、サーバーが動かなくなります。

クライアントのデータを更新して再度送信する必要があります。

4

3 に答える 3

0

私があなたのコードを理解したら、サーバーからあなたのデータを送信し、答えを待っています。クライアントでは、データを取得するだけで、何も返送しません。また、ソケットにタイムアウトを指定しない限り、何かが到着するまで無期限に待機します。

于 2012-10-03T06:43:45.663 に答える
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");
    }
}
于 2012-10-03T07:04:30.620 に答える
0

メイン UI スレッド (button1_Click 内) で udpc.Receive() を使用しないでください。その場合、アプリケーションは何かが到着するまでハングします。タイムアウトを使用することも解決策ではありません。アプリケーションは、タイムアウトになるまでハングします。代わりに、複数のスレッドを使用する必要があります。これを行うには、Receive の代わりに BeginReceive を使用するか、新しいスレッドを明示的に作成してそこで Receive を使用します。「c# の非同期 udp ソケット」などをググると、正しく設定する方法の例がたくさん見つかります。

于 2012-10-03T07:05:08.853 に答える