QT——使用network連接自己的虛擬機(1)

1、事前準備

1.1、下載VMware Workstation Pro

大家如如果有就不用再下載了,如果沒有下載的話,個人建議是下載高些的版本,我以前較低的版本一直會出現虛擬機繁忙的情況,高版本的虛擬機和低版本沒什麼差別,但是更好用些(個人認爲)。
這裏我是在騰訊管家下載的,具體圖標是這一下這樣。
在這裏插入圖片描述

1.2、建立虛擬機

下載好虛擬機後,我們就要建立一個自己的虛擬機,由於操作繁多,每個人的電腦可能也是不一樣,我就直接把我自己的虛擬機拿出來,大家下載之後就可以直接用VMware Workstation Pro直接打開。

由於CSDN網站的資源不能上傳2G多的文件,這裏就放百度雲的鏈接。
鏈接:https://pan.baidu.com/s/1gG0okHxyraDRdmp8W6rRKA
提取碼:c5vz

2、虛擬機設置

2.1、打開虛擬機

將文件下載解壓後,打開VMware Workstation Pro。在主頁中點擊打開虛擬機,找到自己解壓的文件,選擇Fedora.vmx,如下圖所示。
在這裏插入圖片描述

2.2設置共享目錄

在虛擬機的列表中選擇Fedora-》編輯虛擬機設置-》選項-》共享 文件夾-》添加路徑
在這裏插入圖片描述
注意:這個路徑是你計算機裏的路徑,以後這個路徑下的文件在虛擬機中也能看到。

3、登入虛擬機,查IP,關閉防火牆

3.1以管理員身份進入

每次開機之後,我們使用的是管理員的身份,所以
賬號爲:root
密碼爲:123456

3.2查看虛擬機IP

登入後,我們打開終端輸入ifconfig來看有沒有IP,下面畫橫的位置就是我們虛擬機的IP。(如果沒有IP就看文章最後的 第4部分解決方法)
在這裏插入圖片描述

3.3關閉防火牆

輸入service iptables stop 關閉防火牆後才能在win端和Linux端通信。
在終端處也可以進行編碼集進行修改。在這裏插入圖片描述

4、解決方法

如果你的虛擬機沒有IP,下面提供一個解決方法:
編輯虛擬機-》網絡適配器-》自定義-》選擇NAT模式-》確定

在這裏插入圖片描述

5、具體使用

5.1網絡連接的原理簡介(簡單解析)

在網絡連接中,不管是服務器(左半邊)還是客戶端(右半邊),都是需要一個socket來進行連接,在QT中,我們主要要完成的是客戶端的部分,服務器端後期會進行詳解。以下是網絡連接的大概流程。
在這裏插入圖片描述

5.2、編譯服務器

(1)、我們打開虛擬機的終端,輸入 cd /mnt/hgfs/share/進行打開共享文件。
解析:這裏的cd是打開文件夾的指令後面接着文件夾名稱,/mnt/hgfs/是代表打開共享文件夾的路徑,共享文件會被存放在此,再然後的share是我的共享文件的名稱(怎麼設置共享文件夾看2.2)。

(2)、到這個網址中下載服務器的代碼 ,https://download.csdn.net/download/l1206715877/12455278
(3)、將下載的文件放到自己的共享文件夾中
(4)、接着我們在虛擬機的終端輸入gcc tcpserevr.c -o tcpserver 就會編譯共享文件夾的tcpserver文件(注意:如果,這個服務器文件中,你加入了有關SQL數據庫的一些操作就要寫成gcc tcpserevr.c -o tcpserver -lsqlite3這樣是加上數據庫模塊,不然會出錯。)
(5)、編譯如果沒有錯誤話,再輸入 ./tcpserevr來執行服務器,如果要關閉服務器就按ctrl+c鍵關閉服務器。
(6)、操作如下圖(你們編譯運行的話,是不會出現“創建用戶數據庫成功……”的,這些是需要自己改動服務器代碼的)
在這裏插入圖片描述

5.3、QT中示例代碼(具體使用會在QT——使用network連接自己的虛擬機(2)中講解,這只是簡單講解)

做好上面的部分否,打開QT工程,首先要在pro文件中加上QT+=network

#include <QtNetwork>        //用於網絡模塊
#include <QTcpSocket>       //建立網絡TcpSocket對象

class YourClass: public QWidget
{
    Q_OBJECT
public:
    YourClass(QWidget *parent = 0);
private:
    //Socket建立
    QTcpSocket *tcpclinet;
public slots:   槽函數
    void readSlot();	//接收到信息時執行
}
    
YourClass::YourClass(QWidget *parent)
    : QWidget(parent)
{  
    //建立Socket
    tcpclinet = new QTcpSocket(this);   
    
    //連接服務器(這句代碼應該是要在給數據庫發數據包的代碼中才會用到)
    tcpclinet->connectToHost(IPLineEdit->text(),PortLineEdit->text().toInt());  
        
    //用於監聽服務器發來的數據
    this->connect(this->tcpclinet,SIGNAL(readyRead()),this,SLOT(readSlot()));  
}
//這裏如果你沒有改過服務器代碼的話是不會返回任何信息的
YourClass::::readSlot()
{
    //接收到服務器發來的信息就執行此處
}

如果有問題可以在評論中寫出,本人看到會進行解答。

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