1. 程式人生 > >qt TCP網路程式設計與聊天室的實現

qt TCP網路程式設計與聊天室的實現

先看執行效果:

首先啟動伺服器:使用者後臺資料捕獲


之後登陸A使用者(假設要給B使用者發訊息):

輸入接受/傳送方AB,然後連線服務,類似登陸

也可以只輸入傳送方,即自身name,接收方隨時可以更改,但發訊息時,必須指定接收方是誰


之後登陸B(假設要與A通訊)

輸入接受/傳送方AB,然後連線服務,類似登陸


然後就可以輸入訊息,收發資料了

下載地址:

首先在pro中新增network

QT裡, tcp程式設計需用到兩個類: QTcpServer, QtcpSocket

服務端:

  //1.  建立一個QTcpServer物件
        QTcpServer *server = new QTcpServer;
        //2. 呼叫物件的listen函式成員進行繫結地址與埠號, 
        //並監聽埠,繫結埠號6666, 成功返回true, 失敗返回false
        server->listen(QHostAddress::Any, 6666);
        // 3.  當有客戶端連線時,物件會發出newConnection訊號,
        //客戶端的連線處理就在觸發的槽函式new_client裡處理了。
        connect(server, SIGNAL(newConnection()), this, SLOT(new_client()));  
        // 4. 在new_client裡處理連線. 每個客戶端連線上來後,
        //在伺服器端就會有一個QTcpSocket物件,
        //QTcpSocket物件在伺服器端用於與客戶端通訊使用,
        //如多個客戶端連線上來,則會有多個QTcpSocket物件.
        QTcpSocket *client;
        //處理客戶端連線,呼叫此處理函式後,
        //會得到一個QTcpSocket物件的地址,
        //此物件專用於這個連線上來的客戶端通訊使用。
        client = server->nextPendingConnection();        
        //5.連線訊號,做相應的處理       
        //當客戶端發資料到伺服器端時,它會發出訊號readyRead, 通知接收客戶端的資料. 
        // tcp_read槽函式用於接收客戶端的資料, 在槽函式裡呼叫QTcpSocket物件的read函式即可.
        connect(client, SIGNAL(readyRead()), this, SLOT(tcp_read()));  
        //當客戶端斷開連線時,會發出disconnected訊號,通知客戶端已斷線.
        // lost_client槽函式用於處理客戶端斷開連線
        connect(client, SIGNAL(disconnected()), this, SLOT(lost_client())); 

客戶端:

 // 1. 建立QTcpSocket物件
        QTcpSocket *tcp = new QtcpSocket;
        // 2. 連線伺服器端的IP地址與埠號, 
        //連線成功會發出connected訊號。
        //也可以直接呼叫waitForConnected等待連線的結果。 
        tcp->connectToHost("192.168.250.250", 9999); 
        // 3. 呼叫物件的read/write函式即可與伺服器端進行收發資料了。
        //當伺服器端有發資料過來時,會發出readyRead訊號,在連線此訊號的槽函式裡接收資料即可.