以下是修改后的代码:
=========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
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->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 } QStringList usersList;
for(int i=0;i < userList.size(); ++i) emit updateUsers(usersList);
} serverUI::~serverUI() { }
===========serverui.h================
#include QT_BEGIN_NAMESPACE
namespace Ui { }
QT_END_NAMESPACE class User {
public: }; class serverUI : public QWidget { public: private: signals: private slots: };
========clientuimain.cpp============
#include int main(int argc, char *argv[]) { }
=========serveruimain.cpp==============
#include int main(int argc, char *argv[]) {
QApplication app(argc, argv); serverUI s; QObject::connect( s.show(); return app.exec();
} if(userList[i].socket == socket) {
userList.removeAt(i);
break;
}
{
QHostAddress address=userList[i].socket->peerAddress();
quint16 port=userList[i].socket->peerPort();
QString username=
address.toString()+":"+QString::number(port);
usersList << username;
}
delete ui;
class serverUI;
QTcpSocket* socket;
Q_OBJECT
explicit serverUI(QWidget *parent = nullptr);
~serverUI() override;
Ui::serverUI *ui;
QTcpServer *server;
QList<User> userList;
void updateUsers(QStringList users);
void senddata();
void bind();
void new_client();
void read_data();
QString getLocalIp(); //获取本机 IP
void on_Button_disconnect_clicked();
QApplication a(argc, argv);
clientUI w;
w.show();
return a.exec();
&s,
SIGNAL(updateUsers(QStringList)),
s.ui->users,
SLOT(setPlainText(QString)));