文章目录
一、端口采用80
当系统正式运行的时候,一般采用80端口,这个端口是HTTP服务的端口,但是不一定说是采用HTTP协议。如果用其他的端口。一般用户都会开放80端口,如果80端口都不开放,意味着外网都上不了。
二、服务端的基本流程
1.初始化
2.等待客户端的连接
3.客户端连接上来,fork一个子进程,父进程关闭通信socket,并回到Accept继续监听
4.进入子进程的流程
5.子进程关闭监听的socket
6.进入业务处理进程主函数(子进程处理业务)
就是客户端给服务端发送业务代码,服务端解析业务代码,然后去处理对应的业务。我们不做真正的客户端程序,我们只是利用tcp协议,模拟一个客户端给服务端发送业务代码。
每增加一种业务,我们只需要添加业务的处理函数就行了。(其实我觉得这里可以用设计模式了)
6.1 读取客户端的业务请求报文
如果返回false,认为是客户端退出或网络原因,不写错误日志
6.2 将参数解析出来
通信用xml格式,客户端的每一种业务的请求我们给它编排一个业务的编号。
三、新用户第一次运行所需的业务
用户下载了APP软件之后,第一次运行时向服务端发起 请求。会向服务端发送客户手机的设备编号。客户第一次运行软件是没有数据的。 这个业务就是客户端上传设备编号,服务端处理之后将城市站点信息发送给客户端。
首先我们要协调一个业务编号,这样方便服务端解析出来之后,能够正确地处理对应的业务。
新用户登录,客户端一般来说只传一个设备id。第一次登录尽量不要让用户填写过多的信息,考虑用户的感受。
1.新用户业务处理流程
(1)操作用户基本信息表
在用户基本信息表里面插入用户的设备id,设备类型,用户的类型 。
2)注意一个事项:当将用户的信息插入表中,出现主键冲突时,服务端的是不去处理的。为什么会出现主键冲突呢,因为用户下载了软件之后,使用了一段时间将软件删除了,然后又将软件下载回来了。
(2)操作全国站点基本信息表
将全国的站点信息返回给客户端。(这个信息用来干什么呢,在 深圳气象里面,让客户端选择城市列表吗?)
(3)操作用户使用日志表
记录用户的使用日志,业务流水
主要是记录什么用户,什么时间,做了什么事,在哪个城市站点。
上面的信息解析出来之后,暂时放入一个结构体中。
(4)操作数据库的注意事项
在这个服务端的程序里,我们是将数据库的连接定义为全局对象,但是我们并不会在main函数中去连接数据库。
连接数据库的操作是在子进程里面完成的, 我们在主函数中传参。如果在主函数中连接数据库是会产生冲突的。
那为什么不定义为局部变量呢,如果定义为局部变量如果程序是用exit退出,那么子进程的数据库连接对象得不到释放。(在资源释放问题里面解释有)
四、同义词的妙用
这样创建同义词之后,如果某个用户想用到另一个用户的表的时候,写程序时,不用加上前缀。
还有一个好处就是,当这个创建了同义词的表,前移到别的用户的时候,程序也不用修改。
五、解析不同的业务报文
客户端中不同的业务,业务报文的参数是不同的,这是不是意味着每增加一种业务报文,那么在服务端中就要新创建一个解析报文参数的函数呢?
其实不需要,只要一个解析的函数就可以了。有新的业务报文参数,就把新的字段加进去就行了。
那有人就问,那某个业务不需要到其他业务的参数呀。确实是不需要,程序去执行了也解析不出来,那程序不就多运行了吗,不就浪费资源了吗,但是这个影响不大,所占的资源也微不足道。
所以随着业务的复杂度增加,要什么新的字段就加进去就行。
六、接收到非法的业务代码处理方法
这个怎么处理呢,如果接收到了非法的业务代码,就是不再业务范围内。
如果接收到非法的业务代码,服务端就不继续等待了。 在天气软件中服务端是部署在互联网上的,是有公网ip的,这就意味着会有很多系统来攻击我们。
如果报文格式不符合要求的话,就直接return。
return之后会调用子进程退出函数,把socket断开,不理它了,也就是不认识的报文发过来,就直接关闭。这是为了系统的安全考虑。这就像收到了骚扰电话一样,直接挂了。
如果是规定的报文范围内,会继续等待。
七、短连接还是长连接
这是由客户端安排的。