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

客戶端使用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" thenprint(request:getResponseHeadersString())local code = request:getResponseStatusCode()if code ~= 200 then-- 請求結束,但沒有返回 200 響應代碼print(code)returnendprint("---------------callback--------")-- 請求成功,顯示服務端返回的內容print("response length" .. request:getResponseDataLength())local response = request:getResponseString()print(response)elseif event.name == "progress" thenprint("progress" .. event.dltotal)else-- 請求失敗,顯示錯誤代碼和錯誤消息print(event.name)print(request:getErrorCode(), request:getErrorMessage())returnendendlocal request = network.createHTTPRequest(onRequestCallback, "127.0.0.1:19999", "POST")--request:addPOSTValue("name", "laoliu")request:setPOSTData("user:123456,password:123456")request:start()
endfunction LoginScene:onEnter()
endfunction LoginScene:onExit()endreturn 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_OBJECTpublic: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(); //得到每個連進來的socketconnect(serverConnect,SIGNAL(readyRead()),this,SLOT(readMessage())); //有可讀的信息,觸發讀函數
}void MainWindow::readMessage() //讀取信息
{
//    ui->textEdit_rec->teQByteArray 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連接在發送后將仍然保持打開狀態,于是,瀏覽器可以繼續通過相同的連接發送請求。保持連接節省了為
每個請求建立新連接所需的時間,還節約了網絡帶寬。

轉載于:https://www.cnblogs.com/hiwoshixiaoyu/p/10034949.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453843.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453843.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453843.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據挖掘:如何尋找相關項

導讀&#xff1a;隨著大數據時代浪潮的到來數據科學家這一新興職業也越來越受到人們的關注。本文作者Alexandru Nedelcu就將數學挖掘算法與大數據有機的結合起來&#xff0c;并無縫的應用在面臨大數據浪潮的網站之中。 數據科學家需要具備專業領域知識并研究相應的算法以分析對…

Python 第三方模塊之 selenium - 模擬操作 Chrome 瀏覽器

1、安裝selenium 1.1、Python 安裝 selenium 模塊 pip install selenium1.2、下載驅動 選擇和自己chrom版本相對應的驅動到本地&#xff0c;下載地址 http://npm.taobao.org/mirrors/chromedriver/2、Python 操作 from selenium import webdriver import time import json…

jupyter notebook代碼導出_Jupyter Notebook導出包含中文的pdf_親測有效

Jupyter Notebook是很好的數據科學創作環境&#xff0c;是非常方便的Python代碼編輯器。jupyter提供導出的格式有.py、.html、.md、.pdf等。目前用其導出包含中文的pdf會遇到很多坑&#xff0c;網上也有一些解決方案&#xff0c;大致分為兩種方式&#xff0c;一是安裝 pandoc并…

前端之使用 POST 提交數據并跳轉

GET 方式 window.location.href是我們常用來在js中實現頁面跳轉的方法&#xff0c;這是使用get方式發送請求&#xff0c;示例如下 window.location.href url;優點是簡單易用&#xff0c;缺點是如果有參數的話&#xff0c;參數會暴露在url地址中&#xff0c;這降低了系統的安…

cef js返回c++的代碼_CEF3開發者系列之外篇——IE中JS與C++交互

使用IE內核開發客戶端產品&#xff0c;系統和前端頁面之間的交互&#xff0c;通常給開發和維護帶來很大的便利性。但操作系統和前端之間的交互卻是比較復雜的。具體來說就是腳本語言和編譯語言的交互。在IE內核中html和css雖然不兼容,但是IE編程接口是完全一樣的,這得益于微軟的…

多線程編程指南 part 2

多線程編程指南Sun Microsystems, Inc.4150 Network CircleSanta Clara, CA95054U.S.A.文件號碼819–7051–102006 年10 月版權所有2005 Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, CA95054 U.S.A. 保留所有權利。本文檔及其相關產品的使用、復制、分發和反編譯…

00030_ArrayList集合

1、數組可以保存多個元素&#xff0c;但在某些情況下無法確定到底要保存多少個元素&#xff0c;此時數組將不再適用&#xff0c;因為數組的長度不可變 2、JDK中提供了一系列特殊的類&#xff0c;這些類可以存儲任意類型的元素&#xff0c;并且長度可變&#xff0c;統稱為集合 3…

1.3tf的varible\labelencoder

1.tf的varible變量 import tensorflow as tf #定義變量--這里是計數的變量 statetf.Variable(0,namecounter) print (state.name) #輸出變量值 onetf.constant(1) #常量new_valuetf.add(state,one) updatetf.assign(state,new_value)#初始化所有變量 inittf.initialize_all_var…

kafka 日志相關配置

日志目錄 ${kafka.logs.dir}/server.log &#xff1a;服務器日志${kafka.logs.dir}/state-change.log&#xff1a;狀態變化日志${kafka.logs.dir}/kafka-request.log&#xff1a;請求處理日志${kafka.logs.dir}/log-cleaner.log&#xff1a;日志清理${kafka.logs.dir}/control…

linux mc服務器 mod_如何在linux搭建MC服務器

摘要&#xff1a;前言Q&#xff1a;為什么要用linux搭建MC服務器&#xff1f;A&#xff1a;因為linux系統占用率低&#xff0c;跑服務器效果非常好Q&#xff1a;看不懂linux ssh&#xff0c;后期自己無力運維怎么辦A&#xff1a;沒關系&#xff0c;這個教程是通過安裝BT...前言…

flask-SQLAlchemy 使用 session.commit() 處理異常回滾

最為原始的try/except辦法&#xff0c;多次插入數據就要寫多次&#xff0c;很麻煩&#xff0c;使用python原生的contextlib.contextmanager簡化代碼&#xff01; try:user_db User(emailself.email, nicknameself.nickname, passwordself.password)db.session.add(user_db)#所…

小米機器人清理主刷和軸承_掃地機主刷怎樣更換

原標題&#xff1a;掃地機主刷怎樣更換隨著電動掃地機逐漸取代手動清潔&#xff0c;電動掃地機的工作量不斷增加&#xff0c;從而導致主刷磨損更加嚴重&#xff0c;并增加了主刷更換的次數。因此&#xff0c;偉頓在這里告訴大家掃地機主刷怎樣更換&#xff1a;1 .首先&#xff…

多線程編程指南

1. 多線程編程指南1--線程基礎 線程編程指南1--線程基礎 Wednesday, 29. March 2006, 11:48:45 多線程 本文出自:BBS水木清華站 作者:Mccartney (coolcat) (2002-01-29 20:25:25) multithreading可以被翻譯成多線程控制。與傳統的UNIX不同&#xff0c;一個傳統 的UNIX進…

路由器和貓的區別

路由器和貓的區別 網絡在我們現在生活中必不可少,我們鏈接互聯網經常需要用到貓和路由器,但是依然有很多菜鳥根本不知道什么是貓什么是路由器,至于貓和路由器怎么使用就更不知道了,下面給大家詳細的講解下路由器和貓的區別。 路由器和貓的用途和鏈接位置不一樣,如下圖: 路由器:…

Docker 精通之 docker-compose

1、Docker-compose簡介 1.1、ocker-compose簡介 Docker-Compose項目是Docker官方的開源項目&#xff0c;負責實現對Docker容器集群的快速編排。   Docker-Compose將所管理的容器分為三層&#xff0c;分別是工程&#xff08;project&#xff09;&#xff0c;服務&#xff08…

json數據格式 穗康碼_Json數據格式

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。JSON采用完全獨立于語言的文本格式&#xff0c;這些特性使JSON成為理想的數據交換語言。易于人閱讀和編寫&#xff0c;同時也易于機器解析和生成。JSON 比 XML 更小、更快&#xff0c;更易解析。JSON建構于兩種結…

Linux 系統版本查詢

顯示Linux版本信息輸入"cat /proc/version",說明正在運行的內核版本。輸入"cat /etc/issue", 顯示的是發行版本信息。輸入"lsb_release -a ",可對多個linux版本適用。輸入"uname -a ",可顯示電腦以及操作系統的相關信息。轉載于:https…

kafka 命令行命令大全

kafka 腳本 connect-distributed.sh connect-mirror-maker.sh connect-standalone.sh kafka-acls.sh kafka-broker-api-versions.sh kafka-configs.sh kafka-console-consumer.sh kafka-console-producer.sh kafka-consumer-groups.sh kafka-consumer-perf-test.sh kafka-dele…

kotlin將對象轉換為map_Kotlin程序將哈希映射(HashMap)轉換為列表(List)

Kotlin程序將哈希映射(HashMap)轉換為列表(List)在此程序中&#xff0c;您將學習在Kotlin中將map轉換為列表的不同方法。示例&#xff1a;將map轉換為列表示例import java.util.ArrayListimport java.util.HashMapfun main(args: Array) {val map HashMap()map.put(1, "a…

零元學Expression Blend 4 - Chapter 4元件重復運用的觀念

零元學Expression Blend 4 - Chapter 4元件重復運用的觀念 原文:零元學Expression Blend 4 - Chapter 4元件重復運用的觀念本章將教大家Blend元件重復運用的觀念&#xff0c;這在Silverlight設計中是非常重要的&#xff0c;另外加碼贈送漸層工具(Gradient Tool)。 ? 本章將教…