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

 

一、客户端代码

 

 


      loadingImg = require"app.scenes.LoadingLayer"
      local LoginScene = class("LoginScene", function()
         return display.newScene("LoginScene")
      end)
      function LoginScene:ctor()
     	print("LoginScene")
      	self.loading = loadingImg:new()
      	self.loading:addTo(self)
      	self:removeChild(self.loading)
      	 local function onRequestCallback(event)
              local request = event.request
             --dump(event)
             if event.name == "completed" then
                 print(request:getResponseHeadersString())
                  local code = request:getResponseStatusCode()
                 if code ~= 200 then
                      -- 请求结束,但没有返回 200 响应代码
                     print(code)
                     return
                  end
                 print("---------------callback--------")
                  -- 请求成功,显示服务端返回的内容
                 print("response length" .. request:getResponseDataLength())
                  local response = request:getResponseString()
                 print(response)
              elseif event.name == "progress" then
                 print("progress" .. event.dltotal)
             else
                  -- 请求失败,显示错误代码和错误消息
                 print(event.name)
                 print(request:getErrorCode(), request:getErrorMessage())
                 return
              end
          end
      	local request = network.createHTTPRequest(onRequestCallback, "127.0.0.1:19999", "POST")
      	--request:addPOSTValue("name", "laoliu")
      	request:setPOSTData("user:123456,password:123456")
          request:start()
      end
      function LoginScene:onEnter()
      end
      function LoginScene:onExit()
      end
      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文件

 


      #ifndef MAINWINDOW_H
      #define MAINWINDOW_H
      #include <QMainWindow>
      #include <qsctpserver.h>
      #include <qtcpsocket.h>
      namespace Ui {
      class MainWindow;
      }
      class MainWindow : public QMainWindow
      {
          Q_OBJECT
      public:
         explicit MainWindow(QWidget *parent = 0);
          ~MainWindow();
      public slots:
         void onNewConnection();
         void acceptConnection();
         void readMessage();
        void disconnected();
        void deleteLater();
      private:
          Ui::MainWindow *ui;
          QTcpServer * serverListen;
          QTcpSocket *serverConnect;
      };
      #endif // MAINWINDOW_H
  
 

 

 

 

 

 

.cpp

 


      #include "mainwindow.h"
      #include "ui_mainwindow.h"
      #include <QLocalSocket>
      MainWindow::MainWindow(QWidget *parent) :
         QMainWindow(parent),
         ui(new Ui::MainWindow)
      {
          ui->setupUi(this);
          serverListen = new QTcpServer;
          serverConnect = new  QTcpSocket;
          serverListen->listen(QHostAddress::Any,19999);
         connect(serverListen,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
      }
      MainWindow::~MainWindow()
      {
         delete ui;
      }
      void MainWindow::onNewConnection()
      {
         int temp=1;
      }
      void MainWindow::acceptConnection()
      {
          serverConnect = serverListen->nextPendingConnection(); //得到每个连进来的socket
         connect(serverConnect,SIGNAL(readyRead()),this,SLOT(readMessage())); //有可读的信息,触发读函数
      }
      void MainWindow::readMessage() //读取信息
      {
      // ui->textEdit_rec->te
          QByteArray qba= serverConnect->readAll(); //读取
         qDebug()<<qba;
          QString ss=QVariant(qba).toString();
         QString info(ss);
         QStringList tokens(info.split( QRegExp("[ /r/n][ /r/n]*")));
                  qDebug()<<tokens;
               if ( tokens[0] == "GET" )
                   //getDeal(serverConnect);
                  { qDebug()<<"get";}
               if( tokens[0] == "POST")
                   //postDeal(serverConnect);
                  { qDebug()<<"POST";}
          serverConnect->write("HTTP/1.1 200 OK\r\n");
          serverConnect->close();
      }
      void MainWindow::disconnected()
      {
               qDebug()<<"disconnected";
      }
      void MainWindow::deleteLater()
      {
              qDebug()<<"deleteLater";
      }
  
 

 

 

 

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


          QTcpServer * serverListen;
          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个月内不可修改。