QTで1つのサービス側が2つのクライアントを受信する解決方法を実現する
6403 ワード
最近自分がQTを振り回す中でTCPサービス端を実現する過程で、従来の例はすべて点対点であることを発見して、つまり大部分は1つのクライアントで、1つのサービス端で、それから2つは通信を行って、1つのサービス端と複数のクライアントの通信に対して、非常に希少で、1つを見つけて、しかし私達の初心者にとって、少し複雑で、理解しにくいで、以下は1つの初心者でも理解できる1種の解決策を紹介します.
次はmainwindowです.h
次はmainです.cpp
次は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
, , 。