首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

vb 实现内网与公网聊天,该怎么解决

2013-10-29 
vb 实现内网与公网聊天如题。局域网内互聊的可以实现了。但不能像qq那样的,即通过路由器上网还是直连上网都

vb 实现内网与公网聊天
如题。局域网内互聊的可以实现了。
但不能像qq那样的,即通过路由器上网还是直连上网都能连通。
这两天搜了一下,有的说需要公网服务器什么的,有的说需要端口映射的。。。不懂啊。谁能给个详细的解说吗?能给源码更好啊。

ps:我有个小网站,有独立ip什么的。
[解决办法]
同求,好东西哦,忽悠小女孩很好的工具
[解决办法]
有网站有独立ip,暂时可先通过你服务器转发,服务器是服务端,其他都是客户端。

客户端<----->服务器<---->客户端
[解决办法]
VPN,从外网渗透到内网。
[解决办法]
服务端不用修改了,要处理的就是客户端和路由器那边。
客户端需要知道服务端那边的公网ip,建议做成域名解析,这样客户端不需要经常变动了。
路由器那边需要将你的端口映射出去,一般路由器在虚拟主机那边添加你开放的端口号,自己摸索摸索就找到了。
[解决办法]
这就是所谓的P2P技术,如果你了解Sock API的话,应该很好实现该技术,
在网络上有很多 C 实现该技术的范例,在 Linux 论坛里这种已经被看为老掉牙的
技术了,UDP、TCP的P2P代码满天飞,其实原理也很简单,用VB其实也可以实现,
不过很少看见有VB这方面的代码亮相。

我也写过这类程序,不过也是用VC,如果要用VB来写,感觉效率可能不行,因为
虽然VB可以开多线程来处理过程,但要调到稳定还真是个费事的事情,还不如用VC
来写还快一点。因为通常在VB中用Sock API来做网络通讯,都是用异步的方式处理
过程,而这个“异步”,就是通过窗口消息来得到要处理的事件。这样一来,侦听
和连接的东西多了,窗口也会创建得多了,感觉很怪,但用堵塞方式,如果不上线程,
整个程序都动不了,更别说用了。

其实原理很简单,首先需要在公网上有一台服务器,作用是提供用户信息和“打洞”
用的。大致的服务器技术可以这样实现。
公网服务器先创建一个 IP 协议的套接字,注意,是IP协议,不是TCP/IP或UDP/IP
如:
LocalSocketHandle = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);

然后设置好基本的参数绑定套接字就可以开启线程狂读数据了,如:
while(ServerObj->IsServer==TRUE){
   Sleep(1);
   rd = recvfrom(LocalHandle, (char *)&recvbuf, sizeof(stMessage), 0, (sockaddr *)&sender, &dwSender);
   if(rd<=0){
      // 错误
   }else{
      // 读到数据分析数据包和远程主机信息
      //.......
   }
}

运行过程是这样。
服务器程序先启动,服务器程序在这称为 S
然后启动客户端程序,客户端程序在这称为 C,若有多台客户端以 C1,C2,C3...Cn 作为区别
C1 向服务器提交登录数据包(数据包格式可自己定义,
          如:
          0xB2     数据包头,固定为0xB2
          0x00000000     用户ID,登录时为0
          0x01     命令  1表示登录请求
                          2表示索取好友列表
                          3取得好友IP地址和端口
                          4打洞请求
          0x00     参数长度
          0x00,0x00...     参数(根据参数长度来定)
          0x000000    校验码,可以用CRC/CRC16/CRC32/异或 等校验方式校验数据的完整性
          0xB3     包尾,固定为0xB3
          )
S 向 C1 返回登录成功结果数据包
C1 向 S 发送索取好友列表请求
S 判断用户已登陆后返回整个C1的好友列表给 C1
C1 选择一个好友(称C2)弹出进行聊天,这时 CI 发送取得好友IP地址和端口命令给 S
S 判断用户已登陆后返回C2记录在 S 上的最后一次 IP 记录给 C1
C1 收到 S 发送过来的IP和端口后直接通过sendto发送给 C2
C1 发送完成后等待 C2 的收到数据回应
若C1判断回应超时,则发送一个打洞命令给 S
然后C1 不断发送测试命令给 C2
S 收到 C1 的打洞命令后,向 C2 发送包含 C1 的IP地址和端口信息的联通数据包
C2 收到 S 的联通数据包请求后,C2 向 C1 发送测试请求
这时因为 C1 不断重复的向 C2 一直在发送测试请求,只要 C2 同时也向 C1 发出信息,
这样打洞过程就成功了。
然后C1当收到C2的测试请求数据后,发送要发送的内容给 C2,
C2就可以读到C1发过来的内容了

以上是整个P2P基于IP包的形式的通讯过程。
在VB里用控件我没实验过,不过VC中直接用Sock API测试成功,我两边的C端都是在内网
通过路由上网的,运作很正常
[解决办法]
SupermanKing大哥的知识很强大,佩服一下下。
看楼主的样子好像是要在企业即将使用的软件中添加一个聊天功能,当然有可能是异地有分公司的企业吧。
我有一个小小的想法,没有时间认证的,哪位大哥证明一下?
我个人感觉局域网和公网好像是一样的运行结构吧,如果A、B两台异地电脑相互通信,A、B两台都有公网IP,那么这两台电脑之间不是就好像局域网的两台电脑通讯了吗?这样A、B能不能直接通讯呢?


[解决办法]
端口映射+域名解析  //前提是你能接触到路由器,进行设置
QQ之类的不需要设置也能聊天,估计是用公共服务器中转再建立连接的方式吧
//这个真没做过
[解决办法]
公网服务器

热点排行