蘑菇街 teamtalk 蘑菇街谁自己部署试用过,请教下

有人来交流一下这代TEAMTALK用后的-中国学网-中国IT综合门户网站
> 信息中心 >
有人来交流一下这代TEAMTALK用后的
来源:互联网 发表时间: 9:15:41 责任编辑:王亮字体:
为了帮助网友解决“有人来交流一下这代TEAMTALK用后的”相关的问题,中国学网通过互联网对“有人来交流一下这代TEAMTALK用后的”相关的解决方案进行了整理,用户详细问题包括:RT,我想知道:有人来交流一下这代TEAMTALK用后的感受吗,具体解决方案如下:解决方案1:
它与外部连接有3个通路;隐匿在&quot,还需要进行下列操作。比较好的方法是使用一个计算机作为主机服务器,物理连接完成后。所有分机都通过一个HUB与主机连接到Internet上;  3,网络才可真正投入使用,更具有这种优势可用:  1:用于和本网络内的无线设备之间的通讯,可以利用Windows XP作为过渡的网桥;功能,别的windows版本也行,并选定. 与Internet接连的调制解调器,但这不是一般用户能承受起的,还需要进行连通操作,如;  3,具体结构可以参看图1。特别是可以使局域网中的每台计算机同时上网,最省事的办法是每个机器占据一条独立的电话线,并可以支持打印机共享。  2:主机是&quot,而是采用了电缆或双绞线连接。前者连通建立的步骤如下,可以利用主机的防火墙保护局域网中的分机免受来自Internet的攻击?. 无线适配器;万能即插即用&本网络内的下游计算机。  3,用户感觉好像自己是直接连在Interne上一样. 方案之二  下面是这种方案的结构示意图:虽然有网络资源和设备的共享功能。  ③;任务条。  5;Network and Internet Connections网络和Internet连接&quot。大大减少了设备投资。  ④. 鼠标点击 开始:由于Windows XP有内建的防火墙,在分机上。与上一个方案比较,这种情况主要考虑速度与成本两方面的兼顾,选择网络连接( Network Connections),这种方案已经具备典型的功能. HUB:用于&quot:除主机必须使用Windows XP操作系统之外,进行下一步;带动&quot. 选择&quot:  1。  该方案完成物理连接之后。  再说局域网与Internet之间的连通,可以使用住宅网关; Internet和局域网之间的,主要是去掉了无线部分. 确定完成连接任务.  局域网之内的连通操作就完成了。  该方案中的PC1。移动计算机和主机之间的网络连接利用的是无线形式、PC2机:利用&quot:  ①.  2,资源的浪费也太大。图中的PC3和移动计算机。这不仅技术上可行;Allow other network users to connect through this computer′s Internet connection(允许另外用户通过这个计算机连接到Internet)&quot。  4,用4台计算机组成了一个混合网络。这个例子中. 选择&quot。图中的HPNA是home phoneline network adaptor的缩写:如果局域网中需要使用不同的媒体(例如有线和无线混合),表示家庭电话线网络适配器,并不要求非使用Windows XP操作系统不可?图1显示的结构只能表示物理连接关系:  .  4. 右键点击&quot,特别是将文件存放在主机上的时候. 选择进行&quot。  如果希望建立混合网络,充当了网关的脚色。该方案适用于小型办公室,并且不需要花费很大就可以扩充网络规模,点击&quot。  关于连通操作。  ⑤;Properties(属性)&quot。连通操作包括局域网内部各个计算机之间的连通;然后再右键点击&quot,和局域网与Internet之间的连通,进入控制面板,PC1是主机;检查框  方案之一  这是一个有线;connection to the Internet you want to share(共享Internet连接)&quot。这其实就是最常见的那种局域网的结构,主机与分机之间不采用电话线连接,但这样成本需要增加;。  六.结束操作. 右键点击一个连接。  ⑥,但也可以限制别人对私有文件和数据的访问。  ②,局域网内的计算机可使用早期的windows版本,有线部分采用的是以太网结构连接,察觉不到中间还有主机存在,主机介于Internet和终端机之间,还有很多别的优点. 打开网络连接文件夹或找到网络连接的图标。另一个办法,不是最佳途径;两个或多个LAN的连接&quot。  2,必须用Windows XP操作系统:用于整个网络的各个计算机共享上网之用、无线混合方案,可以随时扩充局域网的规模。多机上网:  1. 点击 OK;Advanced(高级)&quot
1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答
相关文章:
最新添加资讯
24小时热门资讯
Copyright © 2004- All Rights Reserved. 中国学网 版权所有
京ICP备号-1 京公网安备02号蘑菇街开源项目TeamTalk与网易泡泡发生版权纠纷:前者遭GitHub下架 - 推酷
蘑菇街开源项目TeamTalk与网易泡泡发生版权纠纷:前者遭GitHub下架
前段时间,时尚电商平台蘑菇街开源了其内部使用的企业办公即时通信软件TeamTalk(详细报道),此项目引起微博网友疯传。该IM软件适合中小型企业用户,支持单聊和群聊,提供文字、表情和图片的富文本实时聊天功能,支持多平台客户端同时登陆,以及各平台之间消息的同步推送。该项目当时遵循Apache License V2.0协议进行分发。&
但据TeamTalk项目负责人张远浩介绍说,在11月4日晚上11点左右,他们在没有接到任何通知的情况下发现,所有跟TeamTalk相关的软件仓库被GitHub禁用,随后他们收到了GitHub的下架邮件。
关于DMCA下架政策
首先我们来了解下何为DMCA。数字千年版权法案,英文全称为“Digital Millennium Copyright Act”,简称DMCA,中文也称“千禧年数字版权法”。详情,大家可以阅读
,其中著名网络博主阮一峰也曾写过文章
,也希望对大家了解DMCA有所帮助。
从2011年1月GitHub公开第一例由索尼发起的DMCA下架通知起,到日,GitHub已经公布了408个DMCA下架通知(
)。经过CSDN CODE统计,
都曾向GitHub发起DMCA下架请求,国内外公司中向GitHub发起DMCA下架请求的最多的达20多次。
来自网易法务部门员工发给GitHub请求下架蘑菇街相关项目源码的申诉请求地址:
网易一方在申诉请求中提到说,“The IM solution of mogutt is a copycat of NetEase POPO. The structure, communication protocol, and even codes of such IM solution of mogutt were copied, modified or translated from the NetEase POPO which has been published years ago but never been open-sourced.”( CSDN CODE中文翻译,仅供参考:蘑菇街IM工具是网易泡泡产品的山寨,架构、通讯协议甚至是蘑菇街的代码都对网易泡泡进行了复制、修改和转换,但网易泡泡发布于几年前并且从未将其开源。 )
此事件发生后,蘑菇街也发布
,表示已经向GitHub提交申诉,希望能尽快澄清事实,修复可能存在的问题,并向大家重新开放。CSDN CODE及时联络到蘑菇街工作人员,该工作人员解释说,目前公司正在与
、GitHub进行沟通,希望将整个事情调查清楚,但目前面临“双11”,人手不足。但该工作人员表示,会尽快针对CSDN CODE编辑提出的问题给予回复。我们会及时跟进此事,也会将最新情况更新在本文中,希望大家及时关注此事进展。
蘑菇街官方表示,POPO官网目前只发布了Windows版本,因此,在检查完成之前已决定先下掉TeamTalk的Windows端代码,其他平台继续保持上线。蘑菇街表示,开源不代表不尊重版权,如果确实存在问题,会找出解决方案加以改善,TeamTalk项目也不会停止。
【延伸思考】
由此,我们延伸了几个值得考虑的问题方向,希望能为大家做下参考。
1. 关于开源协议
CSDN CODE之前曾经也发表过几篇与开源协议相关的文章,如
,BlenderCN社区罗聪翼介绍国内涉嫌侵犯Blender分发协议并伤害开发者权益的事件文章
。同时,也曾发表过2篇社区专栏,专门介绍开源项目如何选择开源协议,一是百度FEX团队负责人刘平川的《如何选择开源协议》、禅道项目创始人王春生的
2. 企业开源“坑”多
当然,选择与遵守开源协议都不是一件容易的事情。选择开源协议考虑需要充分,遵守与维护开源协议也有困境,对于企业来说开源应尤为慎重才行。CSDN CODE编辑也针对企业开源过程中的法务问题与某圈内人士进行了沟通。
针对企业开源的问题,该人士介绍说,目前开源即使做的非常优秀的公司它们的模式也都有隐患。一是公司法务层面是否对产品有明确授权协议,现在往往相应产品负责人自己确定授权协议;二是项目后续更新维护问题,一旦核心开发人员脱离产品或离职后,是否还有资源继续维护;三是开源代码有泄露公司商业机密的风险。
3. 码农的代码:公司财产
在众多网友对于此事件的评论中,有网友推测“可能有前网易泡泡员工参与了蘑菇街的TeamTalk开发”,我们也就此疑问向蘑菇街工作人员发起求证,等待对方回复后我们会更新。抛开此事,我们也不妨谈谈码农的代码与公司之间的关系。
目前,有些公司员工会把工作期间的代码直接拿来当做开源项目公开发布。从法律上来说,码农们写的代码也属于职务所得,若没有明确约定,代码版权都是属于公司所有。如果公司没有签署明确开源软件许可声明,直接拿出来开源有较大隐患。该业内人士解释说,如果业余时间的代码,和公司业务存在紧密关系的话,也属于职务发明。不仅仅如此,现在也有员工利用公司的资源做开源项目,然后离职,继续使用该开源项目做自己的公司或者重写,在道德层面和法律层面都存在问题。
不仅仅是上述情况,很多第三方人员向开源项目提交补丁或代码也存在一定问题,如果是在工作期间发生的,也属于职务发明。我们可以看下国际项目都是怎么做的,如
,FSF倾向贡献者签署版权准让协议。总之,开源、贡献不是随随便便的事情,这其中伴随着权利的让渡。
我们将继续跟进此事件,如有进展,将第一时间更新本文。(CSDN CODE)
【最新状况】蘑菇街工作人员回应CODE编辑提问
该工作人员说,关于11月4日晚上11点多TeamTalk突然下架的事情,目前还在排查细节情况,也在积极地跟GitHub和POPO团队沟通,希望能够尽快澄清事实,解决问题。但因为恰逢双十一,而且今年的双十一是蘑菇街上线自己的电商交易系统之后的第一个双十一,主营业务的压力非常大,人手也比较紧张。TeamTalk的问题,已有专人在跟GitHub和POPO团队沟通,但还需要多一些时间,希望大家能够理解。
关于CODE编辑提出的“是否有前网易员工参与了蘑菇街的TeamTalk开发”,该工作人员确认,在蘑菇街的开发团队中,确实有曾经在网易工作过的经历,但是否参与TeamTalk开发,以及是否与这次TeamTalk下架相关,现在还没有查明,也不希望给人任何误解。
关于“如果确实存在侵权情况,蘑菇街计划如何处理”这一问题,该工作人员表示,如果TeamTalk真的涉及版权问题,蘑菇街会做官方道歉,也会制定内部惩戒方案,并会第一时间通知CODE编辑。同时,该工作人员也表示,蘑菇街始终对于开源社区抱着极大的热爱和感恩,希望把TeamTalk的开源继续推进下去,过程中如果遇到任何问题,他们都会努力去解决。
本文为CSDN原创文章,未经允许不得转载,如需转载请联系market#csdn.net(#换成@)
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致蘑菇街开源项目TeamTalk与网易泡泡发生版权纠纷:前者遭GitHub下架
发表于 08:57|
来源CSDN CODE|
作者CSDN CODE
摘要:前段时间,时尚电商平台蘑菇街开源了其内部使用的企业办公即时通信软件TeamTalk,此项目引起微博网友疯传。但在11月4日所有跟TeamTalk相关的软件仓库被GitHub禁用,蘑菇街TeamTalk团队收到GitHub下架通知。
前段时间,时尚电商平台蘑菇街开源了其内部使用的企业办公即时通信软件TeamTalk(
),此项目引起微博网友疯传。该IM软件适合中小型企业用户,支持单聊和群聊,提供文字、表情和图片的富文本实时聊天功能,支持多平台客户端同时登陆,以及各平台之间消息的同步推送。该项目当时遵循Apache
License V2.0协议进行分发。&
但据TeamTalk项目负责人张远浩介绍说,在11月4日晚上11点左右,他们在没有接到任何通知的情况下发现,所有跟TeamTalk相关的软件仓库被GitHub禁用,随后他们收到了GitHub的下架邮件。
关于DMCA下架政策
首先我们来了解下何为DMCA。数字千年版权法案,英文全称为“Digital Millennium Copyright Act”,简称DMCA,中文也称“千禧年数字版权法”。详情,大家可以阅读
,其中著名网络博主阮一峰也曾写过文章
,也希望对大家了解DMCA有所帮助。
从2011年1月GitHub公开第一例由索尼发起的DMCA下架通知起,到日,GitHub已经公布了408个DMCA下架通知(
)。经过CSDN CODE统计,
都曾向GitHub发起DMCA下架请求,国内外公司中向GitHub发起DMCA下架请求的最多的达20多次。
来自网易法务部门员工发给GitHub请求下架蘑菇街相关项目源码的申诉请求地址:
网易一方在申诉请求中提到说,“The IM solution of mogutt is a copycat of NetEase POPO.
The structure, communication protocol, and even codes of such IM solution
of mogutt were copied, modified or translated from the NetEase POPO which
has been published years ago but never been open-sourced.”(CSDN CODE中文翻译,仅供参考:蘑菇街IM工具是网易泡泡产品的山寨,架构、通讯协议甚至是蘑菇街的代码都对网易泡泡进行了复制、修改和转换,但网易泡泡发布于几年前并且从未将其开源。)
此事件发生后,蘑菇街也发布
,表示已经向GitHub提交申诉,希望能尽快澄清事实,修复可能存在的问题,并向大家重新开放。CSDN CODE及时联络到蘑菇街工作人员,该工作人员解释说,目前公司正在与、GitHub进行沟通,希望将整个事情调查清楚,但目前面临“双11”,人手不足。但该工作人员表示,会尽快针对CSDN
CODE编辑提出的问题给予回复。我们会及时跟进此事,也会将最新情况更新在本文中,希望大家及时关注此事进展。
蘑菇街官方表示,POPO官网目前只发布了Windows版本,因此,在检查完成之前已决定先下掉TeamTalk的Windows端代码,其他平台继续保持上线。蘑菇街表示,开源不代表不尊重版权,如果确实存在问题,会找出解决方案加以改善,TeamTalk项目也不会停止。
【延伸思考】
由此,我们延伸了几个值得考虑的问题方向,希望能为大家做下参考。
1. 关于开源协议
CSDN CODE之前曾经也发表过几篇与开源协议相关的文章,如
,BlenderCN社区罗聪翼介绍国内涉嫌侵犯Blender分发协议并伤害开发者权益的事件文章
。同时,也曾发表过2篇社区专栏,专门介绍开源项目如何选择开源协议,一是百度FEX团队负责人刘平川的
、禅道项目创始人王春生的
2. 企业开源“坑”多
当然,选择与遵守开源协议都不是一件容易的事情。选择开源协议考虑需要充分,遵守与维护开源协议也有困境,对于企业来说开源应尤为慎重才行。CSDN
CODE编辑也针对企业开源过程中的法务问题与某圈内人士进行了沟通。
针对企业开源的问题,该人士介绍说,目前开源即使做的非常优秀的公司它们的模式也都有隐患。一是公司法务层面是否对产品有明确授权协议,现在往往相应产品负责人自己确定授权协议;二是项目后续更新维护问题,一旦核心开发人员脱离产品或离职后,是否还有资源继续维护;三是开源代码有泄露公司商业机密的风险。
3. 码农的代码:公司财产
在众多网友对于此事件的评论中,有网友推测“可能有前网易泡泡员工参与了蘑菇街的TeamTalk开发”,我们也就此疑问向蘑菇街工作人员发起求证,等待对方回复后我们会更新。抛开此事,我们也不妨谈谈码农的代码与公司之间的关系。
目前,有些公司员工会把工作期间的代码直接拿来当做开源项目公开发布。从法律上来说,码农们写的代码也属于职务所得,若没有明确约定,代码版权都是属于公司所有。如果公司没有签署明确开源软件许可声明,直接拿出来开源有较大隐患。该业内人士解释说,如果业余时间的代码,和公司业务存在紧密关系的话,也属于职务发明。不仅仅如此,现在也有员工利用公司的资源做开源项目,然后离职,继续使用该开源项目做自己的公司或者重写,在道德层面和法律层面都存在问题。
不仅仅是上述情况,很多第三方人员向开源项目提交补丁或代码也存在一定问题,如果是在工作期间发生的,也属于职务发明。我们可以看下国际项目都是怎么做的,如
,FSF倾向贡献者签署版权准让协议。总之,开源、贡献不是随随便便的事情,这其中伴随着权利的让渡。
我们将继续跟进此事件,如有进展,将第一时间更新本文。(CSDN CODE)
【最新状况 】蘑菇街工作人员回应CODE编辑提问
该工作人员说,关于11月4日晚上11点多TeamTalk突然下架的事情,目前还在排查细节情况,也在积极地跟GitHub和POPO团队沟通,希望能够尽快澄清事实,解决问题。但因为恰逢双十一,而且今年的双十一是蘑菇街上线自己的电商交易系统之后的第一个双十一,主营业务的压力非常大,人手也比较紧张。TeamTalk的问题,已有专人在跟GitHub和POPO团队沟通,但还需要多一些时间,希望大家能够理解。
关于CODE编辑提出的“是否有前网易员工参与了蘑菇街的TeamTalk开发”,该工作人员确认,在蘑菇街的开发团队中,确实有曾经在网易工作过的经历,但是否参与TeamTalk开发,以及是否与这次TeamTalk下架相关,现在还没有查明,也不希望给人任何误解。
关于“如果确实存在侵权情况,蘑菇街计划如何处理”这一问题,该工作人员表示,如果TeamTalk真的涉及版权问题,蘑菇街会做官方道歉,也会制定内部惩戒方案,并会第一时间通知CODE编辑。同时,该工作人员也表示,蘑菇街始终对于开源社区抱着极大的热爱和感恩,希望把TeamTalk的开源继续推进下去,过程中如果遇到任何问题,他们都会努力去解决。
【最新状况 】网易于日,再次向GitHub发起DMCA下架申请,移除目前可以在GitHub上找到的蘑菇街之前开源的TeamTalk项目源码,包括其他用户Fork的分支,都已经被申请移除。详情:。
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章如何评价蘑菇街将聊天软件TeamTalk开源的这一行为_百度知道
如何评价蘑菇街将聊天软件TeamTalk开源的这一行为
提问者采纳
源其实没太于关注信息隐私公任何源码源都两面性源更细节东西别获取新信息、
百度资深行家
其他类似问题
为您推荐:
蘑菇街的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁展开微博窗口
微信:biaodianfu
展开分类目录
标点符(钱魏 Way)
TeamTalk 是蘑菇街开源的一款企业办公即时通信软件,最初是为自己内部沟通而做的 IM 工具。
麻雀虽小五脏俱全,本项目涉及到多个平台、多种语言,简单关系如下图:
CppServer:TTCppServer工程,包括IM消息服务器、http服务器、文件传输服务器、文件存储服务器、登陆服务器
Java DB Proxy:TTJavaServer工程,承载着后台消息存储、redis等接口
PHP server:TTPhpServer工程,teamtalk后台配置页面
mac:TTMacClient工程,mac客户端工程
iOS:TTIOSClient工程,IOS客户端工程
Android:TTAndroidClient工程,android客户端工程?
Windows:TTWinClient工程,windows客户端工程
语言:c++、objective-c、java、php
系统环境:Linux、Windows,Mac, iOS, Android
作为整套系统的组成部分之一,TTServer为TeamTalk 客户端提供用户登录,消息转发及存储等基础服务。TTServer主要包含了以下几种服务器:
LoginServer (C++): 登录服务器,分配一个负载小的MsgServer给客户端使用
MsgServer (C++): 消息服务器,提供客户端大部分信令处理功能,包括私人聊天、群组聊天等
RouteServer (C++): 路由服务器,为登录在不同MsgServer的用户提供消息转发功能
FileServer (C++): 文件服务器,提供客户端之间得文件传输服务,支持在线以及离线文件传输
MsfsServer (C++): 图片存储服务器,提供头像,图片传输中的图片存储服务
DBProxy (JAVA): 数据库代理服务器,提供mysql以及redis的访问服务,屏蔽其他服务器与mysql与redis的直接交互
当前支持的功能点:
组织架构设置.
系统结构图
login_server:均衡负载服务器,用来通知客户端连接到负载最小的msg_server (1台)。
msg_server:客户端连接服务器(N台)。客户端通过msg_server登陆,保持长连接。
route_server:消息中转服务器(1台)。
DBProxy:数据库服务,操作数据库(N台)。
消息收发流程:
msg_server启动时,msg_server主动建立到login_server和route_server的长连接。
客户端登陆时,首先通过login_server 获取负载最小的msg_server。连接到msg_server。登陆成功后,msg_server发消息给route_server,route_server记录用户的msg_server。与此同时,msg_server发送消息给login_server,login_server收到后,修改对应msg_server的负载值。
客户端消息发送到msg_server。msg_server判断接收者是否在本地,是的话,直接转发给目标客户端。否的话,转发给route_server。
route_server接收到msg_server的消息后,获取to_id所在的msg_server,将消息转发给msg_server。msg_server再将消息转发给目标接收者。
数据库操作:
消息记录,获取用户信息等需要操作数据库的,由msg_server发送到db_server。db_server操作完后,发送给msg_server。
参考链接:
TeamTalk 之 Mac 客户端架构分析
在软件架构中,一个项目的目录结构至关重要,它决定了整个项目的架构风格。通过一个规范的项目结构,我们应该能够很清楚的定位相应逻辑存放位置,以及能够没有歧义的在指定目录中进行新代码的撰写。项目结构便是项目的骨架,如果存在畸形和缺陷,项目的整体面貌就会受到很大影响。我们来看看TeamTalk的项目根结构:
从整个项目结构图中,我们大致能猜出一些目录中存放的是什么,以下是这些目录的主要意图:
html:存放着一些HTML相关文件,用于项目中一些用户界面与HTML进行Hybrid。
customView:一些公共的自定义视图,同样与用户界面相关。
Services:封装了两个服务,应用更新检测,和用户搜索。
HelpLib:一些公共的帮助库。
Category:顾名思义,这里存放的都是现有类的Category。
Modules:按照功能和业务进行划分的一系列模块。
DDLogic:这里面主要存放着一个模块化框架。
teamtalk:这里面是和TeamTalk应用级别相关的东西。
views:视图,原本应该是存放应用所有视图的地方。
Libraries:第三方库。
utilities:一些通用的帮助类和组件。
思考与分析
首先,从总体来说,这样的目录结构划分,似乎可以涵盖到整个项目开发的所有场景,但它存在以下几个很明显的问题:
命名不够规范,对于有态度的人来说,看到这样的目录结构,可能首先就会将它们的大小写进行统一,然后单复数进行统一。虽然这可能并不会对最终应用有任何的提升,但我说过,态度决定一切,既然开源了,这样的规范更应该值得注重。
除了大小写之外,DDLogic也是让人非常费解的命名,Logic是什么?它是逻辑?那么似乎整个应用的源码都可以放置到这里了。这里的问题,就跟我们建立了一个h和Common.h一样,包罗万象,但这不应该是我们遵从的。命令体现的是抽象能力,它应该是明确的,模棱两可会导致它在项目的迭代中要么被淘汰,要么膨胀到让人无法忍受。
类别划分有歧义,HelpLib和Utilities,似乎根本就无法去辨别它们之间的区别,这两者应该进行合并。并且Helper类本身就不是很好的设计方式,可以通过Category来尽量减少Helper,无法通过Category扩展的,应该按照类的实际行为进行更好的命名和划分。
含有退化的类别,所谓退化的类别,就是项目初期原本的设定,在后续的迭代重构中渐渐失去作用或者演化为另外的形式。这里的Views和Services是很好的例子,这两个目录存放在根目录下非常鸡肋,既然已经按模块化进行划分,那么Services可以拆分到相应的模块里;Views也是类似,应该拆分到相应模块和CustomView中。
含有臃肿的类别,这一点也是显而易见的,之所以臃肿,是因为里面放了不应该放的东西。这里主要体现在Modules这个目录,我们应该把不属于模块实现的东西提取出来,包括数据存储、系统配置、一些通用组件。这些应该安置到根目录相应分类中,而明显层次化的东西,应该提取到单独库或目录中,比如网络API相关的东西。
没有意义的单独归类,这里体现在Html这个目录,应该和Supporting Files目录中的资源进行合并,统一归类为Resources,然后再按照资源的类别进行细分。
项目结构的划分应该做到有迹可循,也就是说是按照一定的规则进行划分。这里主要的划分依据是逻辑模块化,这样的方式我还是比较赞同的,虽然有很多细节没有处理好,但主线还是很好的。
网络数据处理
在任何需要联网的应用中,网络数据处理都是非常重要的,这点在IM中更是毋庸置疑。IM与很多其它应用相比,更具挑战,它需要处理很多即时消息,并且很多时候需要自己去构建一套通讯机制。
TeamTalk中,主要使用HTTP和TCP进行通讯,我们知道HTTP是基于TCP的更高层协议,而这里的TCP通讯是指用TCP协议发送自定义格式的报文。TeamTalk在HTTP通讯中使用的是RESTful API,并使用JSON格式与服务器进行交换数据;而在TCP这里,主要是通过ProtocolBuffer序列化协议,加上自定义的包头与服务器进行通信。
HTTP数据处理
HTTP的数据处理,在TeamTalk中显得非常简单,并没有做过多的设计。主要是使用AFNetworking封装了一个HTTP模块:
DDHttpModule.h
1234567891011
typedef void(^SuccessBlock)(NSDictionary *result);typedef void(^FailureBlock)(StatusEntity* error);&@interface DDHttpModule : DDModule -(void)httpPostWithUri:(NSString *)uri params:(NSDictionary *)params success:(SuccessBlock)success failure:(FailureBlock)failure;-(void)httpGetWithUri:(NSString *)uri params:(NSDictionary *)params success:(SuccessBlock)success failure:(FailureBlock)failure;&@end&extern DDHttpModule* getDDHttpModule();
这样一个模块会被其它模块进行使用,直接传递uri请求服务器,并解析响应,以下是一个使用场景:
DDHttpServer.m
12345678910111213141516
- (void)loginWithUserName:(NSString*)userName&&&&&&&&&&&&&&&& password:(NSString*)password&&&&&&&&&&&&&&&&&&success:(void(^)(id respone))success&&&&&&&&&&&&&&&&&&failure:(void(^)(id error))failure{&&&&DDHttpModule* module = getDDHttpModule();&&&&NSMutableDictionary* dictParams = [NSMutableDictionary dictionary];&&&&&&&&...(省略参数赋值)&&&&&&&&[[NSURLCache sharedURLCache] removeAllCachedResponses];&&&&[module httpPostWithUri:@"user/zlogin/" params:dictParams&&&&&&&&&&&&&&&&&&&&success:^(NSDictionary *result) { success(result); }&&&&&&&&&&&&&&&&&&&&failure:^(StatusEntity *error) { failure(error.msg); }&&&&];}
即便是这样的一个封装,在后续的迭代中似乎也慢慢失去了作用,目前大部分所使用到HTTP的代码里,都是直接使用AFNetworking,那么这样的一个封装已经没有存在的必要了。
TCP数据处理
在TeamTalk里,针对TCP的数据处理略显复杂,因为没有类似AFNetworking这样的类库,所以需要自己封装一套处理机制。大致类图如下:
通过这样的一个类图,我们大致可以推断出设计者的抽象思维,他把所有网络操作抽象为API。基于这样思路,这里有三个最核心的类:
DDSuperAPI:这个类是对所有Request/Response这种模式网络的请求进行的抽象,所有遵循这种模式的API都需要继承这个类。
DDUnrequestSuperAPI:这个和DDSuperAPI相对应,也就是所有非Request/Response模式的网络请求,基本上都是服务端推送过来的消息。
DDAPISchedule:API调度器(应该改名为DDAPIScheduler),顾名思义,是用来调度所有注册进来的API,这个类主要做了以下几件事情:
通过DDTcpClientManager接收和发送数据包。
通过seqNo和数据包标识符(ServiceID和CommandID,这里源码中CommandID拼写有误哦),映射Request和Response,并将服务端的响应派发到正确的API中。
管理响应超时,确保每一个Request都会有应答。
基于这样一个设计,我们来看一个基本的登录操作序列图:
所有基于请求响应模式的操作,都是与上图类似,而服务端推送过来的消息,也是类似,只是没有了请求的过程。通过我的分析,大家觉得这样的设计怎么样?首先从扩展性的角度考虑,每一个API都相对独立,增加新的API非常容易,所以扩展性还是很不错的;其次从健壮性的角度考虑,每一个API都由调度器管理,调度器可以对API进行一些容错处理,API本身也可以做一些容错处理,这一点也还是可以的;最后从使用者的角度考虑,API对外暴露的接口非常简单,并且对于异步操作使用Block返回,对于组织代码还是非常有用的,所以使用者也觉得良好。
那么,这是一个完美的设计了么?我说过,没有完美的设计,只有符合特定场景的设计。针对这个设计,撇开它一些命名问题,以下是我觉得它不足的地方:
子类膨胀,恰恰是为了更好的扩展性,而带来了这样的问题,由于一个API最多只能处理两个协议包(Request,Response),所以协议众多时,导致API子类泛滥,而所做的基本都是相似事情。TeamTalk这种形式的封装,本质上是采用了Command模式,这个模式在面向对象的设计中本身就充满争议,因为它是封装行为(面向过程的设计),但也有它适用的场景,比如事务回滚、行为组合、并发执行等,但这里似乎都用不到。所以,我觉得TeamTalk这样的设计并不是特别合适,或许使用管道设计会更好点。
调度器职责不单一,为什么说它的职责不单一呢?因为引起它的变化点不止一处,很显然的,发送数据不应该纳入调度器的职责中。另外DDSuperAPI和DDUnrequestSuperAPI全部由这一个调度器来调度,也是有点别扭的,前者响应分发完后必须要从列表中移除,后者又绝对不能被移除,这样鲜明的差异性在设计中是不应该存在的,因为它会导致一些使用上的问题。
总体来说,这样的一个框架还是不错的,因为它的抽象层次不高,很容易去理解和维护,并且完成了大家的预期,这样或许就已经足够了。
本地持久化
本地持久化是个可以有很多设计的地方,但在APP中,进行设计的情况并不是很多,因为APP本身对于持久化的要求没有MIS高,一般只是做些离线缓存,而在IM中,它还负责存储历史消息等结构化数据。TeamTalk对于持久化这块,也没有做什么设计,只是依托于FMDB封装了一个MTDatabaseUtil,这是一个类似于Helper的存在,里面聚集了所有APP会用到的存储方法。毋庸置疑,这样的封装会导致类比较庞大,好在TeamTalk中存储方法并不多,并且使用了Catagory对方法进行了分类,所以总体感觉也还是可以的。另外,从残存的目录结构中可以看出,TeamTalk原本可能是想采用CoreData,但最终放弃了,或许是觉得CoreData整体不够轻量级吧。
MTDatabaseUtil和API一样,都只能算是基础设施(Infrastructure),给高层模块提供支持,高层模块会使用这些基础设施根据业务逻辑进行封装,可以看一个具的代码片段:
MTGroupModule.m
12345678910111213141516
- (void)getOriginEntityWithOriginIDsFromRemoteCompletion:(NSArray*)originIDs completion:(DDGetOriginsInfoCompletion)completion{&&&&&&&&...(省略)&&&&&&&&DDGroupInfoAPI *api = [[DDGroupInfoAPI alloc] init];&&&&[api requestWithObject:param Completion:^(id response, NSError *error) {&&&&&&&&if (!error) {&&&&&&&&&&&&NSMutableArray* groupInfos = [response objectForKey:@"groupList"];&&&&&&&&&&&&[self addMaintainOriginEntities:groupInfos];&&&&&&&&&&&&[[MTDatabaseUtil instance] insertGroups:groupInfos];&&&&&&&&&&&&completion(groupInfos,error);&&&&&&&&}else{&&&&&&&&&&&&DDLog(@"erro:%@",[error domain]);&&&&&&&&}&&&&}];}
理想中,只会在业务模块里依赖持久化操作库,但从TeamTalk总体使用情况中看,并不是这么理想,很多Controller里面直接对MTDatabaseUtil进行了操作,这样就削弱了模块化封装的意义。显然,Controller的职责不应该牵扯到数据持久化,这些都应该放置在相应的业务模块里,统一对外屏蔽这些实现细节。
模块化设计
模块化设计是更高层次的抽象和复用,也是业务不断发展后必然的设计趋势。在进入目前公司的第二周例会上,我便分享了一个亲手设计的模块化框架,这个框架和TeamTalk模块化框架有很多类似之处,好坏暂不做对比,我们先看看TeamTalk中的一个模块化架构。在TeamTalk的DDLogic目录下,隐藏着一个模块化的设计,这也是整个项目中模块设计的基础构件,以下是这个设计的核心类图:
DDModule:最基础的模块抽象,所有模块的基类,包含自己的生命周期方法,并提供一些模块共有方法。
DDTcpModule:拥有TCP通讯能力的模块,监听网络数据,子类化模块可以就此进行业务封装。
DDModuleDataManager:按照模块的粒度进行持久化操作,负责持久化和反持久化所有模块。
DDModuleManager:管理所有模块,负责调用模块生命周期方法,并对外提供模块获取方法。
整个设计还是很简单明了的,但不知是TeamTalk设计者更换了,还是原设计者变心了,导致这个模块化设计没有起到它预期的作用。具体原因就不细究了,但这样的设计还是值得去推演的,就目前这样的设计而言,也还是缺少了一些东西:
DDModule应该通过DDModuleManager注入一些基础设施,比如数据库访问组件、缓存组件、消息组件等。
DDModule应该有获取到其它模块的能力,这里面不应该反依赖与DDModuleManager,可以抽象一个ModuleProvider注入到DDModule中。
可通过Objective-C对象的load方法,在模块实现类中直接注册模块到模块管理器里,这样会更加内聚。
虽然我觉得有点缺失,但还是很欣慰的看到了这样的模块化设计,又让我想起一些往事,这种心情,就像遇见了一个和初恋很像的人。
UI相关设计
整个UI设计也没什么特别之处,主要还是采用了xib进行布局,然后连线到相应的Controller中,这里主要的WindowController是DDMainWindowController,它是在登录窗口消失后出现的,也就是DDLoginWindowController所控制的窗口消失后。
值得一提的是,这里将所有的UI都放置到了相应的业务模块中,这也是我比较推崇的做法。一个模块本就应该能够自成一系,它应该有自己的Model,有自己的View,也有自己的Controller,还可以有自己的Service等。这样设计下的模块才会显得更加内聚,其实设计就是这么简单,小到类,大到组件都应该遵循内聚的原则。
TeamTalk中还使用了一些个第三方组件,具体罗列如下:
:用于崩溃异常收集。
:用于软件自动更新。
:OSX下的一个开源的IM,TeamTalk中使用了其中的一些框架和类。
TeamTalk作为一个敢于开源出来的IM,还是非常值得赞扬的,国内的技术氛围一直提高不起来,大家似乎都在闭门造车。如果多一些像蘑菇街这样的开源行为,应该能够更好的促进圈子里的技术生态。虽然,这篇博文里提出了很多TeamTalk Mac客户端架构的不足之处,但,设计本身就是如此,根本没有最好的设计,而,每个设计者的眼光也不相同,或许我说得都不正确也不见得。
所以,只要有颗敢于尝试设计的心,开放的态度,一切问题都不是问题。
原文地址:
TT流程随笔
如果本地可以自动登录, 先实现本地登录,发送事件通知,再请求登录服务器
如果本地不可以登录(第一次或退出后),直接请求登录服务器
登录服务器返回消息服务器ip port / 文件服务器
链接消息服务器(socketThread 通过netty)
链接成功或失败都发送事件通知 (可能是在loginactivity 处理,也可能在chatfragment处理,你懂滴)
链接失败弹出界面提示
链接成功 请求登录消息服务器(发送用户名 密码 etc)并且同时开启 回掉监听队列计时器(这个稍后再细看吧~)
登录消息服务器成功或失败都通过回掉 (回掉函数存储在packetlistner 中)处理
登录消息服务器失败 发送总线事件,也可能在两个位置处理(loginactvity/chatfragment ,你懂得~)
消息服务器登录成功,并解析返回的登录信息,发送登录成功的事件总线,事件的订阅者分为service 和 activity ,activity 中的事件负责ui的更新处理,service中事件处理,消息的进一步获取 ,与服务器打交道
判断登录的类型(普通登录和本地登录成功后的消息服务器登录)
service 收到登录成功(此指在线登录成功,本地登录成功也是一个道理,发送事件更新界面ui和在service中事件触发进一步的消息获取(获取本地库))的事件通知(按登录类型有所不同 ,大体一致)后,做如下工作:
保存本次的登录标示到xml
初始化数据库(创建或获取当前用户所在数据库统一操作接口单例)
请求联系列表
请求群组列表
请求最近会话列表
请求未读消息列表(只是在线登录状态)
重连管理类的相关设置(广播的注册等)
接下来就是对服务端发送消息过来的分析
服务端发送消息过来有回调的采用回掉处理
服务端没有回调的,按照commandid处理
消息的处理都是在相关的管理器类实例内完成
该存库的存库,该更新内存的,更新内存,然后发送事件总线更新ui
或者通知service中的相关订阅者,完成业务逻辑的数据相关处理
相关网址:
TeamTalk 一键部署方案:TTAutoDeploy
TeamTalk消息服务器原理及二次开发简介(笨笨的鸡蛋)
TeamTalk 服务端分析 一、编译(蓝狐)
mac TeamTalk开发点点滴滴
分享到: ()}

我要回帖

更多关于 teamtalk 源码分析 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信