cocos2d-lua3.7组件篇(三)-http通信demo

举报
鱼酱 发表于 2022/01/06 23:07:02 2022/01/06
【摘要】 客户端使用lua、服务端使用QT做为服务器。 步骤:       客户端 -----------Post 用户名和密码    服务端接受Post请求,读取数据,返回response   一、客户端代码     loadingIm...

客户端使用lua、服务端使用QT做为服务器。

步骤:
 

  •     客户端 -----------Post 用户名和密码
  •     服务端接受Post请求,读取数据,返回response

 

一、客户端代码

 

 


  
  1. loadingImg = require"app.scenes.LoadingLayer"
  2. local LoginScene = class("LoginScene", function()
  3. return display.newScene("LoginScene")
  4. end)
  5. function LoginScene:ctor()
  6. print("LoginScene")
  7. self.loading = loadingImg:new()
  8. self.loading:addTo(self)
  9. self:removeChild(self.loading)
  10. local function onRequestCallback(event)
  11. local request = event.request
  12. --dump(event)
  13. if event.name == "completed" then
  14. print(request:getResponseHeadersString())
  15. local code = request:getResponseStatusCode()
  16. if code ~= 200 then
  17. -- 请求结束,但没有返回 200 响应代码
  18. print(code)
  19. return
  20. end
  21. print("---------------callback--------")
  22. -- 请求成功,显示服务端返回的内容
  23. print("response length" .. request:getResponseDataLength())
  24. local response = request:getResponseString()
  25. print(response)
  26. elseif event.name == "progress" then
  27. print("progress" .. event.dltotal)
  28. else
  29. -- 请求失败,显示错误代码和错误消息
  30. print(event.name)
  31. print(request:getErrorCode(), request:getErrorMessage())
  32. return
  33. end
  34. end
  35. local request = network.createHTTPRequest(onRequestCallback, "127.0.0.1:19999", "POST")
  36. --request:addPOSTValue("name", "laoliu")
  37. request:setPOSTData("user:123456,password:123456")
  38. request:start()
  39. end
  40. function LoginScene:onEnter()
  41. end
  42. function LoginScene:onExit()
  43. end
  44. return LoginScene

 

 

 

二、客户端lua代码核心介绍

network.createHTTPRequest(onRequestCallback, "127.0.0.1:19999", "POST")

--request:addPOSTValue("name", "laoliu")
request:setPOSTData("user:123456,password:123456")

 

三、服务端QT代码


在.pro文件中追加    QT+= core gui network

.h文件

 


  
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include <qsctpserver.h>
  5. #include <qtcpsocket.h>
  6. namespace Ui {
  7. class MainWindow;
  8. }
  9. class MainWindow : public QMainWindow
  10. {
  11. Q_OBJECT
  12. public:
  13. explicit MainWindow(QWidget *parent = 0);
  14. ~MainWindow();
  15. public slots:
  16. void onNewConnection();
  17. void acceptConnection();
  18. void readMessage();
  19. void disconnected();
  20. void deleteLater();
  21. private:
  22. Ui::MainWindow *ui;
  23. QTcpServer * serverListen;
  24. QTcpSocket *serverConnect;
  25. };
  26. #endif // MAINWINDOW_H

 

 

 

 

 

.cpp

 


  
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QLocalSocket>
  4. MainWindow::MainWindow(QWidget *parent) :
  5. QMainWindow(parent),
  6. ui(new Ui::MainWindow)
  7. {
  8. ui->setupUi(this);
  9. serverListen = new QTcpServer;
  10. serverConnect = new QTcpSocket;
  11. serverListen->listen(QHostAddress::Any,19999);
  12. connect(serverListen,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
  13. }
  14. MainWindow::~MainWindow()
  15. {
  16. delete ui;
  17. }
  18. void MainWindow::onNewConnection()
  19. {
  20. int temp=1;
  21. }
  22. void MainWindow::acceptConnection()
  23. {
  24. serverConnect = serverListen->nextPendingConnection(); //得到每个连进来的socket
  25. connect(serverConnect,SIGNAL(readyRead()),this,SLOT(readMessage())); //有可读的信息,触发读函数
  26. }
  27. void MainWindow::readMessage() //读取信息
  28. {
  29. // ui->textEdit_rec->te
  30. QByteArray qba= serverConnect->readAll(); //读取
  31. qDebug()<<qba;
  32. QString ss=QVariant(qba).toString();
  33. QString info(ss);
  34. QStringList tokens(info.split( QRegExp("[ /r/n][ /r/n]*")));
  35. qDebug()<<tokens;
  36. if ( tokens[0] == "GET" )
  37. //getDeal(serverConnect);
  38. { qDebug()<<"get";}
  39. if( tokens[0] == "POST")
  40. //postDeal(serverConnect);
  41. { qDebug()<<"POST";}
  42. serverConnect->write("HTTP/1.1 200 OK\r\n");
  43. serverConnect->close();
  44. }
  45. void MainWindow::disconnected()
  46. {
  47. qDebug()<<"disconnected";
  48. }
  49. void MainWindow::deleteLater()
  50. {
  51. qDebug()<<"deleteLater";
  52. }

 

 

 

核心基于,这两个类进行tcp/ip 操作


  
  1. QTcpServer * serverListen;
  2. QTcpSocket *serverConnect;

 

 

QTcpServer的基本操作:

1、调用listen监听端口。

2、连接信号newConnection,在槽函数里调用nextPendingConnection获取连接进来的socket。

 

QTcpSocket的基本能操作:

1、调用connectToHost连接服务器。

2、调用waitForConnected判断是否连接成功。

3、连接信号readyRead槽函数,异步读取数据。

4、调用waitForReadyRead,阻塞读取数据。

四、tcp、ip实现http的过程:



HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:
 

1. 建立TCP连接

在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议
与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更
高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更高层协议的连接,因此,首先要建立TCP
连接,一般TCP连接的端口号是80。

2. Web浏览器向Web服务器发送请求命令

一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET/sample/hello.jsp HTTP/1.1。

3. Web浏览器发送请求头信息

浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白
行来通知服务器,它已经结束了该头信息的发送。

4. Web服务器应答

客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本
号和应答状态码。

5. Web服务器发送应答头信息

正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求
的文档。

6. Web服务器向浏览器发送数据

Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以
Content-Type应答头信息所描述的格式发送用户所请求的实际数据。

7. Web服务器关闭TCP连接

一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其
头信息加入了这行代码:Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为
每个请求建立新连接所需的时间,还节约了网络带宽。

文章来源: yujiang.blog.csdn.net,作者:鱼酱2333,版权归原作者所有,如需转载,请联系作者。

原文链接:yujiang.blog.csdn.net/article/details/78851339

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。