代码之家  ›  专栏  ›  技术社区  ›  Bloodyaugust

非阻塞的UDP客户端接收线程安全调用

  •  0
  • Bloodyaugust  · 技术社区  · 16 年前

    我一直在寻找解决这个问题的方法。我试过很多东西,包括beginreceive(),但都没有用。必须有一种方法来做到这一点,使一个UDP客户端接收调用是非阻塞和线程安全的。我正在尝试接收一条消息并将其写入一个富文本框。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
    using System.IO;
    
    namespace Chat
    {
        public partial class Form1 : Form
        {
            public bool contfunctioning = true; public bool changedsplay = false;
            public string enteredchats, msg, chatstring, Chats;
    
            UdpClient subscriber = new UdpClient(8899);
            UdpClient publisher = new UdpClient("230.0.0.100", 8898);
    
    
            public Form1()
            {
                InitializeComponent();
            }
    
    
            private void btnConnect_Click(object sender, EventArgs e)
            {
    
                string ConnectIPAddress;
                ConnectIPAddress = txtboxIP.Text;
                IPAddress addr = IPAddress.Parse(ConnectIPAddress);
    
                MessageBox.Show("Subscribing to chat server on " + ConnectIPAddress + ".", ConnectIPAddress);
    
                EndPoint ep = null;
    
                // This is where The UDPClient subscriber needs to Begin.Receive()
    
    
            }
    
            private void btnSend_Click(object sender, EventArgs e)
            {
                enteredchats = txtboxUsr.Text + " " + txtboxentertxt.Text;
                txtboxentertxt.Clear();
    
                msg = String.Format(enteredchats);
                sdata = Encoding.ASCII.GetBytes(msg);
                publisher.Send(sdata, sdata.Length);
            }
    
        }
    }
    

    足够的代码,是吗? 提前感谢您的所有回复。

    1 回复  |  直到 16 年前
        1
  •  2
  •   Bloodyaugust    16 年前

    我发现使用timer()可以避免这个问题。

    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Net;
    using System.Net.Sockets;
    using System.IO;
    using System.Threading;
    using System.Diagnostics;
    
    
    namespace Chat
    {
        public partial class Form1 : Form
        {
    
    
            public bool contfunctioning = true; public bool changedsplay = false; public bool setupntwrk = false;
            public string enteredchats, msg, chatstring, Chats, lastchatstring;
    
            UdpClient subscriber = new UdpClient(8899);
            UdpClient publisher = new UdpClient("230.0.0.100", 8898);
    
            System.Windows.Forms.Timer timer1use = new System.Windows.Forms.Timer();
    
    
    
            public Form1()
            {
                InitializeComponent();
            }
    
    
    
            private void btnConnect_Click(object sender, EventArgs e)
            {
                Thread rcvchats = new Thread(ReceiveChats);
                rcvchats.Start();
    
                timer1use.Interval = 1000;
                timer1use.Start();
            }
    
            private void btnSend_Click(object sender, EventArgs e)
            {
                enteredchats = txtboxUsr.Text + ": " + txtboxentertxt.Text;
                txtboxentertxt.Clear();
    
                msg = String.Format(enteredchats);
                byte[] sdata = Encoding.ASCII.GetBytes(msg);
                publisher.Send(sdata, sdata.Length);
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                if (chatstring != lastchatstring)
                dsplay.AppendText("\r\n" + chatstring);
    
                lastchatstring = chatstring;
    
    
            }
    
            public void ReceiveChats()
            {
                while (true)
                {
                    if (setupntwrk == false)
                    {
                        string ConnectIPAddress;
                        ConnectIPAddress = txtboxIP.Text;
                        IPAddress addr = IPAddress.Parse(ConnectIPAddress);
                        MessageBox.Show("Subscribing to chat server on " + ConnectIPAddress + ".", ConnectIPAddress);
                        subscriber.JoinMulticastGroup(addr);
    
                        setupntwrk = true;
                    }
    
                    IPEndPoint ep = null;
                    chatstring = Encoding.ASCII.GetString(subscriber.Receive(ref ep));
    
                    Thread.Sleep(1000);
                }
    
            }
    
            private void btnHost_Click(object sender, EventArgs e)
            {
                Process starthost = new Process();
                starthost.StartInfo.FileName = "C:\\ChatServ.exe";
                starthost.Start();
    
            }
        }
    }