解说cocos2d-x 网络编程

2015年03月23日 10:32 0 点赞 0 评论 更新于 2025-11-21 18:13

一、HTTP与Socket的概念性认识

(一)Socket

Socket通常被称为“套接字”,用于描述IP地址和端口。套接字类型主要分为以下两种:

  1. 流式套接字:提供面向连接、可靠的数据传输服务。数据能够无差错、无重复地发送,并且按顺序接收,它是基于TCP协议实现的。
  2. 数据报式套接字:提供无连接服务,数据以独立形式发送,不保证数据无错,接收顺序可能混乱,基于UDP协议。

需要明确的是,Socket本身并不是协议,而是对TCP/IP协议的封装和应用,它是一个调用接口(API)。TCP/IP协议属于传输层协议,主要解决数据如何在网络中传输的问题。

(二)HTTP协议

HTTP协议即超文本传输协议,它是一个无连接、无状态的应用层协议,采用请求 - 响应的模式,是标准的C/S模型,主要解决如何包装数据的问题。

HTTP连接使用“请求 - 响应”方式,在请求时需要先建立连接,并且只有客户端向服务器发出请求后,服务器端才能回复数据。

(三)HTTP连接与Socket连接的区别

  • Socket连接:服务器可以直接将数据传送给客户端,直到双方断开连接。
  • HTTP连接:服务器需要等到客户端发送一次请求后才能将数据传回给客户端。客户端定时向服务器端发送连接请求,这样既能保持在线,又能“询问”服务器是否有新的数据,如果有则将数据传给客户端。

二、HTTP协议的具体使用

(一)常用的HTTP通信方式

常用的两种HTTP通信方式为get和post,它们的异同点如下:

  1. 数据操作类型:get是从服务器上获取(查询)数据,post是向服务器传送(修改)数据。
  2. 数据传输量:get传送的数据量较小,通常不能大于2KB;post传送的数据量较大,一般认为不受限制。
  3. 安全性与效率:get安全性非常低,通常难以逃过像Wireshark这类功能强大的抓包工具,但执行效率较好;post安全性相对较高。

建议在进行数据查询时使用get方式,而在进行数据添加、修改或删除时使用post方式。

(二)示例代码

我们在一个类里定义两个方法,一个用于请求,一个用于响应。以下是方法实现的一些要点: 这里使用两个tag值来区分是使用get还是post方式,可以看到它们的异同:

  1. get方法是将数据直接附加到URL的后面,post方法则把URL和数据分开。
  2. 两个方法请求完服务器后都会回调一个方法,并且不管请求是否成功,服务器都将返回一个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:影响函数调用时的行为。

6. 继续等待另外的客户请求

7. 关闭套接字

作者信息

menghao

menghao

共发布了 3994 篇文章