Qt Tcp服務器程序(可群發消息,定向IP發送消息)


1、用到的頭文件

#include<QTcpServer>
#include<QTcpSocket>
#include<QHostAddress>

  

2、pro文件添加 QT += network

 

3、創建QTcpSocket的子類,tcpClient,用於接收客戶端行為

 1 #ifndef CLIENT_H
 2 #define CLIENT_H
 3 
 4 #include<QTcpSocket>
 5 
 6 class Client : public QTcpSocket
 7 {
 8     Q_OBJECT
 9 public:
10     Client(QObject * parent = 0);
11 
12 protected slots:
13     void receiveData();     // signal readyRead() 觸發該槽
14     void slotClientDisconnected();      // signal disconnected() 觸發該槽
15 
16 signals:
17     void updateServer(QString);     // 該信號發送給tcpServer類
18     void clientDisconnected(qintptr);   // 該信號發送給tcpServer類
19 };
20 
21 #endif // CLIENT_H
View Code
 1 #include "tcpClient.h"
 2 
 3 Client::Client(QObject * parent):QTcpSocket(parent)
 4 {
 5     connect(this,&QTcpSocket::readyRead,this,&Client::receiveData);
 6     connect(this,&QTcpSocket::disconnected,this,&Client::slotClientDisconnected);
 7 
 8 }
 9 
10 void Client::receiveData()
11 {
12     QByteArray array = readAll();
13     QString msg = array;
14     emit updateServer(msg);
15 }
16 
17 void Client::slotClientDisconnected()
18 {
19     emit clientDisconnected(this->socketDescriptor());
20 }
View Code  
 
        

 4、創建QTcpServer的子類,tcpServer,用於更新客戶端連接、與tcpClient交互等等

 1 #ifndef SERVER_H
 2 #define SERVER_H
 3 
 4 #include<QTcpServer>
 5 #include<QTcpSocket>
 6 #include<QHostAddress>
 7 #include<QList>
 8 #include"tcpClient.h"
 9 
10 class Server : public QTcpServer
11 {
12     Q_OBJECT
13 public:
14     Server(QObject *parent = 0 ,QString IP = "" ,quint16 port = 0);
15     QTcpSocket * deleteSocket;
16     quint16 qlistCount();
17     void sendMessage(QByteArray msg, int i);
18 
19 protected:
20     void incomingConnection(qintptr socketDescriptor) override;     // 只要出現一個新的連接,就會自動調用這個函數
21     QList<QTcpSocket*>clientList;
22     Client * client;
23     QTcpSocket * temp;
24 
25 protected slots:
26     void slotUpdateServer(QString);     // signal來自tcpClient
27     void slotClientDisconnected(qintptr);   // signal來自tcpClient
28 signals:
29     void updateServer(QString);     // 該信號發送給文本框
30     void newClientInfo(QHostAddress clientAddress,quint16 port);    // 該信號發送給文本框
31     void deleteClient(QHostAddress clientAddress,quint16 port);     // 該信號發送給文本框
32 
33 private:
34 
35 
36 };
37 
38 #endif // SERVER_H
View Code
 1 #include "tcpServer.h"
 2 #include<QDebug>
 3 
 4 Server::Server(QObject *parent, QString IP ,quint16 port):QTcpServer(parent)
 5 {
 6     QHostAddress address(IP);
 7     this->listen(address,port);
 8 }
 9 
10 quint16 Server::qlistCount()
11 {
12     return clientList.count();
13 }
14 
15 void Server::sendMessage(QByteArray msg, int i)
16 {
17     temp = new QTcpSocket(this);
18     temp = clientList.at(i);
19     temp->write(msg);
20 }
21 
22 void Server::incomingConnection(qintptr socketDescriptor)
23 {
24     client = new Client(this);
25 
26     //將新創建的通信套接字描述符指定為參數socketdescriptor
27     client->setSocketDescriptor(socketDescriptor);
28 //    qDebug()<<socketDescriptor<<QString::fromLocal8Bit("連接");
29     // 將這個套接字加入客戶端套接字列表中
30     clientList.append(client);
31 
32     emit newClientInfo(client->peerAddress(),client->peerPort());
33 //    qDebug()<<client->peerAddress()<<client->peerPort();
34 
35 
36     connect(client,&Client::updateServer,this,&Server::slotUpdateServer);
37     connect(client,&Client::clientDisconnected,this,&Server::slotClientDisconnected);
38 }
39 
40 void Server::slotUpdateServer(QString msg)
41 {
42     // 將這個信號發送給文本框
43     emit updateServer(msg);
44 }
45 
46 void Server::slotClientDisconnected(qintptr socketDescriptor)
47 {
48     // 判斷斷開的客戶端,並將其從表中移除
49     for(int i = 0; i< clientList.count(); i++)
50     {
51         deleteSocket = clientList.at(i);
52         if(socketDescriptor == deleteSocket->socketDescriptor())
53         {
54             emit deleteClient(deleteSocket->peerAddress(),deleteSocket->peerPort());
55 //            qDebug()<<deleteSocket->peerAddress()<<deleteSocket->peerPort()
56 //                   <<QString::fromLocal8Bit("斷開");
57             clientList.removeAt(i);
58             return;
59         }
60     }
61 }
View Code

 

**注意

incomingConnection是虛函數,必須繼承重寫

 

5、創建一個管理類,tcp_Server,用於界面交互整合信息等等

界面:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM