天气APP服务端——3.搭建业务处理框架(多进程)

一、端口采用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断开,不理它了,也就是不认识的报文发过来,就直接关闭。这是为了系统的安全考虑。这就像收到了骚扰电话一样,直接挂了。
在这里插入图片描述
  如果是规定的报文范围内,会继续等待。
在这里插入图片描述

七、短连接还是长连接

这是由客户端安排的。

客户端开发文档 项目类别:基于对话框的MFC程序。 项目名称:MFCClient 一、 程序的初始化。 1、 在函数CMFCClientDlg::AddInit()中进行相应的操作。主要功能为对控件进行初始化。禁用控件和设置空间初始值。 2、 在CMFCClientDlg::InitInstance()中加载套接字库 二、 客户端单击“连接服务器”按钮后的操作。 1、 创建一个新线程,用于处理相关的SOCKET操作。线程函数为CMFCClientDlg的静态成员函数fnSocket(). 2、 fnSocket()的主要作用。 a、 使用函数CMFCClientDlg::CheckName(CString)对昵称进行检查 b、 创建套接字、检查输入的端口、与服务端进行连接以及循环接收来自服务端的消息。 c、 将应当禁用和开启的控件分别进行操作。 3、使用DisposeRecvMsg(Cstring str)对收到的消息进行处理。 三、 客户端单击“发送消息”按钮后的操作。 从文本控件中获得Cstring类型的数据,与想发送的目标客户端昵称根据之前的约定进行组合,然后转换为TCHAR的数据,再发送到所有的客户端。 四、 客户端单击“断开服务器”按钮后的操作 关闭套接字,此时,服务端将会收到关闭消息,从而作出相应的相应。 服务端开发文档 项目类别:基于对话框的MFC程序。 项目名称:MFCServer 一、 程序的初始化。 1、 在函数CMFCServerDlg::AddInit()中进行相应的操作。主要功能为对控件进行初始化。禁用控件和设置空间初始值。 2、 在CMFCServerApp::InitInstance()中加载套接字库 二、 服务端单击“开启服务器”按钮后的操作。 1、 创建一个新线程,用于处理相关的SOCKET操作。线程函数为CMFCServerDlg的静态成员函数fnSocket(). 2、 fnSocket()的主要作用。 a、 创建套接字、检查输入的端口、绑定套接字、监听端口以及使用select模型开始处理套接字。 b、 将应当禁用和开启的控件分别进行操作。 3、 维护用于存储客户端昵称和套机字的Carray数组m_ClientMap 4、 使用函数DisposeRecvMsg(SOCKET s,Cstring str)来处理消息接收到的消息。 三、 服务端单击“停止服务器”按钮后的操作。 清空相关的数据和对相关控件的禁用进行操作。 四、 服务端单击“发送消息”按钮后的操作。 从文本控件中获得Cstring类型的数据,然后转换为TCHAR的数据,再发送到所有的客户端。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值