原文URL: http://www.cnblogs.com/dlwang2002/archive/2008/09/16/1291793.html

1:基于Socket连接;

2:在四个局域网内测试通过;

3:简单模型,需要进一步优化效率和处理;

========================= 备注:   经过修改和重构,抽象出来的P2PLib已经可以工作了,并且提取出一个Envelope对象,当作通讯协议和数据载体。   在这个Lib之上,很容易实现不同局域网之间的具体应用,比如现在已经建立了三个应用:   1:IM,跨局域网即时通讯(UI像MSN)   2:FT,文件传输,断点续传   3:DP,数据库代理(客户需要在任何地方访问它局域网内的数据库,这一个其实是作为某ORM的数据层出现的。)
========================== 基本思路

两个分别在不同的局域网内的用户无法直接建立连接并通讯。因为处在不同局域网的用户(没有公共IP)无法被外部机器主动连接,所以凡是所谓的P2P一般都是通过中间服务器中转通讯的。比如在几年前俺曾经介绍过一个P2P的软件,http://www.cnblogs.com/dlwang2002/archive/2005/04/14/207988.html,基本原理那里面有介绍。

这次所建立的模型,是双方都在不同的局域网内部,都没有公用IP。

基本原理是这样的。局域网A内用户PA想要和局域网B内的用户PB通讯,那么需要通过中间服务器S进行转接通讯。Socket链接虽然只是由一方发起(局域网内的),但是socket确实一个可以在两端都能通讯的,也就是说,PA链接S后,S实际上可以使用这个通道直接发消息给PA。同理,如果PB连接之后,S将有两个Socket实例,然后S可以把SA的消息直接转发给SB,这样SB就转载了SA的请求到了PB。虽然还是要通过中转,但是S只负责把两端Socket互联,速度延时可近似认为是0,也就是可以认为PA和PB是建立了直接的链接,P2P。

过程如下:

1:)PA向S发出连接请求;S接受请求,并且保留住PA的socket实例SA,存进一个在线用户列表LiveConnections中

2:)PB请求S并建立连接(和A无先后关系),S中保存其socket实例SB

3:)PA向s发出通讯请求,指明通讯对象是PB

4:)S接收到A的请求,再当前的LiveConnections中找到PB的socket示例SB,转发消息;

5:)PB接受到来自PA的消息。

主要程序代码

1:)首先的问题是如何建立Socket连接。这个问题在以前的一篇Blog中有提到(http://www.cnblogs.com/dlwang2002/archive/2008/07/21/924803.html)。这里使用的代码基本上都是和那一个一样的,只有中间处理通讯数据的部分稍有不同。这些代码不再赘述。

2:)服务器S处理转发消息的代码

                    #endregion

3:)客户端的简单实现

                                                                               }

4:)UI等其他处理 (略)

问题

1:)一个Socket的实例可以在服务器/客户端存活多久呢?我测试发现,至少几个小时没有问题,但是最长时间却不知道。

2:)服务器S用单独的线程来处理链接,并不是最好的方式

3:)服务器负载平衡,在多个服务器的情况下,要让客户端可以选择效率最高的服务器进行中转

4:)有一台机器已经在公网上,或者两台都在公网上,需要另外的模型。他们不需要中转。

小结

    简单,效率未知。

 
 
 
 

最新文章

  1. gen目录无法更新,或者gen目录下的R.JAVA文件无法生成
  2. android Activity基类通用方法
  3. [Unity2D]Box Collider 2D盒子碰撞器
  4. C# 位域[flags] 转
  5. Android PopupWindow 点击消失解决办法
  6. maven怎么引入自定义jar的详细图文教程
  7. 记录某公司(简称SMKJ) 的一次面试
  8. ViewPager实现滑屏切换页面及动画效果(仿优酷客户端)
  9. android 选项卡TabHost
  10. JAVA设计模式之简单粗暴学建造者模式
  11. 【安富莱专题教程第2期】uC/Probe简易使用说明,含MDK和IAR,支持F103,F407和F429开发板
  12. Zookeeper注册中心底层实现小记
  13. extjs_10_自己定义combotree组件
  14. C++ Crypto++ RSA加密资料收集
  15. 12.19daily_scrum
  16. Python——eventlet.greenpool
  17. redmine创建新闻,自动发邮件给项目组所有成员
  18. 发布QT exe
  19. Microsoft Dynamics CRM 如何修改域密码
  20. 实现多线程的另一种方式-Callable

热门文章

  1. 请问如何突破”所选文件超出了文件的最大值设定:25.00 Mb“限制
  2. VC++的窗口句柄和窗口ID
  3. 安装下载MySQL
  4. Laravel建站02--配置Laravel
  5. 李洪强iOS开发之带placeHolder的Textview
  6. Webview页面的控件元素定位
  7. 使用Entity Framework和WCF Ria Services开发SilverLight之6:查找指定字段
  8. mac 权限问题
  9. java关于数组之间的相互赋值
  10. Easyui datagrid 怎么添加操作按钮,rowStyler