C# 使用Tcp/Udp協議的示例程式碼
阿新 • • 發佈:2020-08-05
所使用的:多執行緒 委託 Socket 鍵值隊
個人跟著視訊做的一個小練習,有興趣的可以去看一下對於初學者來講是比較有幫助的
連線:https://www.bilibili.com/video/BV1bZ4y1W74q?p=3&t=358
廢話不多說上程式碼 綜合視訊中的理解 有什麼不對的地方希望大神指點一下
public partial class Form1 : Form { public Form1() { InitializeComponent(); myAddOnlieDelegate = AddOnlie; myAddTextDelegate = AddTexr; } private void AddTexr(string str) { //將文字追加到文字中 txt_centext.AppendText(str); } /// <summary> /// 委託方法 /// </summary> /// <param name="str"></param> /// <param name="bl"></param> private void AddOnlie(string str,bool bl) { if (bl) { //如果是true的話對listbox.Item進行一個新增 listOne.Items.Add(str); } else { //反之刪除 listOne.Items.Remove(str); } } //例項化Socket Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); //介面 Thread thread = null; //鍵值隊 Dictionary<string,Socket> Dic = new Dictionary<string,Socket>(); //委託 delegate void MyAddOnlieDelegate(string str,bool bl); delegate void MyAddTextDelegate(string str); MyAddOnlieDelegate myAddOnlieDelegate; MyAddTextDelegate myAddTextDelegate; private void button1_Click(object sender,EventArgs e) { #region 第一步獲取IP和埠進行相互通訊 //獲取IP IPAddress IP = IPAddress.Parse(txt_IP.Text.Trim()); //把IP和埠號放在IPEndPoint中 IPEndPoint IEnd = new IPEndPoint(IP,int.Parse(txt_port.Text.Trim())); try { //和socket進行關聯 socket.Bind(IEnd); MessageBox.Show("伺服器開啟成功!"); } catch (Exception ex) { //失敗了直接return出去 MessageBox.Show("伺服器開啟失敗" + ex.Message); return; } //socket可以對多少個客戶端進行監視 socket.Listen(10); #endregion #region 第二部開啟多執行緒 //開始進行多執行緒操作 開始執行此執行緒時要呼叫的方法的 thread = new Thread(ListenConnectingl); //此執行緒則為後臺執行緒 thread.IsBackground = true; //啟動執行緒 thread.Start(); //連線到伺服器後把按鈕禁用掉 button1.Enabled = false; #endregion } /// <summary> /// 正在進行的後臺執行緒的方法 /// </summary> private void ListenConnectingl() { //執行緒使用時進行迴圈 while (true) { //建立一個新的Socket 列:如果有一個新的客戶端來連線伺服器給他一個Socket Socket socketConnect = socket.Accept(); //把誰連線的客戶端給到skt中 字串 string skt = socketConnect.RemoteEndPoint.ToString(); Dic.Add(skt,socketConnect); Invoke(myAddOnlieDelegate,skt,true); //更新裝置列表 需要接受來自不同客戶端的訊息 接著在開一個執行緒 Thread thr = new Thread(ReceiveMsg); thr.IsBackground = true; thr.Start(socketConnect); } } /// <summary> /// 開的傳送接受的執行緒 直接從上面傳遞過來引數 vs中沒顯示用什麼型別的 視訊中vs顯示可以使用object型別 所有型別的基類來展示 帶參的 /// </summary> /// <param name="socketConnect"></param> private void ReceiveMsg(object socketConnect) { //as:轉換強轉 把object轉換成Socket Socket so = socketConnect as Socket; while (true) { byte[] arr = new byte[1024 * 1024 * 2]; //定義一個變數 int Length = -1; //try //{ //Receive返回的是一個int型別的資料 如果沒有的直接關閉掉 Length = so.Receive(arr); //} //catch (Exception) //{ // //如果位元組數沒有的話把他移除掉 // string str = so.RemoteEndPoint.ToString(); // Dic.Remove(str); // //引用的委託 // //Invoke(myAddTextDelegate,str+"下線了"); // Invoke(myAddOnlieDelegate,str,false); // break; //} //加的if判斷條件 if (Length == 0) { //如果位元組數沒有的話把他移除掉 string str = so.RemoteEndPoint.ToString(); Dic.Remove(str); //引用的委託 Invoke(myAddOnlieDelegate,false); break; } else { //如果成功把接受的byte轉換成string string str = Encoding.UTF8.GetString(arr); Invoke(myAddTextDelegate,str+Environment.NewLine); } } } /// <summary> /// 傳送訊息 只能傳送位元組流 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button2_Click(object sender,EventArgs e) { //要傳送的文字 string str=txt_gocentext.Text.Trim(); byte[] bt = Encoding.UTF8.GetBytes(str); /// if (listOne.SelectedItems.Count == 0) { MessageBox.Show("請選擇要傳送的物件"); } else { foreach (String item in listOne.SelectedItems) { //send傳送到指定的socket中 Dic[item].Send(bt); string Msg = "[傳送]" + item + " " + str+ System.Environment.NewLine; //使用一個委託直接寫入 Invoke(myAddTextDelegate,Msg+ Environment.NewLine); } } } private void button3_Click(object sender,EventArgs e) { Form2 form2 = new Form2(); form2.Show(); } }
以上就是C# 使用Tcp/Udp協議的示例程式碼的詳細內容,更多關於C# 使用Tcp/Udp協議的資料請關注我們其它相關文章!