开发者

Non-Blocking UDP-Client Receive Thread-Safe Call

开发者 https://www.devze.com 2022-12-16 21:43 出处:网络
I have been looking for a solution to this problem for ages. I have tried many things, including BeginReceive(), but all to no avail. There must be a way to do this, make a UDP-Client receive call tha

I have been looking for a solution to this problem for ages. I have tried many things, including BeginReceive(), but all to no avail. There must be a way to do this, make a UDP-Client receive call that is non blocking AND thread safe. I am trying to receive a message and write it to a Rich Text Box.

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 UDPC开发者_如何转开发lient 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);
        }

    }
}

Enough code, yes? Thanks in advance for all responses.


I found that using a Timer() allowed me to circumvent this problem.

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();

        }
    }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消