標籤:
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.Sockets;using System.Net;using System.Threading;namespace WindowsFormsApplication1{ public partial class Form1 : Form { private UdpClient sendUdpClient; private UdpClient receiveUpdClient; public Form1() { InitializeComponent(); IPAddress[] ips = Dns.GetHostAddresses(""); tbxlocalip.Text = ips[0].ToString(); int port = 51883; tbxlocalPort.Text = port.ToString(); tbxSendtoIp.Text = ips[0].ToString(); tbxSendtoport.Text = port.ToString(); } private void Form1_Load(object sender, EventArgs e) { Control.CheckForIllegalCrossThreadCalls = false; } private void button1_Click(object sender, EventArgs e) { if (tbxMessageSend.Text == string.Empty) { MessageBox.Show("發送內容不可為空", "提示"); return; } // 選擇發送模式 if (chkbxAnonymous.Checked == true) { // 匿名模式(通訊端綁定的連接埠由系統隨機分配) sendUdpClient = new UdpClient(0); } else { // 實名模式(通訊端綁定到本地指定的連接埠) IPAddress localIp = IPAddress.Parse(tbxlocalip.Text); IPEndPoint localIpEndPoint = new IPEndPoint(localIp, int.Parse(tbxlocalPort.Text)); sendUdpClient = new UdpClient(localIpEndPoint); } Thread sendThread = new Thread(SendMessage); sendThread.Start(tbxMessageSend.Text); } private void SendMessage(object obj) { string message = (string)obj; byte[] sendbytes = Encoding.Unicode.GetBytes(message); IPAddress remoteIp = IPAddress.Parse(tbxSendtoIp.Text); IPEndPoint remoteIpEndPoint = new IPEndPoint(remoteIp, int.Parse(tbxSendtoport.Text)); sendUdpClient.Send(sendbytes, sendbytes.Length, remoteIpEndPoint); sendUdpClient.Close(); // 清空發送訊息框 //ResetMessageText(tbxMessageSend); } delegate void ShowMessageforViewCallBack(ListBox listbox, string text); private void ShowMessageforView(ListBox listbox, string text) { if (listbox.InvokeRequired) { ShowMessageforViewCallBack showMessageforViewCallback = ShowMessageforView; listbox.Invoke(showMessageforViewCallback, new object[] { listbox, text }); } else { lstbxMessageView.Items.Add(text); lstbxMessageView.SelectedIndex = lstbxMessageView.Items.Count - 1; lstbxMessageView.ClearSelected(); } } //delegate void ResetMessageCallback(TextBox textbox); //private void ResetMessageText(TextBox textbox) //{ // // Control.InvokeRequired屬性代表 // // 如果控制項的處理與調用線程在不同線程上建立的,則為true,否則為false // if (textbox.InvokeRequired) // { // ResetMessageCallback resetMessagecallback = ResetMessageText; // textbox.Invoke(resetMessagecallback, new object[] { textbox }); // } // else // { // textbox.Clear(); // textbox.Focus(); // } //} private void button4_Click(object sender, EventArgs e) { // 建立接收通訊端 IPAddress localIp = IPAddress.Parse(tbxlocalip.Text); IPEndPoint localIpEndPoint = new IPEndPoint(localIp, int.Parse(tbxlocalPort.Text)); receiveUpdClient = new UdpClient(localIpEndPoint); Thread receiveThread = new Thread(ReceiveMessage); receiveThread.Start(); } private void ReceiveMessage() { IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); while (true) { try { // 關閉receiveUdpClient時此時會產生異常 byte[] receiveBytes = receiveUpdClient.Receive(ref remoteIpEndPoint); string message = Encoding.Unicode.GetString(receiveBytes); // 顯示訊息內容 ShowMessageforView(lstbxMessageView, string.Format("{0}[{1}]", remoteIpEndPoint, message)); } catch { break; } } } private void button3_Click(object sender, EventArgs e) { receiveUpdClient.Close(); } private void button2_Click(object sender, EventArgs e) { this.lstbxMessageView.Items.Clear(); } }}
c# UDP通訊