做聊天软件,如何穿透内网通信?

bababian 2011-10-29 11:16:03
我在练习写个聊天的软件,就像QQ那样点对点聊天,要能在公网上使用。我想出的方案是这样:
有个收集用户IP地址的服务器,放在公网上。然后客户端要登陆,登陆的主要目的就是想这个服务器“报到”,服务器接收到登陆消息后,记录这个用户的在线状态和IP地址。然后另一个用户(例如是刚才那个用户的好友)也来登陆的时候,服务器检查这个新登陆用户的好友,一个个查看他的好友的登陆状态和IP,然后反馈给这个新登陆用户。同时把新登陆用户的ip也告知刚才的用户。这样两人的客户端都有了对方的ip,他们之间就可以点对点直接通信,不需再通过服务器了。

但有个关键的问题:如果用户是在某个内网里(例如公司的局域网里,像192.168.*.*和10.0.*.*这样的地址的),内网与外网如何通信?要知道,一个外网IP要通过TCP或者UDP发个消息给内网ip,是不行的。就是说,一个外网用户,另一个是内网用户,他们如何实现通信?QQ是做到了这点的,它是怎么做到的?
...全文
1138 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
lis2012 2014-04-23
  • 打赏
  • 举报
回复
顶一下,看看有没有好的办法,论坛里面好像有资源
zmh1034563982 2014-04-23
  • 打赏
  • 举报
回复
帖子似乎很久了,我现在正在学习中,楼主一定已经明白了吧,可否指点一下啊。。。谢谢了
morrist1987 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jackson35296 的回复:]

对于文本信息,QQ是不会做点对点的,都是服务器中转。
原因有以下几点:
1.文本数据量很小,对服务器的压力不大
2.好多客户端都在内网,内网之间不能通信
3.对于群聊消息,受2的影响,用点对点逻辑十分复杂
4.用点对点将使得政府无法监控聊天言论,而且不能使用程序自动过滤消息
5.QQ的网管可以看到任何人之间的聊天,以便为公安部门提供线索

对于传文件等数据,QQ是按如下进行的
……
[/Quote]

学习了。。。
yynetsdk 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 smwhotjay 的回复:]
p2p 我最近刚封装好. 内网对内网. 但还是要有个外网服务器
[/Quote]

放出来学习下。
fujialin2011 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 bababian 的回复:]
我在练习写个聊天的软件,就像QQ那样点对点聊天,要能在公网上使用。我想出的方案是这样:
有个收集用户IP地址的服务器,放在公网上。然后客户端要登陆,登陆的主要目的就是想这个服务器“报到”,服务器接收到登陆消息后,记录这个用户的在线状态和IP地址。然后另一个用户(例如是刚才那个用户的好友)也来登陆的时候,服务器检查这个新登陆用户的好友,一个个查看他的好友的登陆状态和IP,然后反馈给这个新登陆用户。……
[/Quote]
这里面涉及到几个问题,你的内网上网发送可能不一样,有些可以直接连接外网的地址,这种很好办直接connect就可以了,有些不行,比如通过代理服务器上网的,这样的话必须要先连接代理服务器,发消息去连接外网;这个是和外网通讯的屏障,后面就是要解决点对点通讯的问题了
qiuchangyong 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jackson35296 的回复:]
对于文本信息,QQ是不会做点对点的,都是服务器中转。
原因有以下几点:
1.文本数据量很小,对服务器的压力不大
2.好多客户端都在内网,内网之间不能通信
3.对于群聊消息,受2的影响,用点对点逻辑十分复杂
4.用点对点将使得政府无法监控聊天言论,而且不能使用程序自动过滤消息
5.QQ的网管可以看到任何人之间的聊天,以便为公安部门提供线索

对于传文件等数据,QQ是按如下进行的
A……
[/Quote]
好牛啊,知道这么多,虾哥在腾迅混过?
神农氏 2011-10-31
  • 打赏
  • 举报
回复
必须服务器中专,所有看似是客户端之间的通讯,其实都是通过服务器转的.因为服务器具有独立ip.
哈了 2011-10-30
  • 打赏
  • 举报
回复
这里有介绍http://wenku.baidu.com/view/02a7e388d0d233d4b14e6936.html,你自己去看下吧,我不懂。
bababian 2011-10-30
  • 打赏
  • 举报
回复
哦~谢谢!
yahoo34 2011-10-30
  • 打赏
  • 举报
回复
刚好在学
smwhotjay 2011-10-30
  • 打赏
  • 举报
回复
p2p 我最近刚封装好. 内网对内网. 但还是要有个外网服务器
jackson35296 2011-10-30
  • 打赏
  • 举报
回复
对于文本信息,QQ是不会做点对点的,都是服务器中转。
原因有以下几点:
1.文本数据量很小,对服务器的压力不大
2.好多客户端都在内网,内网之间不能通信
3.对于群聊消息,受2的影响,用点对点逻辑十分复杂
4.用点对点将使得政府无法监控聊天言论,而且不能使用程序自动过滤消息
5.QQ的网管可以看到任何人之间的聊天,以便为公安部门提供线索

对于传文件等数据,QQ是按如下进行的
A给B发文件的过程是这样的:
1.A在界面上操作,给用户B发一个文件
2.操作被传到QQ服务器上,服务器验证B的状态,并查出B的IP地址
3.服务器将B的IP地址,端口,状态等信息传给A
4.A根据服务器传回的信息,如果B状态为不在线等等,就在界面上告知A,并提示发送“离线文件”
5.A根据服务器的消息,如果B状态为在线,则直接连接B的IP地址,如果B为公网IP,则立刻连上,此时相当于P2P传输,如果A,B在局域网内,由于直接连接的IP,那速度就相当快。如果在公网上则取决于A的上行带宽和B的下行带宽,还有运营商之间的接口带宽。
6.如果A无法连接B,则A将无法连接的消息传给服务器,服务器给B消息,让B试图反向连接A
7.如果B连接A成功,则执行5的过程,也是P2P传输
8.如果A无法连接B,而且B无法连接A,则说明A,B都处于不同的内网内,都没有公网IP,无法直接连接。服务器则开始协调A和B进行打洞,详细过程见"P2P打洞和NAT穿越"
9.经过第8步,如果打洞成功(取决于A,B所处的网络环境和连接的路由等),则A和B仍然直接传送数据,也是P2P传输。
10.如果A,B打洞不成功,A和B无论如何也不能直连,也就是不能进行P2P传输,这时需要服务器中转数据。

总之,对于你的问题,如果是纯文本消息,并不采用点对点传输。对于内网通信和打洞的问题,你可以看如下文章
http://www.vckbase.com/document/viewdoc/?id=1773
czh604 2011-10-30
  • 打赏
  • 举报
回复
其实,你不是有个外网的服务器么?
客户登陆的时候都去连接这个服务器,服务器会记录他们的外网IP跟端口。
这样就不存在内网的问题。

假如是内网A登陆,在服务器上记录:A:外网IP跟端口。
内网B登陆,在服务上记录B:外网IP跟端口。
这样子A跟B的对外端口跟IP,服务器都知道了。A想知道B的信息,可以找服务器请求就可以了


18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧