服务端:
IPEndPoint ip= new IPEndPoint(IPAddress.Any,0);
UdpClient uc = new UdpClient(888);
while(true){
byte[] msgBuffer= uc.Receive(ref ip);
......监听到各种类型的消息
uc.Send(消息,消息长度,ip);//这里发送出去了 (外网)客户端却没监听到!!!!!!!
}
客户端:
UdpClient _client = new UdpClient();
IPEndPoint ip= new IPEndPoint(IPAddress.Any,0);
IPEndPoint _hostPoint = new IPEndPoint(IPAddress.Parse("*.*.*.*"), 888)//主机服务器ip及端口号(外网)
_client .Send(消息,消息长度,_hostPoint );//给服务·发送消息
while(true){
byte[] msgBuffer= _client .Receive(ref ip);
......监听到各种类型的消息
}
客户给服务法消息 服务你能够监听到!
但是服务端向客户发送消息时却始终无法监听到!
不知道哪里出了问题?????防火墙都关了
服务器和客户端不在同一个路由下边..
你给客户端的路由器设置一下DMZ主机,IP设置成你这台客户端的IP就行了.
可以用代码实现吗?项目是要给客户用的,不会要让客户自己手动设置吧?这样肯定不行呀
@WP921108: 可以用代码实现, 你去研究一下 "穿透" 这个技术.
你们将产品给客户使用时,写一个产品说明书,或者给客户培训一下不就行了?要不你们直接帮客户部署算了.
我猜测不是客户端的问题,应该是在服务端的路由器上设置DMZ主机,因为服务能收却不能发送(可以发送到内网的其他客户端,只是不能发送到外网的客户端)。等会回家配置一下 试试看。谢谢提醒!
@hexllo: 我就是在用UDP打洞 刚开始研究 呵呵
@WP921108: 不错哦小子.我都没有打过洞呢..哈哈
@hexllo: 我擦 还是不行
byte[] sumsg = ObjectSerializer.Serialize(su);//序列化消息
int tl = sumsg.Length;
int rl= uc.Send(sumsg, sumsg.Length,ip);
我通过比较tl 和rl的值 发现他们是相等的 也就是说成功地发送了消息,但是为何客户端一直监听不到呀???
@WP921108: 要不你先将服务器端和客户端放在一个路由内,先测试一下是程序的问题,还是网络的问题..
@hexllo: 在一个路由内完全没问题 。就是当客户端和服务器不在一个路由内时,客户端始终监听不到消息,好纳闷啊
@WP921108: 我们当时的场景是一台网外的服务器,对应多个地区的客户端,但是呢..每个地区只有一台客户端,所以就直接将客户端的IP作为DMZ主机了..
所以就没有用到穿透技术,你这个问题已经超出我的解决范围了,呵呵,你在网上找找QQ公司是怎么做的穿透,再看看你的穿透部分的逻辑是不是有问题?小的无能为力,只能给你提供一个思路了.
@hexllo: 谢谢了 好的 我在研究研究 ,之前本来是使用WCF双工通讯实现,后来发现wcf双工一般在内网使用,如果在外网,则要在客户端路由做端口映射所以改为UDP了.......哎╮(╯▽╰)╭
@WP921108: 加油,解决了别忘记告诉我一下哦,嘿嘿~~
@WP921108: 我也想知道是怎么解决的.