TeamTalk源码分析(二) —— 服务器端的程序的编译与部署
写在前面的话,如果您在部署teamtalk过程中遇到困难,可以关注我的微信公众号『easyserverdev』,在微信公众号中回复『teamtalk部署求助』,我将与你取得联系并协助您解决。或者您对高性能服务器开发感兴趣,您也可以关注我的微信公众号获得技术支持。
这篇我们来介绍下TeamTalk服务器端的编译与部署,部署文档在auto_setup下,这里我们只介绍下服务器程序的编译与部署,不包括管理后台的部署,其部署方法在auto_setup\im_server文件夹,其实按官方介绍只要找一台干净的linux系统运行一下auto_setup\im_server\setup.sh程序就可以了,会自动安装mysql(maridb,mysql被oracle收购后,分为两个分支,继续开源的分支改名叫maridb)、nginx和redis。我们暂且不部署web端,所以不需要安装nginx。我这里是手动安装了mysql和redis。然后启动mysql和redis,并手动建立如下库和表。库名叫teamtalk,需要建立以下这些表:
--后台管理员表
--password 密码,规则md5(md5(passwd)+salt)
CREATE TABLE `IMAdmin` (`id` mediumint(6) unsigned NOT NULL AUTO_INCREMENT,`uname` varchar(40) NOT NULL COMMENT '用户名',`pwd` char(32) NOT NULL COMMENT '经过md5加密的密码',`status` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '用户状态 0 :正常 1:删除 可扩展',`created` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',`updated` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8--存储语音地址
CREATE TABLE `IMAudio` (`id` int(11) NOT NULL AUTO_INCREMENT,`fromId` int(11) unsigned NOT NULL COMMENT '发送者Id',`toId` int(11) unsigned NOT NULL COMMENT '接收者Id',`path` varchar(255) COLLATE utf8mb4_bin DEFAULT '' COMMENT '语音存储的地址',`size` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '文件大小',`duration` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '语音时长',`created` int(11) unsigned NOT NULL COMMENT '创建时间',PRIMARY KEY (`id`),KEY `idx_fromId_toId` (`fromId`,`toId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin--存储部门信息
CREATE TABLE `IMDepart` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '部门id',`departName` varchar(64) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '部门名称',`priority` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '显示优先级,相同优先级按拼音顺序排列',`parentId` int(11) unsigned NOT NULL COMMENT '上级部门id',`status` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '状态',`created` int(11) unsigned NOT NULL COMMENT '创建时间',`updated` int(11) unsigned NOT NULL COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_departName` (`departName`),KEY `idx_priority_status` (`priority`,`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin--发现配置表
CREATE TABLE `IMDiscovery` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',`itemName` varchar(64) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '名称',`itemUrl` varchar(64) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT 'URL',`itemPriority` int(11) unsigned NOT NULL COMMENT '显示优先级',`status` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '状态',`created` int(11) unsigned NOT NULL COMMENT '创建时间',`updated` int(11) unsigned NOT NULL COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_itemName` (`itemName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin--群组表
CREATE TABLE `IMGroup` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(256) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '群名称',`avatar` varchar(256) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '群头像',`creator` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建者用户id',`type` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '群组类型,1-固定;2-临时群',`userCnt` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '成员人数',`status` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '是否删除,0-正常,1-删除',`version` int(11) unsigned NOT NULL DEFAULT '1' COMMENT '群版本号',`lastChated` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '最后聊天时间',`created` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',`updated` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_name` (`name`(191)),KEY `idx_creator` (`creator`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='IM群信息'--群成员表
CREATE TABLE `IMGroupMember` (`id` int(11) NOT NULL AUTO_INCREMENT,`groupId` int(11) unsigned NOT NULL COMMENT '群Id',`userId` int(11) unsigned NOT NULL COMMENT '用户id',`status` tinyint(4) unsigned NOT NULL DEFAULT '1' COMMENT '是否退出群,0-正常,1-已退出',`created` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',`updated` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_groupId_userId_status` (`groupId`,`userId`,`status`),KEY `idx_userId_status_updated` (`userId`,`status`,`updated`),KEY `idx_groupId_updated` (`groupId`,`updated`)
) ENGINE=InnoDB AUTO_INCREMENT=68 DEFAULT CHARSET=utf8 COMMENT='用户和群的关系表'--群消息表,x代表第几张表,目前做了分表有8张:0-7.消息具体在哪张表中,是groupId%IMGroupMessage表的数目
CREATE TABLE `IMGroupMessage_(x)` (`id` int(11) NOT NULL AUTO_INCREMENT,`groupId` int(11) unsigned NOT NULL COMMENT '用户的关系id',`userId` int(11) unsigned NOT NULL COMMENT '发送用户的id',`msgId` int(11) unsigned NOT NULL COMMENT '消息ID',`content` varchar(4096) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '消息内容',`type` tinyint(3) unsigned NOT NULL DEFAULT '2' COMMENT '群消息类型,101为群语音,2为文本',`status` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '消息状态',`created` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',`updated` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_groupId_status_created` (`groupId`,`status`,`created`),KEY `idx_groupId_msgId_status_created` (`groupId`,`msgId`,`status`,`created`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='IM群消息表'--消息表,x代表第几张表,目前做了分表有8张:0-7.具体在那张表,是relateId%IMMessage表数目.
CREATE TABLE `IMMessage_0` (`id` int(11) NOT NULL AUTO_INCREMENT,`relateId` int(11) unsigned NOT NULL COMMENT '用户的关系id',`fromId` int(11) unsigned NOT NULL COMMENT '发送用户的id',`toId` int(11) unsigned NOT NULL COMMENT '接收用户的id',`msgId` int(11) unsigned NOT NULL COMMENT '消息ID',`content` varchar(4096) COLLATE utf8mb4_bin DEFAULT '' COMMENT '消息内容',`type` tinyint(2) unsigned NOT NULL DEFAULT '1' COMMENT '消息类型',`status` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '0正常 1被删除',`created` int(11) unsigned NOT NULL COMMENT '创建时间', `updated` int(11) unsigned NOT NULL COMMENT '更新时间', PRIMARY KEY (`id`),KEY `idx_relateId_status_created` (`relateId`,`status`,`created`),KEY `idx_relateId_status_msgId_created` (`relateId`,`status`,`msgId`,`created`),KEY `idx_fromId_toId_created` (`fromId`,`toId`,`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin--最近联系人(会话)表。
CREATE TABLE `IMRecentSession` (`id` int(11) NOT NULL AUTO_INCREMENT,`userId` int(11) unsigned NOT NULL COMMENT '用户id',`peerId` int(11) unsigned NOT NULL COMMENT '对方id',`type` tinyint(1) unsigned DEFAULT '0' COMMENT '类型,1-用户,2-群组',`status` tinyint(1) unsigned DEFAULT '0' COMMENT '用户:0-正常, 1-用户A删除,群组:0-正常, 1-被删除',`created` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',`updated` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_userId_peerId_status_updated` (`userId`,`peerId`,`status`,`updated`),KEY `idx_userId_peerId_type` (`userId`,`peerId`,`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8--用户关系表,标识两个用户之间的唯一关系id,用于消息分表。relationId % 消息表数目。
CREATE TABLE `IMRelationShip` (`id` int(11) NOT NULL AUTO_INCREMENT,`smallId` int(11) unsigned NOT NULL COMMENT '用户A的id',`bigId` int(11) unsigned NOT NULL COMMENT '用户B的id',`status` tinyint(1) unsigned DEFAULT '0' COMMENT '用户:0-正常, 1-用户A删除,群组:0-正常, 1-被删除',`created` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',`updated` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_smallId_bigId_status_updated` (`smallId`,`bigId`,`status`,`updated`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8--用户表
--password 密码,规则md5(md5(passwd)+salt)
CREATE TABLE `IMUser` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户id',`sex` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '1男2女0未知',`name` varchar(32) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '用户名',`domain` varchar(32) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '拼音',`nick` varchar(32) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '花名,绰号等',`password` varchar(32) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '密码',`salt` varchar(4) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '混淆码',`phone` varchar(11) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '手机号码',`email` varchar(64) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT 'email',`avatar` varchar(255) COLLATE utf8mb4_bin DEFAULT '' COMMENT '自定义用户头像',`departId` int(11) unsigned NOT NULL COMMENT '所属部门Id',`status` tinyint(2) unsigned DEFAULT '0' COMMENT '1. 试用期 2. 正式 3. 离职 4.实习',`sign_info` varchar(32) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '个性签名',`created` int(11) unsigned NOT NULL COMMENT '创建时间',`updated` int(11) unsigned NOT NULL COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_domain` (`domain`),KEY `idx_name` (`name`),KEY `idx_phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin--离线文件传输表(同事建议的,待考证)
CREATE TABLE `IMTransmitFile` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', `fromId` int(11) unsigned NOT NULL COMMENT '发送用户的id', `toId` int(11) unsigned NOT NULL COMMENT '接收用户的id', `fileName` varchar(32) COLLATE utf8mb4_bin DEFAULT '' COMMENT '文件名字', `size` int(11) unsigned NOT NULL COMMENT '文件大小', `taskId` varchar(256) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '任务id', `status` tinyint(1) unsigned DEFAULT '0' COMMENT '状态', `created` int(11) unsigned NOT NULL COMMENT '创建时间', `updated` int(11) unsigned NOT NULL COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_taskId` (`taskId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
因为这个企业内部的即时通讯软件,所以客户端不提供注册功能,要想增加新用户,必须通过在管理后台界面手动添加,这里由于我们目前没有部署管理后台界面(需要先安装nginx),所以我们就直接先在用户表IMUser里面添加几个测试用户吧。这个就是基本的sql语句了。但是由于这里用户密码的生成规则是:md5(md5(passwd)+salt),而我们不知道salt到底是什么,这个现在不急,我们后面分析服务器代码时会介绍它。所以,我们就暂且在数据库里面随便写的密码,然后在程序里面修改代码,暂且不校验密码。修改的地方在这里:server\src\db_proxy_server\business\InterLogin.cpp的51行(CInterLoginStrategy::doLogin函数里面),将这个if语句注释掉:
接下来就是如何编译程序了:
编译程序需要用到cmake和make、gcc,由于程序用了部分C++11的东西,所以gcc的版本至少在4.7以上,我的部署环境是CentOS7、cmake 2.8,gcc 4.8.5。
编译方法:
#编译说明
###编译环境
TeamTalk编译需要依赖一些最新的c++标准, 建议使用CentOS 7.0, 如果使用的是CentOS 6.x,需要将g++版本升至支持c++11特性,升级脚本可以使用自动安装脚本目录下的gcc_setup
###第三方库
TeamTalk使用了许多第三方库,包括protobuf,hiredis,mariadb(mysql),log4cxx等等,在第一次编译TeamTalk之前,建议先执行目录下的
protobuf: make_protobuf.sh
hiredis: make_hiredis.sh
mariadb: make_mariadb.sh
log4cxx: make_log4cxx.sh
这些脚本执行完后会自动将头文件和库文件拷贝至指定的目录。如果你的机器上已经安装了相应的模块,可以不用执行相对应的脚本。
make_protobuf.sh会做以下工作:
1. 解压和编译protobuf目录下的protobuf-2.6.1.tar.gz文件,并在将编译后的文件拷贝到该目录,分别是bin、include和lib,还有一个protobuf-2.6.1是解压后的目录。protobuf目录结构如下:
.
|-- bin
|-- include
|-- lib
|-- protobuf-2.6.1
`-- protobuf-2.6.1.tar.gz
2. 同时会往server/src/base/pb目录下拷贝google和lib两个文件夹,protocol是原来就存在的存放protobuf的*.proto文件的目录,目录结构如下:
.
|-- google
|-- lib
`-- protocol
make_log4cxx.sh 会做以下工作:
1. 从网址http://mirror.bit.edu.cn/apache/logging/log4cxx/0.10.0/apache-log4cxx-0.10.0.tar.gz下载apache-log4cxx-0.10.0.tar.gz文件。下载好后解压安装,并在log4
cxx目录下生成lib和include两个文件夹,目录结构如下:
.
|-- apache-log4cxx-0.10.0
|-- apache-log4cxx-0.10.0.tar.gz
|-- console.cpp
|-- include
|-- inputstreamreader.cpp
|-- lib
`-- socketoutputstream.cpp
同样,apache-log4cxx-0.10.0是解压后的目录。
make_hiredis.sh和make_mariadb.sh原理一样,这里就不介绍了。
###编译TeamTalk服务器
当以上步骤都完成后,可以使用"./build.sh version 1"编译整个TeamTalk工程,一旦编译完成,会在上级目录生成im_server_x.tar.gz包,该压缩包包含的内容有:
sync_lib_for_zip.sh: 将lib目录下的依赖库copy至各个服务器的目录下,启动服务前需要先执行一次该脚本
lib: 主要包含各个服务器依赖的第三方库
restart.sh: 启动脚本,启动方式为./restart.sh msg_server
login_server:
msg_server:
route_server:
db_proxy_server:
file_server:
push_server:
msfs:
也可以进入各个服务目录下手动使用cmake . && make去逐个编译。每个程序都有个配置文件,配置文件在auto_setup\im_server\conf目录下,手动编译时,请考到与与对应服务相同的目录下。
注意最终生成的可执行文件,其配置文件必须和他们在同一个目录。另外可执行程序需要一个log4cxx.properties文件,这个文件是程序使用的日志库log4
cxx的配置文件,必须也和可执行程序在同一个目录。如果没有,程序仍然能运行,但可能不能正常工作。你可以将\server\src\slog\log4cxx.properties下的该文件拷贝过去。
生成程序后,你需要启动以上服务,当然在这前提下你必须能正常连接你的mysql和redis。可以按下列顺序启动服务:
db_proxy_server
file_server
msfs
route_server
http_server
login_server
msg_server
程序启动以后用lsof -i -Pn命令查看端口和连接情况:
mysqld 2970 mysql 18u IPv6 26929 0t0 TCP *:3306 (LISTEN)
mysqld 2970 mysql 40u IPv6 2347264 0t0 TCP 127.0.0.1:3306->127.0.0.1:34780 (ESTABLISHED)
mysqld 2970 mysql 41u IPv6 2347266 0t0 TCP 127.0.0.1:3306->127.0.0.1:34782 (ESTABLISHED)
mysqld 2970 mysql 42u IPv6 31596 0t0 TCP 127.0.0.1:3306->127.0.0.1:33954 (ESTABLISHED)
mysqld 2970 mysql 43u IPv6 31598 0t0 TCP 127.0.0.1:3306->127.0.0.1:33956 (ESTABLISHED)
mysqld 2970 mysql 50u IPv6 61604 0t0 TCP 127.0.0.1:3306->127.0.0.1:34638 (ESTABLISHED)
mysqld 2970 mysql 51u IPv6 108460 0t0 TCP 127.0.0.1:3306->127.0.0.1:37204 (ESTABLISHED)
redis-server 3772 zhangyl 4u IPv6 30711 0t0 TCP *:6379 (LISTEN)
redis-server 3772 zhangyl 5u IPv4 30712 0t0 TCP *:6379 (LISTEN)
redis-server 3772 zhangyl 6u IPv4 31560 0t0 TCP 127.0.0.1:6379->127.0.0.1:39540 (ESTABLISHED)
redis-server 3772 zhangyl 7u IPv4 31563 0t0 TCP 127.0.0.1:6379->127.0.0.1:39542 (ESTABLISHED)
redis-server 3772 zhangyl 8u IPv4 31566 0t0 TCP 127.0.0.1:6379->127.0.0.1:39544 (ESTABLISHED)
redis-server 3772 zhangyl 9u IPv4 31569 0t0 TCP 127.0.0.1:6379->127.0.0.1:39546 (ESTABLISHED)
redis-server 3772 zhangyl 10u IPv4 31572 0t0 TCP 127.0.0.1:6379->127.0.0.1:39548 (ESTABLISHED)
redis-server 3772 zhangyl 11u IPv4 31575 0t0 TCP 127.0.0.1:6379->127.0.0.1:39550 (ESTABLISHED)
redis-server 3772 zhangyl 12u IPv4 31578 0t0 TCP 127.0.0.1:6379->127.0.0.1:39552 (ESTABLISHED)
redis-server 3772 zhangyl 13u IPv4 31581 0t0 TCP 127.0.0.1:6379->127.0.0.1:39554 (ESTABLISHED)
redis-server 3772 zhangyl 14u IPv4 31584 0t0 TCP 127.0.0.1:6379->127.0.0.1:39556 (ESTABLISHED)
redis-server 3772 zhangyl 15u IPv4 31587 0t0 TCP 127.0.0.1:6379->127.0.0.1:39558 (ESTABLISHED)
db_proxy_server 3930 root 5u IPv4 31559 0t0 TCP 127.0.0.1:39540->127.0.0.1:6379 (ESTABLISHED)
db_proxy_server 3930 root 6u IPv4 31562 0t0 TCP 127.0.0.1:39542->127.0.0.1:6379 (ESTABLISHED)
db_proxy_server 3930 root 7u IPv4 31565 0t0 TCP 127.0.0.1:39544->127.0.0.1:6379 (ESTABLISHED)
db_proxy_server 3930 root 8u IPv4 31568 0t0 TCP 127.0.0.1:39546->127.0.0.1:6379 (ESTABLISHED)
db_proxy_server 3930 root 9u IPv4 31571 0t0 TCP 127.0.0.1:39548->127.0.0.1:6379 (ESTABLISHED)
db_proxy_server 3930 root 10u IPv4 31574 0t0 TCP 127.0.0.1:39550->127.0.0.1:6379 (ESTABLISHED)
db_proxy_server 3930 root 11u IPv4 31577 0t0 TCP 127.0.0.1:39552->127.0.0.1:6379 (ESTABLISHED)
db_proxy_server 3930 root 12u IPv4 31580 0t0 TCP 127.0.0.1:39554->127.0.0.1:6379 (ESTABLISHED)
db_proxy_server 3930 root 13u IPv4 31583 0t0 TCP 127.0.0.1:39556->127.0.0.1:6379 (ESTABLISHED)
db_proxy_server 3930 root 14u IPv4 31586 0t0 TCP 127.0.0.1:39558->127.0.0.1:6379 (ESTABLISHED)
db_proxy_server 3930 root 15u IPv4 2347263 0t0 TCP 127.0.0.1:34780->127.0.0.1:3306 (ESTABLISHED)
db_proxy_server 3930 root 16u IPv4 2347265 0t0 TCP 127.0.0.1:34782->127.0.0.1:3306 (ESTABLISHED)
db_proxy_server 3930 root 17u IPv4 31595 0t0 TCP 127.0.0.1:33954->127.0.0.1:3306 (ESTABLISHED)
db_proxy_server 3930 root 18u IPv4 31597 0t0 TCP 127.0.0.1:33956->127.0.0.1:3306 (ESTABLISHED)
db_proxy_server 3930 root 20u IPv4 31599 0t0 TCP *:10600 (LISTEN)
db_proxy_server 3930 root 21u IPv4 2344452 0t0 TCP 127.0.0.1:10600->127.0.0.1:41630 (ESTABLISHED)
db_proxy_server 3930 root 22u IPv4 2344453 0t0 TCP 127.0.0.1:10600->127.0.0.1:41632 (ESTABLISHED)
db_proxy_server 3930 root 23u IPv4 2344454 0t0 TCP 127.0.0.1:10600->127.0.0.1:41640 (ESTABLISHED)
db_proxy_server 3930 root 24u IPv4 2344455 0t0 TCP 127.0.0.1:10600->127.0.0.1:41642 (ESTABLISHED)
db_proxy_server 3930 root 25u IPv4 2344456 0t0 TCP 127.0.0.1:10600->127.0.0.1:41644 (ESTABLISHED)
db_proxy_server 3930 root 26u IPv4 2344457 0t0 TCP 127.0.0.1:10600->127.0.0.1:41646 (ESTABLISHED)
db_proxy_server 3930 root 27u IPv4 2344458 0t0 TCP 127.0.0.1:10600->127.0.0.1:41648 (ESTABLISHED)
db_proxy_server 3930 root 28u IPv4 2344459 0t0 TCP 127.0.0.1:10600->127.0.0.1:41650 (ESTABLISHED)
db_proxy_server 3930 root 29u IPv4 2344460 0t0 TCP 127.0.0.1:10600->127.0.0.1:41652 (ESTABLISHED)
db_proxy_server 3930 root 30u IPv4 2344461 0t0 TCP 127.0.0.1:10600->127.0.0.1:41654 (ESTABLISHED)
db_proxy_server 3930 root 31u IPv4 61603 0t0 TCP 127.0.0.1:34638->127.0.0.1:3306 (ESTABLISHED)
db_proxy_server 3930 root 32u IPv4 108459 0t0 TCP 127.0.0.1:37204->127.0.0.1:3306 (ESTABLISHED)
file_server 3993 root 6u IPv4 32708 0t0 TCP *:8600 (LISTEN)
file_server 3993 root 7u IPv4 32709 0t0 TCP 127.0.0.1:8601 (LISTEN)
file_server 3993 root 8u IPv4 2344463 0t0 TCP 127.0.0.1:8600->127.0.0.1:49172 (ESTABLISHED)
http_msg_server 3998 root 5u IPv4 32765 0t0 TCP *:8400 (LISTEN)
http_msg_server 3998 root 7u IPv4 2344443 0t0 TCP 127.0.0.1:41640->127.0.0.1:10600 (ESTABLISHED)
http_msg_server 3998 root 8u IPv4 2344444 0t0 TCP 127.0.0.1:41642->127.0.0.1:10600 (ESTABLISHED)
http_msg_server 3998 root 9u IPv4 2344445 0t0 TCP 127.0.0.1:41644->127.0.0.1:10600 (ESTABLISHED)
http_msg_server 3998 root 10u IPv4 2344446 0t0 TCP 127.0.0.1:41646->127.0.0.1:10600 (ESTABLISHED)
http_msg_server 3998 root 11u IPv4 2344447 0t0 TCP 127.0.0.1:41648->127.0.0.1:10600 (ESTABLISHED)
http_msg_server 3998 root 12u IPv4 2344448 0t0 TCP 127.0.0.1:41650->127.0.0.1:10600 (ESTABLISHED)
http_msg_server 3998 root 13u IPv4 2344449 0t0 TCP 127.0.0.1:41652->127.0.0.1:10600 (ESTABLISHED)
http_msg_server 3998 root 14u IPv4 2344450 0t0 TCP 127.0.0.1:41654->127.0.0.1:10600 (ESTABLISHED)
http_msg_server 3998 root 15u IPv4 2344451 0t0 TCP 127.0.0.1:37566->127.0.0.1:8200 (ESTABLISHED)
msg_server 4011 root 5u IPv4 32862 0t0 TCP *:8000 (LISTEN)
msg_server 4011 root 7u IPv4 2344437 0t0 TCP 127.0.0.1:49172->127.0.0.1:8600 (ESTABLISHED)
msg_server 4011 root 8u IPv4 2344438 0t0 TCP 127.0.0.1:41630->127.0.0.1:10600 (ESTABLISHED)
msg_server 4011 root 9u IPv4 2344439 0t0 TCP 127.0.0.1:41632->127.0.0.1:10600 (ESTABLISHED)
msg_server 4011 root 10u IPv4 2344440 0t0 TCP 127.0.0.1:47294->127.0.0.1:8100 (ESTABLISHED)
msg_server 4011 root 11u IPv4 2344441 0t0 TCP 127.0.0.1:37546->127.0.0.1:8200 (ESTABLISHED)
msg_server 4011 root 13u IPv4 2347252 0t0 TCP 192.168.226.128:8000->192.168.226.1:20801 (ESTABLISHED)
push_server 4017 root 8u IPv4 32946 0t0 UDP 127.0.0.1:34870
route_server 4025 root 5u IPv4 32975 0t0 TCP *:8200 (LISTEN)
route_server 4025 root 7u IPv4 2344467 0t0 TCP 127.0.0.1:8200->127.0.0.1:37546 (ESTABLISHED)
route_server 4025 root 8u IPv4 2344468 0t0 TCP 127.0.0.1:8200->127.0.0.1:37566 (ESTABLISHED)
msfs 4038 root 5u IPv4 33065 0t0 TCP 127.0.0.1:8700 (LISTEN)
login_server 4075 root 5u IPv4 33115 0t0 TCP *:8008 (LISTEN)
login_server 4075 root 7u IPv4 33116 0t0 TCP *:8100 (LISTEN)
login_server 4075 root 8u IPv4 33117 0t0 TCP *:8080 (LISTEN)
login_server 4075 root 9u IPv4 2344465 0t0 TCP 127.0.0.1:8100->127.0.0.1:47294 (ESTABLISHED)
服务之间的拓扑图如下:
各端口号在上面了。
现在我们用pc端来连接一下服务器,假如我们在用户表里面建立个账号叫test和zhangyl。
将登录服务器的地址设置为msg_server的监听端口号,如上图所示。输入用户名和密码(密码随意)。
这样就可以进行聊天了,当然我这里同一台机器上开了两个pc客户端。实际使用的时候一台机器是不允许开两个终端的,为了测试方便,你需要取消这个限制。用VS2013或以上版本打开win-client\solution\teamtalk.sln,修改如下代码取消pc客户端单例限制:在teamtalk.cpp的CteamtalkApp::InitInstance()中,
pc端主程序用的是mfc框架,界面使用的duilib库。 我们将在下一篇文章中详细介绍pc端程序源码。
这篇关于服务器端的部署就到这里了,个人觉得很不详尽,因为后面关于服务器的架构分析时会再次详细地介绍这一块,所以这里写的就比较简单了。
TeamTalk源码分析(二) —— 服务器端的程序的编译与部署相关推荐
- TeamTalk源码分析(十一) —— pc客户端源码分析
--写在前面的话 在要不要写这篇文章的纠结中挣扎了好久,就我个人而已,我接触windows编程,已经六七个年头了,尤其是在我读研的三年内,基本心思都是花在学习和研究windows程序上 ...
- Teamtalk源码分析
(TeamTalk服务端源码分析一)TeamTalk服务端部署 - 灰信网(软件开发博客聚合) TeamTalk源码分析(四) -- 服务器端db_proxy_server源码分析_左雪菲的专栏-CS ...
- Flume 1.7 源码分析(三)程序入口
Flume 1.7 源码分析(一)源码编译 Flume 1.7 源码分析(二)整体架构 Flume 1.7 源码分析(三)程序入口 Flume 1.7 源码分析(四)从Source写数据到Channe ...
- SpringBoot源码分析(二)之自动装配demo
SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...
- gSOAP 源码分析(二)
gSOAP 源码分析(二) 2012-5-24 flyfish 一 gSOAP XML介绍 Xml的全称是EXtensible Markup Language.可扩展标记语言.仅仅是一个纯文本.适合用 ...
- 【投屏】Scrcpy源码分析二(Client篇-连接阶段)
Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...
- Nouveau源码分析(二):Nouveau结构体的基本框架
Nouveau源码分析(二) 在讨论Nouveau对Nvidia设备的初始化前,我准备先说一下Nouveau结构体的基本框架 Nouveau的很多结构体都可以看作是C++中的类,之间有很多相似的东西, ...
- TeamTalk源码分析之login_server
login_server是TeamTalk的登录服务器,负责分配一个负载较小的MsgServer给客户端使用,按照新版TeamTalk完整部署教程来配置的话,login_server的服务端口就是80 ...
- 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )
Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...
- Android Q 10.1 KeyMaster源码分析(二) - 各家方案的实现
写在之前 这两篇文章是我2021年3月初看KeyMaster的笔记,本来打算等分析完KeyMaster和KeyStore以后再一起做成一系列贴出来,后来KeyStore的分析中断了,这一系列的文章就变 ...
最新文章
- 统治世界的 10 大算法,你知道几个?
- jenkins中配置Ant
- python有强大吗_python有多强大
- js高级—tab栏切换(面向对象做法)
- [JavaWeb-HTML]HTML标签_文件标签
- python跟java 效率_Python注重可读性和效率:与Java、PHP以及 C++语言对比谁受欢迎?...
- MTCNN——基于级联模型的人脸关键点检测网络
- ++ 优化 频繁new_Java性能优化
- Windows开发签名工具(SignTool)下载
- Spring的bean管理(注解创建对象)
- 读完 Effective Java,我整理了 59 条技巧!(含pdf)
- html5一阶段考试题,千锋HTML5-JS阶段第三周理论考试题目02
- 2016 Multi-University Training Contest 3 1010 Rower Bo
- 展示数据使用:recyclerview,retrofit,greendao,butterknife,eventbus,fresco。实现效果图列表。MVP模式。
- 电商网站适合用什么服务器?
- 1800: 少水群多刷题
- neo4j图数据库安装实践与报错解决
- 世界上不存在完美的人性
- 生鲜超市 学习进阶第三天 xadmin的后台管理
- IPv6解决方案ND防攻击技术白皮书
热门文章
- vue中 @scroll的使用
- 【最全最详细】publiccms使用教程
- FileInfo,DirectoryInfo
- mysql正则表达式中括号单汉字_正则表达式中(括号) [方括号] {大括号}的区别
- 软件开发及计算机基础
- PAP认证和CHAP认证原理解析
- ffmpeg的api里av_free和av_freep的区别
- 自制F1C200S demo板(六、裸机寄存器点灯)
- C++开源游戏推荐,reshade游戏画质增强工具
- 美团后台面试经验参考