日期:2014-05-17  浏览次数:20855 次

c# UDP学习笔记
UDP 只有在需要的时候客户端和服务端才会进行连接。
UDP 对主机进行单项数据操作,只需要使用UDPClient进行通讯操作。
主要方法:
REceive(ref IPEndPoint ep) ep:数据发送的主机,包括IP和端口。堵塞式接受数据。
Send(byte[] buf,int length,IPEndPoint ep) 。buf要发送的数据,length:发送数据的长度;ep发送到哪里

服务端接收代码:

UdpClient server = new UpdClient(port); //监听端口
IpEndPoint ipRemote;
try{
    byte[] buf = server.Receive(ref ipRemote); //堵塞在这里。将接收到的数据存放在buf,同时将客户端的Ip,端口信息保存在ipRemote变量中,这样就知道是谁发过来的数据了
    string message = Encoding.Default.GetString(buf); 将byte转为string类型
}catch(Exception ex){

}


可以通过while实现反复监听。通常结合多线程实现接收功能

Thread th = new Thread(new ThreadStart(GetData));
th.IsBackground = true;
th.Start();


this.Invoke(new 委托(functon),object[]{msg});


子线程需要使用委托更新主线程信息

客户端发送代码

UdpClient client = new UdpClient(clientPort); //本机端口,通过这个端口号发送数据
IPEnPoint server  = new IpEndPoint(IPAddress.Parse(serverHost,serverPort)); //制定服务器IP和端口
byte[] buf = Encoding.Default.GetByte(message); //将发送的消息转为字节数组
client.Send(buf,buf.length,server);


UpdClient关闭前,可以重复利用,多次发布、接收消息

public event DataArriveHandler onDataArrived; //定义事件
//需要声明一个同名、同参数的方法

private void onDataArrived(byte[] ,IpEndpoint ep){
   this.Invoke(....); //子线程更新主线程
}

调用
if(this.onDataArrived !=null){
   onDataArrived(buf,clientep);
}





服务端发送数据


public void Send(byte[] data,IPEndPoint endPont) { //data发送的数据;endPoint数据接收地址,也就是目的地址
  this.Server.Send(data,data.length,endpont); //server=new UdpClient(port); 服务端监听端口
}


同一个UdpClient实例,既可以接收,也可以发送

取得本机的IP地址
string hostname = Dns.GetHostName(); //取得当前主机名
IPAddress[] myIps = Dns.GetHostAddresses(hostname); //取得当前主机所有IP,多个网卡有多个地址
foreach(IPAddress ip in myIps){
   string ip = address.ToString();
   //还需要判断这个ip是否是需要的,比如只取得Ipv4的地址
}


双向通讯,两端都需要监听,代码是类似的。