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