Qt - 基于GUI和线程的多客户端套接字编程

时间:2017-04-14 02:40:21

标签: multithreading qt sockets user-interface

我正在使用gui实现以下链接:

http://www.bogotobogo.com/Qt/Qt5_QTcpServer_Multithreaded_Client_Server.php

我的代码与上面的链接相同。

我知道这是不可能的:

composer install --no-scripts

所以我刚刚创建了:

class MainWindow : public QMainWindow , public QTcpServer

//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "myserver.h"


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

并修改了

//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    ms->StartServer();
    connect(this,SIGNAL(SendCommand(QString)),ms,SLOT(GetCommand(QString)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

正如我所说,我有一个服务器和几个客户端由线程处理。我想以某种方式将我的GUI连接到MyThread中的套接字。 我需要的是当我在文本框中写一些文本并按下主窗口中的按钮时,它会转到套接字并将响应返回到另一个文本框。

我已经塞了,但我不明白怎么做。

1 个答案:

答案 0 :(得分:0)

为什么不创建一个新信号,该信号将在on_pushButton_clicked()中发出,并将您的数据从 MainWindow 文本字段发布到特定线程,然后将其写入插座?接收可以以相同的方式进行组织。

如果您在MyServer类构造函数中创建MainWindow对象,则可以更改MyServer构造函数,添加:

 MyServer(MainWindow* parent)
 {
      //Save parent somewhere inside the class
      my_parent = parent;
 }

void MyServer::incomingConnection(qintptr socketDescriptor)
{
   // We have a new connection
   qDebug() << socketDescriptor << " Connecting...";

   // Every new connection will be run in a newly created thread
   MyThread *thread = new MyThread(socketDescriptor, this);

   // connect signal/slot
   // once a thread is not needed, it will be beleted later
   connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));

   thread->start();

   QObject::connect(my_parent, &MainWindow::myNewSendigQStrigSignal, thread, &MyThreadClass::slotNewMsg);
}

on_pushButton_clicked的实现看起来像那样

 MainWindow::on_pushButton_clicked()
 {
     QString data = getDataFromTextField();
     emit myNewSendigQstrigSignal(data);
 }