QT开发中文网

将以下client端和server端的代码修改为多线程并能管理用户列表的代码,并生成相应的client端Qt5的clientui.ui代码和server端Qt5的serverui.ui代码: ==============clientui.cpp=============== #include "clientui.h" #include "ui_clientui.h" clientui::clientui(QWidget *parent) :

以下是修改后的代码:

=========clientui.cpp============== #include “clientui.h” #include “ui_clientui.h”

clientUI::clientUI(QWidget *parent) :

    QWidget(parent), ui(new Ui::clientUI) {
ui->setupUi(this);
client = new QTcpSocket(this);

ui->Button_send->setEnabled(false);
/* 连接服务器 */
connect(ui->Button_connection,&QPushButton::released,this, [=]() {
    client->connectToHost(ui->lineEdit_ip->text(),ui->lineEdit_d->text().toInt());
});
/* 连接成功 */
connect(client,&QTcpSocket::connected,this, [&]() {
    ui->Button_send->setEnabled(true);
    ui->label_prompt->setText("已连接");
    ui->textEdit_receive->append("连接成功……");
});
/* 发送到服务器 */
connect(ui->Button_send,&QPushButton::released,this, [&]() {
    QString data = ui->textEdit_edit->toPlainText();
    if(data.length() > 0) {//如果输入框不为空才可以发送
        client->write(data.toUtf8());
        QString data1 = "已发送:"+data;
        ui->textEdit_receive->append(data1);
        ui->textEdit_edit->setText("");
    } else {
        ui->textEdit_receive->append("输入信息");
    }
});
/* 接收信息 */
connect(client,&QTcpSocket::readyRead,this, [&]() {
    QString msg = "收到:" + client ->readAll();
    ui -> textEdit_receive -> append(msg);
});
/* 断开连接 */
connect(ui -> Button_disconnect, &QPushButton::released, this, [=]() {
    client -> disconnectFromHost();
    for (int i = 0; i < userList.size(); ++i) {
        if (userList[i].socket == client) {
            userList.removeAt(i);
            break;
        }
    }
    ui -> Button_send -> setEnabled(false);
});
/* 断开连接 */
connect(client,&QTcpSocket::disconnected,this, [&]() {
    ui->label_prompt->setText("待连接……");
    ui->textEdit_receive->append("断开连接……");
});

}

clientUI::~clientUI() {

delete ui;

}

=========clientui.h============== #include #include #include

QT_BEGIN_NAMESPACE namespace Ui { class clientUI; } QT_END_NAMESPACE

class User { public:

QTcpSocket* socket;

};

class clientUI : public QWidget {

Q_OBJECT

public:

explicit clientUI(QWidget *parent = nullptr);

~clientUI() override;

private:

Ui::clientUI *ui;
QTcpSocket *client;
QList<User> userList;

signals: void updateUsers(QStringList users); }; =========serverui.cpp============ #include “serverui.h” #include “ui_serverUI.h” #include

serverUI::serverUI(QWidget *parent ) :

    QWidget(parent),
    ui(new Ui::serverUI) {
ui->setupUi(this);
ui->Button_send->setEnabled(false);
QString localeIp = getLocalIp();

// qDebug() << “—IP地址:” << localeIp;

setWindowTitle(windowTitle() + "---IP地址:" + localeIp);

server = new QTcpServer(this);

connect(ui->Btbind,&QPushButton::released,this,&serverUI::bind);

 /* 发送信息 */
 connect(ui->Button_send,&QPushButton::released,this,&serverUI::senddata);

}

// 窗口点击事件 void serverUI::senddata() {

QString data = ui->textEdit_edit->toPlainText();
if(data.length() > 0) {   //如果输入栏不为空才可以发送
    socket->write(data.toUtf8());
    QString data1 = "已发送:" + data;
    ui->textEdit_log->append(data1);
    ui->textEdit_edit->setText("");
}
else {
    ui->textEdit_log->append("输入信息");
}

}

void serverUI::bind() {

int port = ui -> lineEdit_d -> text().toInt();
if(port > 0) {   //如果输入栏不为空才可以发送
    /* 绑定绑定信息 */
     server -> listen(QHostAddress::Any, port);
     ui -> label_prompt -> setText("已启动");
     ui -> textEdit_log -> append("服务器启动成功");
     ui -> Btbind -> setEnabled(false);
     ui -> lineEdit_d -> setReadOnly(true);
 }
 else {
     ui -> textEdit_log -> append("输入端口信息");
 }

} // /* 等待连接 */ void serverUI::new_client() {

QTcpSocket *socket = server->nextPendingConnection();

 User user;
 user.socket = socket;

 userList.append(user);

 QStringList usersList;
 for (int i = 0; i < userList.size(); ++i) {
         QHostAddress address = userList[i].socket->peerAddress();
         quint16 port       = userList[i].socket->peerPort();

         QString username =
             address.toString() + ":" + QString::number(port);

         usersList << username;
     }

 emit updateUsers(usersList);

  connect(socket,&QTcpSocket::readyRead,this,&serverUI::read_data);
  connect(ui-&gt;Button_disconnect,&QPushButton::released,socket,&QTcpSocket::disconnectFromHost);
  connect(socket,&QTcpSocket::disconnected,this, [&]() {
          ui->textEdit_log->append("停止服务");
      });

}

// /* 接收信息 */ void serverUI::read_data() { //

QTcpSocket *obj = (QTcpSocket*)sender();
QString msg = "收到:" + obj -> readAll();
ui -> textEdit_log -> append(msg);

}

QString serverUI::getLocalIp(){

QString hostName = QHostInfo::localHostName();
QHostInfo hostInfo = QHostInfo::fromName(hostName);
ui->plainTextEdit->appendPlainText("本机名称:" + hostName);

// qDebug() << “Local Host Name:” << hostName;

QString locaIp = "null Qstring";
QList<QHostAddress> list = hostInfo.addresses();

if (list.empty())
    return locaIp;
foreach (QHostAddress addr, list) {
    if (addr.protocol() == QAbstractSocket::IPv4Protocol) {
        locaIp = addr.toString();
        break;
    }
}
return locaIp;

}

/* 断开连接 */ void serverUI::on_Button_disconnect_clicked() { ui->textEdit_log->append(“断开连接”); socket -> disconnectFromHost();

for (int i=0; i

   if(userList[i].socket == socket) {
       userList.removeAt(i);
       break;
   }

}

QStringList usersList; for(int i=0;i < userList.size(); ++i)

 {
     QHostAddress address=userList[i].socket->peerAddress();
     quint16 port=userList[i].socket->peerPort();

     QString username=
         address.toString()+":"+QString::number(port);

     usersList << username;
 }

emit updateUsers(usersList); }

serverUI::~serverUI() {

delete ui;

} ===========serverui.h================ #include #include #include #include #include

QT_BEGIN_NAMESPACE namespace Ui {

class serverUI;

} QT_END_NAMESPACE

class User { public:

QTcpSocket* socket;

};

class serverUI : public QWidget {

Q_OBJECT

public:

explicit serverUI(QWidget *parent = nullptr);
~serverUI() override;

private:

 Ui::serverUI *ui;
 QTcpServer *server;
 QList<User> userList;

signals:

 void updateUsers(QStringList users);

private slots:

 void senddata();
 void bind();
 void new_client();
 void read_data();
 QString getLocalIp();      //获取本机 IP
 void on_Button_disconnect_clicked();

}; ========clientuimain.cpp============ #include #include “clientui.h” #include “ui_clientui.h”

int main(int argc, char *argv[]) {

QApplication a(argc, argv);
clientUI w;
w.show();
return a.exec();

} =========serveruimain.cpp============== #include #include “serverui.h” #include “ui_serverui.h”

int main(int argc, char *argv[]) { QApplication app(argc, argv);

serverUI s;

QObject::connect(

  &s,
  SIGNAL(updateUsers(QStringList)),
  s.ui->users,
  SLOT(setPlainText(QString)));

s.show();

return app.exec(); }

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=2433

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?