作者在 2011-06-24 21:49:46 发布以下内容
UDP与TCP的区别:
1.UDP速度比TCP快
2.UDP有消息边界
3.UDP可以一对多传输
4.UDP可靠性不如TCP
5.UDP不能保证有序传输
UdpClient类:
提供发送和接收UDP数据报的方法。一种是使用远程主机名和端口号作为参数创建UdpClient类的实例;另一种先不创建不带参数的UdpClient类的实例,然后调用Connect()方法指定默认远程主机。
UdpClient的构造函数:
1.public UdpClient(int
port);此构造函数创建一个基础Socket,自动分配合适的本地IPv4地址,并将基础Socket与指定的本地端口号绑定。
UdpClient udpClient = new UdpClient(51666);
UdpClient sendUdpClient= new
UdpClient(0);0:表示让系统自动为其分配一个合适的端口号。
2.public UdpClient(IPEndPoint
localEp);该实例与包含本地IP底子好和端口号的IPEndPoint实例绑定。
IPAddress address =
Dns.GetHostAddresses(Dns.GetHostName())[0];
IPEndPoint iep = new IPEndPoint(address,51666);
UdpClient udpClient = new UdpClient(iep);
3.public UdpClient(string hostname,int
port);自动分配合适的IP地址和端口号,用于收发数据,并使用hostname和port参数建立默认远程主机。
UdpClient udpClient = new UdpClient("www.contoso.com",11000);
4.public
UdpClient();自动分配合适的本地IPv4地址和端口号,但是该构造函数不执行套接字绑定。
UdpClient udpCilent = new UdpClient();
udpClient.Connect("www.contoso.com",51666);
Byte[] sendBytes = Encoding.Unicode.GetBytes("你好!");
udpClient.Send(sendBytes,sendBytes.Length);
UdpClient的常用方法和属性:
名称 |
说明 |
Connect方法 |
建立默认远程主机。因为UDP是无连接,所以不会阻止调用该方法的线程。另外,如果打算接收多路广播数据报,不要调用Connect方法,否则从指定的默认地址以外的地址到达的任何数据报都将被丢弃。但是,如果在调用Send方法时指定了IPAddress.Broadcast,则可以将数据广播到默认的广播地址255.255.255.255 |
Send方法 |
发送数据报 |
Receive方法 |
接收数据报 |
BeginSend方法 |
开始从连接的socket中异步发送数据报 |
BeginReceive方法 |
开始从连接的socket中异步接收数据报 |
EndSend方法 |
结束挂起的异步发送数据报 |
EndReceive方法 |
结束挂起的异步接收数据报 |
JoinMulticaseGroup方法 |
添加多地址发送,用于连接一个多组播 |
DropMulticastGroup方法 |
除去多地址发送,用于断开UdpCilent与一个多组播的连接 |
Close方法 |
关闭UDP连接,禁用基础Socket,并释放与UdpClient关联的所有托管资源和非托管资源 |
Active属性 |
获取或设置一个值指示是否建立默认远程主机 |
Available属性 |
获取或设置缓冲器中可用数据报的数量 |
Client属性 |
获取或设置基础套接字 |
EnableBroadcast属性 |
是否接收或发送广播包 |
同步发送和接收数据:
1.发送数据:
1.public int Send(byte[] data,int
length,IPEndPoint
iep);将UDP数据报发送到位于指定远程端点主机。将数据报发送到广播,利用UdpClient的Client属性获取基础Socket,并将套接字选项设置为:SocketOptionName.Broadcast.
UdpClient udpClient = new UdpClient();
IPAddress remoteIPAddress =
Dns.GetHostAddresses(Dns.GetHostName())[0];
IPEndPoint remoteIPEndPoint = new
IPEndPoint(remoteIPAddress,51666);
byte[] sendbytes = Encoding.Unicode.GetBytes("你好!");
udpClient.Send(sendBytes,sendBytes.Length,remoteIPEndPoint);
2.public int Send(byte[] data,int
length,string hostname,int port);将UDP数据报发送到指定的远程主机上的指定端口。如果将hostname参数值指定为:255.255.255.255,可将数据报发送到默认广播地址。
UdpClient udpClient = new
UdpClient();
byte[] sendbytes =
Encoding.Unicode.GetBytes("你好!");
udpClient.Send(sendBytes,sendBytes.Length,"www.abcd.com",51666);
3.public int Send(byte[] data,int
length);将定已经通过Connect()方法指定了默认远程主机,只需发送数据和字节数。
UdpClient udpClient = new UdpClient();
byte[] sendbytes =
Encoding.Unicode.GetBytes("你好!");
udpClient.Send(sendbytes,sendbytes.Length);
2.接收数据:
public byte[] Reveive(ref IPEndPoint
remoteEP);IPEndPoint表示发送方的IP地址和端口号。
IPEndPoint RemoteIpEndPoint = new
IPEndPoint(IPAddress.Any,0);IPAddress.Any表示对方的IP地址是任何IP地址,0表示对方的任何端口号。
例子:
UdpClient udpClient = new
UdpClient(Dns.GetHostAddresses(Dns.GetHostName())[0],18001);
IPEndPoint remoteIpEndPoint = new
IPEndPoint(IPAddress.Any,0);
try{
Byte[] receiveBytes = udpClient.Receive(ref
remoteEndPoint);
string receiveData =
Encoding.Unicode.GetString(receiveBytes);
Console.WriteLine("接收到信息:"+receiveData);
}catch(Exception ex){
MessageBox.Show(ex.ToString());
}
异步发送和接收数据:
1.发送数据:
1.利用IPEndPoint实例指定远程主机信息:
同步:Send(byte[] data ,int
length,IPEndPoint iep);
异步:BeginSend(byte[] data,int
length,IPEndPoint iep,AsyncCallback ac,Object obj);
2.直接指定远程主机名及端口号:
同步:Send(byte[] data,int length,string
remoteHostName,int port);
异步:BeginSend(byte[] data,int
length,string remoteHostName,int port,AsyncCallback ac,Object obj);
3.假定在调用Send方法之前已经建立了远程主机:
同步:Send(byte[] data,int
length);
异步:BeginSend(byte[] data,int
length,AsyncCallback ac,Object obj);
static void SendMessage(string server,string message)
{
UdpClient udpClient = new
UdpClient(server,51666);
byte[] sendByte =
Encoding.Unicode.GetBytes("你好!");
IAsyncResult result =
udpClient.BeginSend(sendByte,sendByte.Length,null,null);
while(!result.IsCompleted)
{
Thread.Sleep(100);
}
int sendbytes = udpClient.EndSend(result);
}
2.接收数据:
public IAsyncResult
BeginReceive(AsyncCallback requestCallback,Object state);
public byte[] EndReceive(IAsyncResult
asyncReslut,ref IPEndPoint,remoteEP);
例子:
private void ReceiveData()
{
UdpClient receiveClient = new UdpClient(port);
receiveClient.BeginReceive(new
AsyncCallback(ReceiveUdpClientCallback),receiveClient);
}
void ReceiveUdpClientCallback(IAsyncResult ar)
{
UdpClient u = (UdpClient)ar.AsyncState;
IPEndPoint remote = null;
Byte[] reveiveBytes = u.EndReceive(ar,ref remote);
string str =
Encoding.UTF-8.GetString(receiveBytes,0,receiveBytes.Length);
}
广播:指同时向子网中的多台发送消息,并且所有子网不会受到本地广播的影响。
组播:又叫多路广播,将消息从一台计算机发送到本网或全网内选择的计算机子集上,即发送到那些加入指定组播组的计算上。
组播组是分享一个组播地址的一组设备,又称多路广播组。组播地址范围在244.0.0.0到239.255.255.255的D类IP地址。
使用组播时,注意TTL(生存周期)值的设置。
UdpClient udpClient = new UdpClient();
udpClient.Ttl = 50;
1.加入多路广播组:
1.JoinMulticastGroup(IPAddress
multicastAddr);
//创建UdpClient的实例并设置使用的本地端口号
UdpClient udpClient = new UdpClient(8001);
udpClient.JoinMulticastGroup(IPAddress.Parse("224.100.0.1"));
2.JoinMulticastGroup(IPAddress
multicastAddr,int timeToLive);
UdpClient udpClient = new UdpClient(8001);
udpClient.JoinMulticastGroup(IPAddress.Parse("224.100.0.1"),50);
2.退出多路广播组:
udpClient.DropMulticastGroup(IPAddress.Parse("224.100.0.1"));