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发送到哪里
服务端接收代码:
可以通过while实现反复监听。通常结合多线程实现接收功能
子线程需要使用委托更新主线程信息
客户端发送代码
UpdClient关闭前,可以重复利用,多次发布、接收消息
服务端发送数据
同一个UdpClient实例,既可以接收,也可以发送
取得本机的IP地址
双向通讯,两端都需要监听,代码是类似的。
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网络协议的一些应用
下一篇: nodejs 入口app.js 分解