解说cocos2d-x 网络编程
一、HTTP与Socket的概念性认识
(一)Socket
Socket通常被称为“套接字”,用于描述IP地址和端口。套接字类型主要分为以下两种:
- 流式套接字:提供面向连接、可靠的数据传输服务。数据能够无差错、无重复地发送,并且按顺序接收,它是基于TCP协议实现的。
- 数据报式套接字:提供无连接服务,数据以独立形式发送,不保证数据无错,接收顺序可能混乱,基于UDP协议。
需要明确的是,Socket本身并不是协议,而是对TCP/IP协议的封装和应用,它是一个调用接口(API)。TCP/IP协议属于传输层协议,主要解决数据如何在网络中传输的问题。
(二)HTTP协议
HTTP协议即超文本传输协议,它是一个无连接、无状态的应用层协议,采用请求 - 响应的模式,是标准的C/S模型,主要解决如何包装数据的问题。
HTTP连接使用“请求 - 响应”方式,在请求时需要先建立连接,并且只有客户端向服务器发出请求后,服务器端才能回复数据。
(三)HTTP连接与Socket连接的区别
- Socket连接:服务器可以直接将数据传送给客户端,直到双方断开连接。
- HTTP连接:服务器需要等到客户端发送一次请求后才能将数据传回给客户端。客户端定时向服务器端发送连接请求,这样既能保持在线,又能“询问”服务器是否有新的数据,如果有则将数据传给客户端。
二、HTTP协议的具体使用
(一)常用的HTTP通信方式
常用的两种HTTP通信方式为get和post,它们的异同点如下:
- 数据操作类型:get是从服务器上获取(查询)数据,post是向服务器传送(修改)数据。
- 数据传输量:get传送的数据量较小,通常不能大于2KB;post传送的数据量较大,一般认为不受限制。
- 安全性与效率:get安全性非常低,通常难以逃过像Wireshark这类功能强大的抓包工具,但执行效率较好;post安全性相对较高。
建议在进行数据查询时使用get方式,而在进行数据添加、修改或删除时使用post方式。
(二)示例代码
我们在一个类里定义两个方法,一个用于请求,一个用于响应。以下是方法实现的一些要点: 这里使用两个tag值来区分是使用get还是post方式,可以看到它们的异同:
- get方法是将数据直接附加到URL的后面,post方法则把URL和数据分开。
- 两个方法请求完服务器后都会回调一个方法,并且不管请求是否成功,服务器都将返回一个JSON串。
通过服务器返回的JSON串,我们可以确定请求是否成功。总的来说,HTTP就是一个请求与响应的过程。
三、Socket中TCP与UDP编程(以TCP为例)
(一)TCP连接流程图及步骤
1. 创建套接字(socket)
SOCKET socket(int af, int type, int protocol);
af:指定地址族,对于(TCP,IP)协议,只能是AF_INET。type:指定socket类型(流式还是数据报式)。protocol:与特定地址族的协议,如果为0,系统会自动选择一个合适的协议。
如果socket调用成功,它会返回一个新的SOCKET套接字;如果失败则返回一个错误。
2. 将套接字绑定到一个本地地址的端口上(bind)
int bind(SOCKET s, const struct sockaddr FAR * name, int namelen);
s:要绑定的套接字。name:指定该套接字的本地地址信息,是一个指向sockaddr的指针变量。namelen:指定该地址结构的长度。
3. 将套接字设置为监听模式,接收客户端请求(listen)
int listen(SOCKET s, int backlog);
s:待监听的套接字。backlog:等待连接的队列的最大长度。
4. 等待客户请求,当有请求时,接受连接请求,返回一个新的套接字对应此次连接(accept)
SOCKET accept(SOCKET s, struct sockaddr FAR * addr, int FAR * addrlen);
s:已经处于监听状态的套接字。addr:指向一个缓冲区的指针,用来接收连接实体的地址(连接客户端的IP地址和端口信息)。addrlen:指向一个整形的指针,包含地址信息的长度。
5. 用返回的新生成的套接字和客户端进行通信(send/recv)
- send函数
int send(SOCKET s, const char FAR * buf, int len, int flags); s:已建立的套接字。buf:指向一个缓冲区,该缓冲区包含要传递的数据。len:数据的长度。flags:通常设为0。recv函数
int recv(SOCKET s, char FAR * buf, int len, int flags);s:建立连接准备接收数据的那个套接字。buf:用于保存接收的数据。len:缓冲区长度。flags:影响函数调用时的行为。