日期:2014-05-17  浏览次数:21159 次

关于c#编写的聊天软件,服务端在具有公网ip一端,客户端在不同的内网,那么不同的客户端之间如何进行通讯?
  最近在做一个类似于qq的通讯软件。最基本的需要就是和qq一样,可以发聊天信息,图片,文件。如果这些都是局域网通讯软件的话,应该不是很难。可是偏偏要不同的客户端在不同的内网之间可以进行通讯,我使用的是udp协议,因为好多人告诉我需要用到udp穿透,不同内网间通信。网上例子很多,可以用的不多,还有好多都是其他语言编写,想求一份c#的demo,有做过相关程序的大神望帮忙!

------解决方案--------------------
我可以告诉你:你不应该使用udp。

网上所谓的udp穿透的文章,有95%以上都是某些人抄别人的文章、而自己甚至都没有实际实际用在产品的任何经验就开始写博客了。

qq也不过是在个别功能上使用udp,特别是根本不需要“打洞”的地方才用。例如在登录时,既使用udp、也使用tcp和http,根本不是仅仅用udp。而任何稍微重要的功能,例如传送文件,则根本就是tcp的,绝不是udp的。

使用tcp,那么任何“内网”客户端都可以跟服务器进行双向通讯。因此如果服务器要向客户端发送消息,瞬间即到了。两个客户端可以首先尝试直接通讯,如果不通则可以通过服务器中转,这全都使用tcp就足够了。
------解决方案--------------------
说什么“QQ在内网是udp打洞的”这是一些人幻想出来的,没有真凭实据。

我能看到的证实仅顶多是,QQ使用udp访问服务器,然后通过服务器转发给另一个客户端。

而当QQ在内网中尝试做一些优化,意思是尝试直连另一个客户端(客户端内部也有简单的服务程序),这跟什么udp没有必然的联系,而且也根本不是打洞。
------解决方案--------------------
不做路由配置的情况下,目前IPv6没有完全普及,还是老老实实打洞穿透吧。
不同的客户端在同一个nat后, 这种情况不需打洞。
对于多层nat, 这种情况不需分开处理。