这是通讯协议规定的。网络通讯中,IP地址+端口才能唯一标识一个真实的通讯地址。就像是现实中如果写信给一个人,发信人必须写清楚省市区和邮箱号,收件知人有同一个邮箱的钥匙才能收到信一样。
客户端不需要固定端口,客户端发送消息时应该由UdpClient自动选择可用的端口。
服务器不可能向NAT内部的客户端主动发起消息,必须等客户端发送消息,然后赶紧发送返回值。因为NAT路由器只会为Udp消息的这种回发规则维护一个较短时间,在这个较短时间上由外部发来的消息才能被路由器正确转发给内部。
扩展资料
UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是IP协议与上层协议的接口。UDP协议适用端口分别运行在同一台设备上的多个应用程序。
UDP提供了无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据,UDP传输的可靠性由应用层负责。常用的UDP端口号有:
应用协议 端口号
DNS 53
TFTP 69
SNMP 161
UDP在外网通信时,需要由内网客户端向外网(独立IP,不经过路由)的服务器发出消息,内网路由会打开一个洞,短时间允许外网目标ip和目标端口往回发消息,否则外网的消息发不到内网的电脑上,直接被路由扔了。所以
对于服务器来说,哪个端口接收的,就要用哪个端口发回来,还得尽快发,否则内网路由就把洞堵住了。外网再发消息,或者不是“原路返回”的消息,统统被丢掉。。。。所以伱收不到啦。
同样,路由会把返回的消息转发到客户端ip指定的端口上,如果端口不一样的话,伱的客户端也收不到。。。
DatagramSocket用于接收和发送UDP的Socket实例。该类有3个构造函数:DatagramSocket():通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的。程序会让操作系统分配一个可用的端口。DatagramSocket(int port):创建实例,并固定监听Port端口的报文。通常用于服务端。
这是通讯协议规定的。
网络通讯中,IP地址+端口才能唯一标识一个真实的通讯地址。
就像是现实中如果写信给一个人,发信人必须写清楚省市区和邮箱号,收件人有同一个邮箱的钥匙才能收到信一样。
IP地址指明了具体的计算机,就像是发信时指明了小区的楼号
而端口指明了具体的收信人,就像邮箱指明同一栋楼(同一计算机)里的具体哪个门牌号一样。
没这个说法,
只是,如果你不指定监听端口号的话,客户端怎么监听?服务器端又如何知道要返回给客户端哪个端口呢?
一般情况下,服务器端根据客户端的端口号返回的,比如客户端使用1024发送到服务器端的80端口,那么服务器端接收后返回到客户端哪个端口呢?所以还是返回1024最好。