C# UDP監聽端口


主窗體: 

using System; 

using System.Collections.Generic;
 using System.ComponentModel;
 using System.Data; 
using System.Drawing; 
using System.Text; 

using System.Windows.Forms;
 using System.Text.RegularExpressions;
 using System.Net; 

using System.Net.Sockets; 

using System.Threading; 

namespace UDPListenPorts {
 public partial class UDPSever : Form {
 /*聲明了一個事件MessageArrived,聲明事件之前我們先聲明了一個名為MessageHandler的委托。
 * 可以看出,與委托有明顯的區別,事件不是一個類型,而是類的一個成員,是屬於類的,和字 
* 段、屬性、方法一樣,都是類的一部分。聲明MessageArrived事件需要使用關鍵字event,並 
* 在前面加上委托類型的名稱,如果不加關鍵字event就和上文所述的聲明委托變量一樣了。事 
* 件前面的委托類型說明,處理事件的函數必須符合委托所指定的原型形式。*/

 public delegate void MessageHandler(string Message);//定義委托事件 
public event MessageHandler MessageArrived; 
public delegate void DelegateChangeText(string Messages);//委托文本框 
StringBuilder stringbuilder = new StringBuilder();//緩存 
public delegate void DelegateChangeDataGridView(string time, string ip, string data);//委托
DataGridView public delegate void DataGridViewHandler(string time, string ip, string data);//定義委托事件
 public event DataGridViewHandler DataGridViewed; 
ConnectSql connectsql = new ConnectSql(); 
public UdpClient ReceiveUdpClient; 

/// 

/// 偵聽端口名稱 /// 
public int PortName; 

/// /// 本地地址 /// 
public IPEndPoint LocalIPEndPoint; 

/// /// 日志記錄 /// 
public StringBuilder Note_StringBuilder; 

/// /// 本地IP地址 /// 
public IPAddress MyIPAddress; 
public UDPSever() {
 InitializeComponent(); 

//獲取本機可用IP地址 
IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName()); 
foreach (IPAddress ipa in ips) { 
if (ipa.AddressFamily == AddressFamily.InterNetwork)
 { 
MyIPAddress = ipa;//獲取本地IP地址
 break; 
} 
} 
Note_StringBuilder = new StringBuilder(); 
} 
public void Thread_Listen() { 

//創建一個線程接收遠程主機發來的信息 
Thread myThread = new Thread(ReceiveData); 
myThread.IsBackground = true; myThread.Start(); 
} 

/// /// 接收數據 /// 
private void ReceiveData() { 
try {
 ReceiveUdpClient = new UdpClient(PortName);
 } 
catch { 
MessageBox.Show("正在監聽中!"); 
} 
IPEndPoint remote = new IPEndPoint(IPAddress.Any,PortName); 
while (true) { 
try { 

//關閉udpClient 時此句會產生異常
 byte[] receiveBytes = ReceiveUdpClient.Receive(ref remote); 
string receiveMessage = Encoding.Default.GetString(receiveBytes, 0, receiveBytes.Length);
 // receiveMessage = ASCIIEncoding.ASCII.GetString(receiveBytes, 0, receiveBytes.Length); 
string datetime = DateTime.Now.ToString(); 
MessageArrived(string.Format("{0}來自{1}:{2}", 
datetime, remote, receiveMessage)); 
DataGridViewed(datetime,remote.ToString(),receiveMessage); 

//try 

//{
 // Byte[] sendBytes = Encoding.ASCII.GetBytes("Is anybody there?");
 // ReceiveUdpClient.Send(sendBytes, sendBytes.Length, local);
 //} 

//catch (Exception e) 

//{ 

//} 

//break;
 } 
catch(Exception ex) { 
MessageBox.Show(ex.Message); 
break; 
} 
} 
} 

//監聽 
private void btn_Listen_Click(object sender, EventArgs e) 
{ 
PortName = Convert.ToInt32(cbx_Port.Text.ToString(), 10); 
Thread_Listen(); 
MessageArrived += new MessageHandler(MessageArriveds);//文本事件 
DataGridViewed += new DataGridViewHandler(DataGridViewShow); } //文本框Invoke方法需要創建一個委托。你可以事先寫好函數和與之對應的委托 
private void MessageArriveds(string Message) 
{ 
tbx_Show.Invoke(new DelegateChangeText(ChangeTxt), Message);
 } 

//委托函數 
void ChangeTxt(string Messages) 
{ 
string SbuText = stringbuilder.ToString(); 
stringbuilder.Remove(0, stringbuilder.Length); 
stringbuilder.Append(Messages + "\r\n" + SbuText);
tbx_Show.Text = stringbuilder.ToString(); 
} 
private void DataGridViewShow(string time,string ip,string data)
 { 
dgv_Content.Invoke(new DelegateChangeDataGridView(Changedgv), new object[] { time, ip, data }); 
} 

//委托DataGridView控件顯示列的文本
 void Changedgv(string time, string ip, string data) 
{ 
int index = dgv_Content.Rows.Add();
 dgv_Content.Rows[index].Cells[0].Value = time; 
dgv_Content.Rows[index].Cells[1].Value = ip; 
dgv_Content.Rows[index].Cells[2].Value = data;
 Match ipRegex = Regex.Match(ip, @"\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}");
 if (ipRegex.Success) 
{ 
if (!this.IPList.Items.Contains(ipRegex.Value))
 { 

// 向listBox中插入數據 
this.IPList.Items.Add(ipRegex.Value); 
} 
connectsql.Insert(time,ipRegex.Value,data);//將數據存到數據庫 
}
 } 

//停止監聽
 private void btn_Stop_Click(object sender, EventArgs e) 
{ 
ReceiveUdpClient.Close();
 } 

/// 

/// 大小更改時,DataGridView列表的寬度改變 ///
 ///
///

private void UDPSever_SizeChanged(object sender, EventArgs e) 
{ 
dgv_Content.Columns[2].Width = dgv_Content.Columns[2].Width = dgv_Content.Width - dgv_Content.Columns[0].Width - dgv_Content.Columns[1].Width; 
 } 

//篩選IP
 private void IPList_SelectedIndexChanged(object sender, EventArgs e) 
{ 

//移除列表 
dgv_Content.Columns.Remove("Time");
 dgv_Content.Columns.Remove("IP"); 
dgv_Content.Columns.Remove("Content");
 try { 
DataTable dt = connectsql.Select(IPList.SelectedItem.ToString(), dgv_Content); 
dgv_Content.DataSource = dt;//綁定表 
dgv_Content.Columns[0].Width = 150; 
dgv_Content.Columns[1].Width = 145; 
dgv_Content.Columns[2].Width = dgv_Content.Width - dgv_Content.Columns[0].Width - dgv_Content.Columns[1].Width; 
} 
catch (Exception ex) 
{ 
MessageBox.Show(ex.Message);
 }
 }
 //清空所有數據 
private void btn_Clear_Click(object sender, EventArgs e) 
{ 
dgv_Content.Rows.Clear(); 
IPList.Items.Clear();
tbx_Show.Text = ""; 
} 

//關閉前刪除數據表中的數據 
private void UDPSever_FormClosing(object sender, FormClosingEventArgs e)
 { 
dgv_Content.DataSource = null; 
connectsql.Truncate();
 }
 }
} 

connectsql.cs文件
 using System;
 using System.Collections.Generic; 
using System.Text; using System.Data; 
using System.Windows.Forms; 
using System.Data.SqlServerCe;
 namespace UDPListenPorts 
{ 
class ConnectSql 
{ 
SqlCeConnection conn; //聲明
 public SqlCeConnection Connect() 
{ 

//string connectionStr = @"Data Source=GFOC4K9TL9GN0Z9;Initial Catalog=UDPListen;User ID=sa;Password=;Integrated Security=True;Connect Timeout=30";//連接SQLServer 
string connectionStr = @"Data Source=E:\dk\程序\UDPListenPorts\UDPListenPorts\UDPListen.sdf";//Integrated Security=True;Connect Timeout=30//這里使用的是本地數據庫 
conn = new SqlCeConnection(connectionStr); return conn; } 

/// 

/// 向表中插入所接收的數據 /// 

///時間 

///ip ///
data public void Insert(string time, string ip, string data)
{ 
conn = Connect(); 
string Insert_Str = "INSERT INTO [UDPlisten](Time,IP,Content) VALUES('" + time + "','" + ip + "','" + data + "')"; 
SqlCeCommand cmd = new SqlCeCommand(Insert_Str, conn);//創建命令
 conn.Open(); 
cmd.ExecuteNonQuery();//執行命令 
conn.Close(); 
} 

/// /// 從表中查詢所需的數據 /// ///傳入選中的IP ///傳入要綁定的DataGridView控件名 ///
 public DataTable Select(string ip, DataGridView dgv) 
{ 
conn = Connect(); 
conn.Open(); 
DataRow row; DataTable _table = CreateDataTable(); 
if (ip == "IP列表")
 { 
string Select_Str = @"SELECT * FROM UDPlisten"; 
SqlCeDataAdapter sda = new SqlCeDataAdapter();//用於填充 DataSet 和更新 SQL Server 數據庫的一組數據命令和一個數據庫連接 
SqlCeCommand sqlComm = new SqlCeCommand(Select_Str, conn);
 //sqlComm.ExecuteNonQuery();
 SqlCeDataReader sdrr = sqlComm.ExecuteReader();
 while (sdrr.Read()) 
{ 

//int count = sdrr.FieldCount; 
row = _table.NewRow(); 
row["Time"] = sdrr[0]; 
row["IP"] = sdrr[1]; 
row["Content"] = sdrr[2];
 _table.Rows.Add(row); 
} 
int i = _table.Rows.Count; 
} 
else 
{ 
try
 { 
string Select_Str = @"SELECT Time,IP, Content FROM UDPlisten WHERE IP=" + "'" + ip.ToString() + "'"; 
SqlCeDataAdapter sda = new SqlCeDataAdapter();//用於填充 DataSet 和更新 SQL Server 數據庫的一組數據命令和一個數據庫連接 
SqlCeCommand sqlComm = new SqlCeCommand(Select_Str, conn); 

//sqlComm.ExecuteNonQuery();
 SqlCeDataReader sdrr = sqlComm.ExecuteReader(); 
while (sdrr.Read()) 
{ 

//int count = sdrr.FieldCount; 
row = _table.NewRow(); 
row["Time"] = sdrr[0]; 
row["IP"] = sdrr[1]; 
row["Content"] = sdrr[2];
 _table.Rows.Add(row); 
} 
int i = _table.Rows.Count; 

//dgv.DataSource = _table; 
} catch (Exception ex) 
{ 
MessageBox.Show(ex.Message);
 } 
} 
return _table;
 } 

//Create DataTable Rows and Column 
private static DataTable CreateDataTable() 
{ 

//Create new DataTable DataTable _table = new DataTable();
 //Declare DataColumn and DataRow variables;
 DataColumn column; 
column = new DataColumn(); 
column.DataType = System.Type.GetType("System.String"); 
column.ColumnName = "Time"; 
_table.Columns.Add(column); 
column = new DataColumn(); 
column.DataType = System.Type.GetType("System.String");
column.ColumnName = "IP"; 
_table.Columns.Add(column); 
column = new DataColumn(); 
column.DataType = System.Type.GetType("System.String"); column.ColumnName = "Content";
 _table.Columns.Add(column); 
return _table; 
} 
public void Delete()
 { }
 //刪除表的內容
 public void Truncate()
 { 
conn = Connect(); 
string Insert_Str = "DELETE FROM UDPlisten"; 
SqlCeCommand cmd = new SqlCeCommand(Insert_Str, conn);//創建命令
 conn.Open(); 
try 
{ 
cmd.ExecuteNonQuery();//執行命令
 } 
catch (Exception ex) 
{ 
MessageBox.Show(ex.Message);
 } 
conn.Close();
 } 
} 
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM