C# UDP網絡通信的實現示例
TCP和UDP基本概念
TCP:(Transmission Control Protocol)是一種面向連接、可靠的、基于字節(jié)流的傳輸層通信協議。并且提供了全雙工通信,允許倆個應用直接建立一個可靠的連接以進行數據交換/UDP:(User Datagram Protocol):是一種無連接、不可靠、基于數據報文傳輸層協議,它不提供數據包的分組。排序和組裝功能也不提供可靠性的保證
TCP和UDP區(qū)別
1.TCP是基于連接 而udp基于非連接
2.tcp傳輸數據穩(wěn)定可靠,適用于對網絡通信質量要求高的場景,需要準確無誤發(fā)給對方 例如 傳輸文件 發(fā)送郵件 瀏覽網頁
3.udp優(yōu)點是速度快,輕量級。但是有可能會產生丟包,所以適用于實時性要求較高的但是對丟包沒有要求太高場景,例如 域名查詢 語音通話 視頻直播等
UDP協議特點
1.udp基于IP的簡單的協議,不可靠的協議
2.優(yōu)點就是簡單 輕量化 傳輸速度高、要求可靠性不太高
3.缺點:沒有流量控制,沒有應答確認機制。不能解決丟包重發(fā)錯順序問題
UDP使用場景
當應用程序對傳輸的可靠性要求不高,但是對傳輸速度和延遲要求較高時可以使用udp協議。例如語音和視頻聊天。主要在這些場景如果丟了一倆個數據包 不會產生太大的影響。
UDP服務器
控件
兩個按鈕(打開服務器按鈕,發(fā)送消息按鈕),輸入框,文本框控件(RichTextBox:顯示聊天)
打開服務器按鈕方法
創(chuàng)建全局變量 Socket
// 先講socket進行客戶端和服務器的書寫 Socket socket; private void button1_Click(object sender, EventArgs e) { //參數1 ip地址類型 ipv4的類型 //參數2 傳遞數據類型 數據報文類型 //參數3 協議類型 udp協議 //1 創(chuàng)建socket套接字作為服務器對象 socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); // 2綁定ip和端口 IPAddress iPAddress = IPAddress.Parse("192.168.107.83"); socket.Bind(new IPEndPoint(iPAddress,8081)); //3 接受消息 startReceive(); } void startReceive() { //創(chuàng)建線程 開啟線程 new Thread(() => { byte[] body = new byte[1024]; while (true) { int count = socket.Receive(body); //接受數據 string s = Encoding.UTF8.GetString(body, 0, count); richTextBox1.Invoke((Action)(() => { richTextBox1.AppendText(s + "\t\n"); richTextBox1.SelectionStart=richTextBox1.Text.Length; richTextBox1.ScrollToCaret(); })); } }).Start() ; }
發(fā)送消息事件
//發(fā)消息的方法 給指定的人發(fā)消息 string[] ips = new string[] {"192.168.107.83", }; private void button2_Click(object sender, EventArgs e) { socket.SendTo(Encoding.UTF8.GetBytes(this.textBox1.Text), new IPEndPoint(IPAddress.Parse("192.168.107.83"), 8082) ); }
UDP客戶端
控件
三個按鈕(打開,發(fā)送,關閉),RichTextBox(顯示聊天)
public Form1() { InitializeComponent(); } void f1() { byte[] body = new byte[1024]; while (true) { int count = socket.Receive(body); //接受數據 string s = Encoding.UTF8.GetString(body, 0, count); richTextBox1.Invoke((Action)(() => { richTextBox1.AppendText(s + "\t\n"); richTextBox1.SelectionStart = richTextBox1.Text.Length; richTextBox1.ScrollToCaret(); })); } } // 打開連接 Socket socket; private void button1_Click(object sender, EventArgs e) { try { //1創(chuàng)建客戶端對象 socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //bind 如果前后端寫的端口一致的時候 出現錯誤,端口號只能使用一次 //2 綁定ip和端口號 socket.Bind(new IPEndPoint(IPAddress.Parse("192.168.107.83"), 8082)); Thread th = new Thread(f1); th.Start(); } catch (Exception ex) { MessageBox.Show("端口號被占用"); } } //發(fā)送消息 private void button2_Click(object sender, EventArgs e) { if (socket != null) { //參數1 發(fā)送的字符串轉成字節(jié)數組 //參數2 發(fā)送數據的遠程終端 new IPEndPoint(IPAddress.Parse("192.168.107.83"), 8081) socket.SendTo(Encoding.UTF8.GetBytes("倒反天罡"), new IPEndPoint(IPAddress.Parse("192.168.107.83"), 8081)); } } //關閉 private void button3_Click(object sender, EventArgs e) { socket.Close();//關閉 socket = null; }
到此這篇關于C# UDP網絡通信的實現示例的文章就介紹到這了,更多相關C# UDP網絡通信內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!