我在做一个udp的聊天程序,我能做到客户端与服务端的收发消息,但是怎么实现客户端对客户端的收发?
我想过用服务端来进行转发,但是这工程量也太大了吧,求高手指点
服务器端就用来处理客户端登陆,客户端要同时实现服务端功能用于客户端之间的通信,通信的端口和ip在登陆到公共服务器时上传。客户端登陆后,从公共服务器拿到好友的ip和端口后,直接和好友通信。
这种实现的问题是如果客户端在内网通过路由器上网的,那么可能会直接连接不上,需要路由器上配置端口映射将内部通信端口暴露出来。
服务器将客户端的IP和端口号传递给对方,然后客户端根据IP和端口号,直接向客户端发送消息,服务器就是在建立连接,转发客户端的信息后就不管了,后面的消息,客户端就自己直接和客户端建立通信(UDP不用连接的方式。。。)
每个 客户端 连接到 服务端的时候 都会留下 ip 地址信息 当有新的客户端连接到 服务端的时候 就会拉取之前 连接到 服务端的客户端 ip 列表
有了ip 地址列表 就可以 通过 udp 直接给 其他客户端发送信息 而不用通过服务端 中转
你的这个需求涉及到内网穿透,可以参考一下C#实现P2P之UDP穿透NAT原理讲解
也可以看看类QQ(P2P)聊天系统的原理与C#实现这个是否有帮助。
udp是无连接协议,受NAT地址转换影响较大,建议采用TCP和UDP双协议实现,这样会好些。