C# 使用Tcp/Udp協(xié)議的示例代碼
更新時間:2020年08月04日 10:25:02 作者:尋夢人i
這篇文章主要介紹了C# 使用Tcp/Udp協(xié)議的示例,文中代碼非常詳細,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
所使用的:多線程 委托 Socket 鍵值隊
個人跟著視頻做的一個小練習(xí),有興趣的可以去看一下對于初學(xué)者來講是比較有幫助的
連接: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進行關(guān)聯(lián) socket.Bind(IEnd); MessageBox.Show("服務(wù)器開啟成功!"); } catch (Exception ex) { //失敗了直接return出去 MessageBox.Show("服務(wù)器開啟失敗" + ex.Message); return; } //socket可以對多少個客戶端進行監(jiān)視 socket.Listen(10); #endregion #region 第二部開啟多線程 //開始進行多線程操作 開始執(zhí)行此線程時要調(diào)用的方法的 thread = new Thread(ListenConnectingl); //此線程則為后臺線程 thread.IsBackground = true; //啟動線程 thread.Start(); //連接到服務(wù)器后把按鈕禁用掉 button1.Enabled = false; #endregion } /// <summary> /// 正在進行的后臺線程的方法 /// </summary> private void ListenConnectingl() { //線程使用時進行循環(huán) while (true) { //創(chuàng)建一個新的Socket 列:如果有一個新的客戶端來連接服務(wù)器給他一個Socket Socket socketConnect = socket.Accept(); //把誰連接的客戶端給到skt中 字符串 string skt = socketConnect.RemoteEndPoint.ToString(); Dic.Add(skt, socketConnect); Invoke(myAddOnlieDelegate, skt, true); //更新設(shè)備列表 需要接受來自不同客戶端的消息 接著在開一個線程 Thread thr = new Thread(ReceiveMsg); thr.IsBackground = true; thr.Start(socketConnect); } } /// <summary> /// 開的發(fā)送接受的線程 直接從上面?zhèn)鬟f過來參數(shù) vs中沒顯示用什么類型的 視頻中vs顯示可以使用object類型 所有類型的基類來展示 帶參的 /// </summary> /// <param name="socketConnect"></param> private void ReceiveMsg(object socketConnect) { //as:轉(zhuǎn)換強轉(zhuǎn) 把object轉(zhuǎn)換成Socket Socket so = socketConnect as Socket; while (true) { byte[] arr = new byte[1024 * 1024 * 2]; //定義一個變量 int Length = -1; //try //{ //Receive返回的是一個int類型的數(shù)據(jù) 如果沒有的直接關(guān)閉掉 Length = so.Receive(arr); //} //catch (Exception) //{ // //如果字節(jié)數(shù)沒有的話把他移除掉 // string str = so.RemoteEndPoint.ToString(); // Dic.Remove(str); // //引用的委托 // //Invoke(myAddTextDelegate, str+"下線了"); // Invoke(myAddOnlieDelegate, str, false); // break; //} //加的if判斷條件 if (Length == 0) { //如果字節(jié)數(shù)沒有的話把他移除掉 string str = so.RemoteEndPoint.ToString(); Dic.Remove(str); //引用的委托 Invoke(myAddOnlieDelegate, str, false); break; } else { //如果成功把接受的byte轉(zhuǎn)換成string string str = Encoding.UTF8.GetString(arr); Invoke(myAddTextDelegate, str+Environment.NewLine); } } } /// <summary> /// 發(fā)送消息 只能發(fā)送字節(jié)流 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button2_Click(object sender, EventArgs e) { //要發(fā)送的文字 string str=txt_gocentext.Text.Trim(); byte[] bt = Encoding.UTF8.GetBytes(str); /// if (listOne.SelectedItems.Count == 0) { MessageBox.Show("請選擇要發(fā)送的對象"); } else { foreach (String item in listOne.SelectedItems) { //send發(fā)送到指定的socket中 Dic[item].Send(bt); string Msg = "[發(fā)送]" + 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協(xié)議的示例代碼的詳細內(nèi)容,更多關(guān)于C# 使用Tcp/Udp協(xié)議的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
c#幾種數(shù)據(jù)庫的大數(shù)據(jù)批量插入(SqlServer、Oracle、SQLite和MySql)
這篇文章主要介紹了c#幾種數(shù)據(jù)庫的大數(shù)據(jù)批量插入(SqlServer、Oracle、SQLite和MySql),需要的朋友可以了解一下。2016-11-11c#重寫TabControl控件實現(xiàn)關(guān)閉按鈕的方法
這是關(guān)于c#重寫TabControl控件實現(xiàn)關(guān)閉按鈕的例子,整理了一下,與大家分享。2013-04-04