QT實現客服端和服務器之間消息和文件交互

QT實現客服端和服務器之間消息和文件交互

平臺環境

龍芯務器
Qt5.6.1可視化編程的開發環境
MySQL5.5.40數據庫

數據庫選擇與安裝

將mysql-5.5.40解壓至MySQL SERVER文件夾中,並重命名爲mysql-5.5,接着修改my-default.ini文件中相應的信息並進行環境變量的配置,最後可通過MySQL指令“ mysql -u root -p ”進入數據庫。爲了保證數據庫信息的隱祕性,需要爲數據庫添加root密碼,通過MySQL指令“set password for root@localhost=password('xxxxxx')”增加root密碼爲xxxxxx。

交叉編譯工具鏈GCC的安裝

(1)創建相應目錄存放編譯器;
使用mkdir /wyj/mipsel指令創建路徑爲/wyj/mipsel的文件夾,該文件夾用來存放mipsel-linux-gcc編譯器的所以使用的工具。
(2)將編譯器安裝包進行解壓;
進入/wyj/mipsel文件夾,用tar jxvf mipsel-linux-gcc-4.9.3.tar.xz對交叉編譯工具進行解壓。
(3)設置環境變量PATH的值;
$export PATH=/wyj/mipsel/mipsel-linux-gcc-4.9.3/bin:$PATH指令設置環境變量PATH的值。
(4)測試交叉編譯器是否順利安裝。
在龍芯服務器的終端中寫入mipsel-linux-gcc -v,如果終端輸出交叉編譯器的安裝版本號及其配置的有關信息,則說明交叉編譯已經順利安裝。

數據庫創建數據

MySQL指令create database xxx進行創建一個名爲xxx的數據庫,用use xxx指令指明是對xxx數據庫進行操作,然後用create xxx information (id int , name text , sno text , kfh text , kno text , sdept text)指令在xxx數據庫中創建名爲information的數據庫表,數據庫表裏面的信息設置爲id,name,sno,kfh,kno和sdept,接着利用insert into information values(*,*,*,*,*)向information表格中添加數據,最後用net stop mysql關閉數據庫,並用quit指令進行退出。

Qt的開發環境搭建

(1)下載Qt開發集成環境,解壓並進入該目錄下;

$ tar zxvf qt-everywhere-opensource-src-5.6.1.tar.gz
$ cd qt-everywhere-opensource-src-5.6.1/

(2)進行gmake配置使其能一次性通過,最好運行 gmake 及 gmake install,就會安裝在 /usr/local/Qt-5.6.1 的目錄中;

$ ./configure -qt-xcb -skip qtdeclarative
$ gmake
$ gmake install

(2)配置環境,編輯系統環境變量;
在龍芯服務器的終端命令行中輸入命令行vi /etc/profile打開對應的文件,在該文件的最後需要添加如下代碼:

export QTDIR=/usr/local/Qt-5.6.1
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

(3)保存之後退出,再終端執行命令source /etc/profile讓配置的環境生效;
(4)驗證是否安裝成功。
在龍芯服務器的終端輸入命令行qmake -version,如果在終端中出現如下信息,那麼說明環境以及配置安裝成功:

QMake version 3.0
Using Qt version 5.6.1 in /usr/local/Qt-5.6.1/lib

Web實現

TCP網絡通信的流程

網絡通信流程

龍芯服務器終端下服務器端和客戶端運行

利用交叉編譯工具鏈GCC生成可運行文件,指令爲gcc xxx.c -o xxx
服務器端運行
客戶器端運行

實現服務器端和客戶端文字數據交互

服務器端建立通信

(1)在數據通信過程中需要用到兩個套接字,一個是監聽套接字,另一個是通信套接字

QTcpServer *tcpServer; //監聽套接字
QTcpSocket *tcpSocket; //通信套接字

(2)在server.h中定義的兩個套接字變量需要在server.cpp中進行初始化,將它們賦值爲NULL,同時監聽套接字分配空間,指定父對象

tcpServer=NULL;
tcpSocket=NULL;
tcpServer=new QTcpServer(this);

(3)當有客戶端連接時就進行分配空間,使用connect函數進行連接,建立套接字進行通訊,取出建立好連接的套接字獲取對方的IP地址和端口號,在窗口上顯示連接成功;

connect(tcpServer,&QTcpServer::newConnection,[=]()
{
        //取出建立好連接的套接字
        tcpSocket=tcpServer->nextPendingConnection();
        QString ip=tcpSocket->peerAddress().toString();//獲取對方的IP
        qint16 port=tcpSocket->peerPort();//獲取對方的端口號
        QString temp=QString("[%1 %2]:成功連接").arg(ip).arg(port);
        ui->textEditRead->setText(temp);
})

(4)在UI界面選擇發送按鈕,右鍵選擇轉到槽函數,使得能夠通過按鈕實現獲取編輯器的內容以及清除編輯器的內容,以此實現相應的功能;
(5)判斷是否建立套接字成功,如果不是則進行return返回,並進行輸出“服務端斷開,請重新連接”的信息,不然則發送textEditWrite裏面的內容。使用tcpsocket的disconnectFrom Host和close函數進行斷開。

if(NULL == tcpSocket)
    {
        return;
    }
    tcpSocket->write("服務端斷開,請重新連接");
    //主動和客戶端端口連接
    tcpSocket->disconnectFromHost();
    tcpSocket->close();

客服端建立通信

(1)在客戶端中需要用到通信套接字,則首先在client.h中定義通信套接字;

QTcpSocket *tcpSocket; //通信套接字

(2)在client.h中定義的通信套接字變量需要在client.cpp中進行初始化,賦值爲NULL,同時通信套接字進行分配空間,指定父對象;

tcpSocket = NULL;
//分配空間,指定父對象
tcpSocket = new QTcpSocket(this);

(3)當有服務器端與客戶端連接時,使用connect函數進行連接,建立通信套接字進行通訊,並打印“成功和服務器建立好連接”的信息,獲取對方發送的數據內容,並追加到編輯器中;

connect(tcpSocket, &QTcpSocket::connected,
            [=]()
            {
                ui->textEditRead->setText("成功和服務器建立好連接");
            });

(4)通過定義ip和port變量並利用lineEdit部件進行獲取IP號和端口號,利用connectToHost函數主動實現與服務器建立連接;

//獲取服務器IP和端口
QString ip = ui->lineEditIP->text();
qint16 port = ui->lineEditPort->text().toInt();
//主動和服務器建立連接
tcpSocket->connectToHost(QHostAddress(ip), port);

(5)在UI界面選擇發送按鈕,右鍵選擇轉到槽函數,獲取編輯框的內容,通過write進行數據寫入、read進行數據讀取並進行發送,在此過程中將數據編碼爲Utf-8,以防出現亂碼現象,最後清除編輯框的內容;

//獲取編輯框內容
QString str = ui->textEditWrite->toPlainText();
//發送數據
tcpSocket->write( str.toUtf8().data() );
//清除編輯區內容
ui->textEditWrite->clear();

(6)數據傳輸完成後使用tcpsocket通信套接字的disconnectFrom Host和close函數主動進行斷開連接。

//主動和對方斷開連接
tcpSocket->write("客戶端已斷開");
tcpSocket->disconnectFromHost();
tcpSocket->close();

寫道這太不容易了,跪了跪了。。。。。。。後面的內容包含客服端與服務器之間的文件交互以及完整代碼。。。。
感謝大家持續關注!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章