首先,什么是协议?在开发项目的过程中,我们常常会听说到各种协议,如TCP/UDP/HTTP/FTP等协议。就个人理解看,协议分为两种,第一种是技术层面的协议,如上述说的,大家应该不陌生,起码听说过。第二种是会话层次的协议,所谓会话层次,就是说服务端和客户端之间约定的一种会话协议,通俗讲,就是语义的解释层次的。打个比方,我们进行打电话的时候,需要用到电话机,电话线,这些基础设备就相当于技术层面的协议。而我们说的每一句话,都能被对方解释得到语义,这是会话层次的协议。如果一个美国人和一个中国人都只会自己国家的语言,两个人用电话通话,虽然技术层次通话了,但是他们都无法解释对方的语言,会话层次上无法解释,通讯也是算失败的。
那么,在技术层次上,VC怎么利用http进行与服务器交互呢?在MFC类库中,封装了CInternetSession、CHttpConnection和CHttpFile三个类,这三个类的协调合作,就可以很好的使用http了。
在使用这三个类之前,先了解一下服务器那边是什么个情况才能和我们交互先,在服务端那边,需要提供给我们一个URL,这个URL能够定位到服务器的某一个页面,然后该页面就通过客户端发送一个请求而获得特定的请求并处理这个请求后,发送给客户端数据,把数据发过来之后,我们这边接收到数据即可。
现在说说,我们这边是怎么运作的。首先,先跟你的服务器开发人员要一个URL,然后使用AfxParseURL解析一下这个URL具体是什么主机,什么端口等等,然后使用CInternetSession类创建一个对象,然后由这个对象调用GetHttpConnection获得一个CHttpConnection指针,由这个指针调用OpenRequest打开一个请求通道,如
tFile = (CHttpFile*)(tConnection -> OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject));
再然后我们就可以发送具体的请求了。怎么发呢?很简单,实例代码如下
CString str = L"我是小陈,你是服务器吗?";
if(tFile -> SendRequestEx(str.GetLength()))
{
tFile->Write((const char*)str.GetBuffer(), str.GetLength());
tFile -> EndRequest();
}
发送完请求之后,这时服务器那边就应该收到请求了,怎么做出回应,就是那边的事情了,与客户端暂时无关。接下来就要看看请求发送得怎么样了。
DWORD dwStateCode;
tFile -> QueryInfoStatusCode(dwStateCode);
这时获得了状态dwStateCode,通过判断这个状态,客户端再做出一定的处理,如果状态是HTTP_STATUS_OK,而服务端也做出回应并发送数据给我们了,这时我们就可以通过CHttpFile::QueryInfo,用HTTP_QUERY_CONTENT_LENGTH旗标来获得我们接收数据的长度,然后我们就可以用CHttpFile::Read的函数去获得我们从服务端获得的数据了。
这里需要注意的是,在数据交互过程中,就涉及到我刚刚说的,会话层次的协议。简单来说,就是编码的问题,在网络传输这一模块上,常常会有乱码想象出现,这完全是编码和译码不一致导致的,所以在这个上,要和服务端交互好编码译码的事,具体应用什么编码和译码,看自己的需要吧。
有补充的话,再修改。。。。