#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
socket=new QTcpSocket(this); //给客户端指针实例化空间
//如果连接服务器成功,该客户端会发射一个connected信号
connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);
//客户端与服务器连接成功后,如果服务器向客户端发来数据,那么该客户端会自动发射一个readyRead信号
connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
//当客户端和服务器断开后,该客户端会发射一个disconnected信号
connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
}
Widget::~Widget()
{
delete ui;
}
//连接服务器按钮对应的槽函数
void Widget::on_pushButton_2_clicked()
{
//获取ui界面的信息
userName = ui->lineEdit_2->text();
QString hostName = ui->lineEdit_3->text();
quint16 port = ui->lineEdit_4->text().toUInt();
//连接服务器
socket->connectToHost(hostName,port);
}
void Widget::connected_slot()
{
QMessageBox::information(this,"成功","连接服务器成功");
QString msg = userName + ": 进入聊天室";
socket->write(msg.toLocal8Bit());
}
void Widget::readyRead_slot()
{
QByteArray msg = socket->readAll();
ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}
//发送消息
void Widget::on_pushButton_clicked()
{
//获取ui界面文本内容
QString m = ui->lineEdit->text();
QString msg = userName + ": " +m;
//将消息发送给服务器
socket->write(msg.toLocal8Bit());
ui->lineEdit->clear();
}
//断开服务器连接
void Widget::on_pushButton_3_clicked()
{
QString msg = userName+ ": 离开聊天室";
socket->write(msg.toLocal8Bit());
//断开客户端与服务器连接
socket->disconnectFromHost();
}
//当客户端和服务器断开连接之后,客户端会发送一个disconnected信号
void Widget::disconnected_slot()
{
QMessageBox::information(this,"推出","断开成功");
}
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
server = new QTcpServer(this); //给服务器指针实例化对象
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
//获取ui界面上的端口号
quint16 port = ui->lineEdit->text().toUInt();
//将服务器设置成被动监听状态
//bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
//参数1,要监听的主机地址
//参数2,通过指定的端口号访问服务器
if(!server->listen(QHostAddress::Any,port))
{
QMessageBox::critical(this,"失败","服务器启动失败");
return;
}
else {
QMessageBox::information(this,"成功","服务器启动成功");
}
//如果有客户端向服务器发来连接请求,该服务器会自动发射一个newconnection信号
connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);
}
//处理newconnection信号的漕函数的实现
void Widget::newConnection_slot()
{
qDebug()<<"有新的客户端发来连接请求了";
//获取最新连接的客户端套接字
QTcpSocket *s = server->nextPendingConnection();
//将获取的套接字存放到客户端中
clientList.push_back(s);
//如果该套接字有数据发送,那么该套接字会自动发射一个readyRead信号
connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}
//处理readyRead信号的漕函数的实现
void Widget::readyRead_slot()
{
//删除客户端链表中无效的客户端套接字
for(int i=0;i<clientList.count();i++)
{
//客户端状态,结果为0,未连接
if(clientList[i]->state()==0)
{
clientList.removeAt(i);
};
}
//遍历所以客户端,查看是那个客户端发来数据
for (int i=0;i<clientList.count();i++) {
//为0,无数据读
if(clientList[i]->bytesAvailable()!=0)
{
//读取数据
QByteArray msg=clientList[i]->readAll();
ui->listWidget->addItem(QString::fromLocal8Bit(msg));
for(int j=0;j<clientList.count();j++)
{
//将接收到的消息,发送给所有客户端
clientList[j]->write(msg);
}
};
}
}