客戶端使用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連接在發送后將仍然保持打開狀態,于是,瀏覽器可以繼續通過相同的連接發送請求。保持連接節省了為
每個請求建立新連接所需的時間,還節約了網絡帶寬。