欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c# UDP学习笔记

程序员文章站 2022-03-04 20:42:40
...
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的地址
}


双向通讯,两端都需要监听,代码是类似的。
相关标签: udp