QTで1つのサービス側が2つのクライアントを受信する解決方法を実現する

6403 ワード

最近自分がQTを振り回す中でTCPサービス端を実現する過程で、従来の例はすべて点対点であることを発見して、つまり大部分は1つのクライアントで、1つのサービス端で、それから2つは通信を行って、1つのサービス端と複数のクライアントの通信に対して、非常に希少で、1つを見つけて、しかし私達の初心者にとって、少し複雑で、理解しにくいで、以下は1つの初心者でも理解できる1種の解決策を紹介します.
次はmainwindowです.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 
#include 

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_listen_clicked();

    void on_pushButton_send_clicked();

    void ClientReadData(/*int clientID,QString IP,int Port,QByteArray data*/);


    void server_New_Connect();

    void socket_Read_Data();

    void socket2_Read_Data();

    void socket_Disconnected();

private:
    Ui::MainWindow *ui;
    QTcpServer* server;
    QTcpSocket* socket;
    QTcpSocket* socket2;
};

#endif // MAINWINDOW_H

次はmainです.cpp
#include "mainwindow.h"
#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
次はmainwindowです.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
int Connect_Num=0;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->lineEdit_port->setText("5000");  //   
 //   ui->lineEdit_port_two->setText("1234");  //   
    ui->pushButton_send->setEnabled(false);

    server = new QTcpServer();
    connect(server,&QTcpServer::newConnection,this,&MainWindow::server_New_Connect);//     ,      
  //  connect(server,&QTcpServer::newConnection,this,&MainWindow::ClientReadData);
}//SIGNAL(ClientReadData(int,QString,int,QByteArray))

MainWindow::~MainWindow()
{
    server->close();
    server->deleteLater();
    delete ui;
}




void MainWindow::on_pushButton_listen_clicked()
{
    if(ui->pushButton_listen->text() == tr("  "))
    {
        //         
        int port = ui->lineEdit_port->text().toInt();
      //  int port1 = ui->lineEdit_port_two->text().toInt();

        //       
        if(!server->listen(QHostAddress::Any, port))
        {
            //   ,       
            qDebug()<errorString();
            return;
        }
     //   if(!server->listen(QHostAddress::Any, port1))
      //  {
            //   ,       
      //      qDebug()<errorString();
      ///      return;
      //  }
        //      
        ui->pushButton_listen->setText("    ");
        qDebug()<< "Listen succeessfully!";
    }
    else
    {
        //      (           , socket          ,   ——2017.9.30)
        if(socket->state() == QAbstractSocket::ConnectedState)
        {
            //    
            socket->disconnectFromHost();
        }
        //    
        server->close();
        //      
        ui->pushButton_listen->setText("  ");
        //      
        ui->pushButton_send->setEnabled(false);
    }
}

void MainWindow::on_pushButton_send_clicked()
{
    qDebug() << "Send: " << ui->textEdit_send->toPlainText();
    //         ASCII     
    socket->write(ui->textEdit_send->toPlainText().toLatin1());
    socket->flush();
}
void MainWindow::ClientReadData(/*int clientID,QString IP,int Port,QByteArray data*/)
{
    ui->textEdit_recv_two->setText("     ");

}
void MainWindow::server_New_Connect()//           
{
    ui->pushButton_send->setEnabled(true);//     
    //       
    Connect_Num++;
    if(Connect_Num==1)
    {
        socket = server->nextPendingConnection();//      
        QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);//            
        QObject::connect(socket, &QTcpSocket::disconnected, this, &MainWindow::socket_Disconnected);
        qDebug() << "A Client connect!";

    }
   // socket = server->nextPendingConnection();
    //  QTcpSocket    ,      
  //  QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);//            
   // QObject::connect(socket, &QTcpSocket::disconnected, this, &MainWindow::socket_Disconnected);
    //      
    if(Connect_Num==2)
    {
        socket2 = server->nextPendingConnection();//       
        QObject::connect(socket2, &QTcpSocket::readyRead, this, &MainWindow::socket2_Read_Data);//            
        QObject::connect(socket2, &QTcpSocket::disconnected, this, &MainWindow::socket_Disconnected);
        qDebug() << "B Client connect!";
    }
   // qDebug() << "A Client connect!";
}

void MainWindow::socket_Read_Data()
{
    QByteArray buffer;
    //       
    buffer = socket->readAll();
    if(!buffer.isEmpty())
    {
        QString str = ui->textEdit_recv->toPlainText();
        str+=tr(buffer);
        //    
        ui->textEdit_recv->setText(str);
    }
}

void MainWindow::socket2_Read_Data()
{
    QByteArray buffer;
    //       
    buffer = socket2->readAll();
    if(!buffer.isEmpty())
    {
        QString str = ui->textEdit_recv_two->toPlainText();
        str+=tr(buffer);
        //    
        ui->textEdit_recv_two->setText(str);
    }
}
void MainWindow::socket_Disconnected()
{
    //      
    ui->pushButton_send->setEnabled(false);
    qDebug() << "Disconnected!";
}
次はインタフェースファイル

server_New_Connect()  newConnection       ,                    ,       server_New_Connect()      +1,
             
Connect_Num=1          Connect_Num=2        
, , 。