udp和tcp是網路通訊常用的兩個傳輸協議,c#一般可以通過socket來實現udp和tcp通訊,由於.net框架通過udpclient、tcplistener 、tcpclient這幾個類對socket進行了封裝,使其使用更加方便, 本文就通過這幾個封裝過的類講解一下相關應用。
與tcp通訊不同,udp通訊是不分服務端和客戶端的,通訊雙方是對等的。為了描述方便,我們把通訊雙方稱為傳送方和接收方。
傳送方:
首先建立乙個udp物件:
string locateip = "127.0.0.1"; //本機ip
int locateport = 9001; //傳送埠
ipaddress locateipaddr = ipaddress.parse(locateip);
ipendpoint locatepoint = new ipendpoint(locateipaddr, locateport);
udpclient udpclient = new udpclient(locatepoinawifqzulit);
傳送資料:
string remoteip = "127.0.0.1"; //目標機器ip
int remoteport = 9002; //接收埠
ipaddress remoteipaddr = ipaddress.parse(remoteip);
ipendpoint remotepoint = new ipendpoint(remoteipaddr, remoteport);
byte buffer = encoding.utf8.getbytes(「hello」);
udpclient.send(buffer, buffer.length, remotepoint);
以上就完成了乙個傳送任務,乙個較完整的傳送**如下:
public partial class formserver : form
private void send_click(object sender, eventargs e)
debug.writeline("send ok");
} }接收端:
首先建立乙個udp物件:
string locateip = "127.0.0.1";
int locateport = 9002;
ipaddress locateipaddr = ipaddress.parse(locateip);
ipendpoint locatepoint = new ipendpoint(locateipaddr, locateport);
udpclient udpclient = new udpclient(locatepoint);
接收資料:
ipendpoint remotepoint = new ipendpoint(ipaddress.parse("1.1.1.1"), 1);
var received = udpclient.receive(ref remotepoint);
string info = encoding.utf8.getstring(received);
string from=$」 :」;
注意兩點:
1、remotepoint是獲得傳送方的ip資訊,定義時可以輸入任何合法的ip和埠資訊;
2、receive方法是阻塞方法,所以需要在新的執行緒內執行,程式會一直等待接收資料,當接收到一包資料時程式就返回,要持續接收資料需要重複呼叫receive方法。
乙個較完整的接收端**如下:
public partial class formclent : form
:」; }}
});
} }當傳送端傳送一包資料時,不管對方是否接收都是傳送成功的,udp協議本身並不會對傳送的可靠性進行驗證。(這裡的可靠性是指是否接收到,如果對方接收到資料報,其內容還是可靠的,這個在鏈路層進行了保www.cppcns.com證。)同時,由於網路延時等因素,先傳送的包並不能確定先被接收到,所以由於這兩個原因,udp通訊存在丟包和亂序的情況。
某些業務場景下,比如實時狀態監控,可能對丟包和亂序情況並不敏感, 可以不用處理,但大部分情況下還是介意丟包的,簡單的處理辦法就是把包的頭部固定長度的空間拿出來存放核對資訊,比如包編號,如果有缺失,可以要求傳送方重發,也可以進行排序。
我們對udpclent又進行一次封裝,啟用乙個執行緒進行接收資料,將接收到的資料報通過事件發布出來,這樣使用起來就更方便了。
namespace communication.udpclient
public delegate void udpreceivedeventhandler(udpstateeventargs args);
public class udpclient
else
}});
} }}
具體使用辦法:
private void btnconnect_click(object sender, eventargs e)
private void udpclient_udpmessagereceived(udpstateeventargs args)
c#網路程式設計入門系列包括三篇文章:
(一)c#網路程式設計入門之udp
(二)c#網路程式設計入門之tcp
(三)c#網路程式設計入門之http
C 網路程式設計之UDP
udp簡介 udp 是user datagram protocol的簡稱,中文名是使用者資料報協議,是 一種無連線的傳輸層 協議,提供面向事務的簡單不可靠資訊傳送服務。udp是與tcp相對應的協議,它是面向非連線的協議,它不與對方連線,而直接把資料報傳送過去。面向非連線 就是正式通訊前不必與對方建立...
網路程式設計之UDP協議
將資料及源和目的封裝成資料報,不需要建立連線。每個資料報的大小限制在64k內。因無連線,是不可靠的協議,但是速度快。客戶端 1 建立udp傳輸的傳送端 2 建立udp的socket服務 3 將要傳送的資料封裝到資料報中 4 通過udp的socket服務獎資料報傳送過去 5 關閉socket服務 pu...
Linux 網路程式設計之UDP
1.介紹 udp協議是無連線的,不可靠傳輸的協議.伺服器與客戶端的互動不需要建立連線,沒有流量控制的功能。與tcp一樣,它也是傳輸層協議,通訊過程中需要ip位址與埠號。使用udp進行程式設計包括伺服器與客戶端,下面介紹一下伺服器與客戶端的通訊流程 伺服器流程 1 建立伺服器套接字描socket 2 ...