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();
}
}
}
精彩评论