作业:Qt中的TCP通信
server:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
,server(new QTcpServer(this))
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_startbtn_clicked()
{
//将行编辑器里面的字符串转化为整型
quint16 port = ui->portedit->text().toUInt();
//启动服务器
if(server->listen(QHostAddress::Any,port))
{
QMessageBox::information(this,"","start successfully!");
ui->startbtn->setEnabled(false);
}
else
{
QMessageBox::information(this,"","start failed!");
return;
}
//监听成功,准备处理客户端的链接请求
//服务器会自动发送一个newConnection信号
connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);
}
void Widget::newConnection_slot()
{
qInfo() << "a new client connected......";
//获取最新连接客户端的套接字
QTcpSocket *socket = server->nextPendingConnection();
//将客户端放入客户端容器中
clientlist.push_back(socket);//push_back 尾插
//客户端和服务器成功建立连接 准备处理客户端发送的服务器
//客户端会发送一个readyRead信号
connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}
void Widget::readyRead_slot()
{
//读取客户端的数据
//遍历客户端容器 移除无效的客户端
//count()表示容器中元素的个数
for(int i=0;i<clientlist.count();i++)
{
//判断客户端和服务器的状态
if(clientlist.at(i)->state()==0)
{
//移除无效客户端
clientlist.removeAt(i);
}
}
//遍历客户端容器,判断哪个客户端有数据待读
for(int i=0;i<clientlist.count();i++)
{
if(clientlist.at(i)->bytesAvailable())
{
//读取数据
QByteArray clientmsg = clientlist.at(i)->readAll();
ui->listWidget->addItem(QString::fromLocal8Bit(clientmsg));
//将数据广播给所有客户端
for(int j=0;j<clientlist.count();j++)
{
clientlist.at(j)->write(clientmsg);
}
}
}
}
client:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
,client(new QTcpSocket(this))
{
ui->setupUi(this);
connect(client,&QTcpSocket::connected,this,&Widget::connected_slot);
connect(client,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
connect(client,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
ui->msgedit->setEnabled(false);
ui->sendbtn->setEnabled(false);
ui->disconnectbtn->setEnabled(false);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_connectbtn_clicked()
{
//让客户端连接服务器
QString ip = ui->ipedit->text();
quint16 port = ui->portedit->text().toUInt();
//client->connectToHost(ip,port);
client->connectToHost(QHostAddress(ip),port);
}
void Widget::connected_slot()
{
//qDebug() << "8888888";
username = ui->usernameedit->text();
QString loginmsg = username + ":login";
//将loginmsg发给服务器
client->write(loginmsg.toLocal8Bit());
ui->msgedit->setEnabled(true);
ui->sendbtn->setEnabled(true);
ui->disconnectbtn->setEnabled(true);
ui->usernameedit->setEnabled(false);
ui->ipedit->setEnabled(false);
ui->portedit->setEnabled(false);
ui->connectbtn->setEnabled(false);
}
void Widget::on_sendbtn_clicked()
{
//获取msgedit中的内容
QString msg = username + ":" + ui->msgedit->text();
//将信息发给服务器
client->write(msg.toLocal8Bit());
//清空
ui->msgedit->clear();
}
void Widget::disconnected_slot()
{
QMessageBox::information(this,"","disconnect successfully");
ui->msgedit->setEnabled(false);
ui->sendbtn->setEnabled(false);
ui->disconnectbtn->setEnabled(false);
ui->usernameedit->setEnabled(true);
ui->ipedit->setEnabled(true);
ui->portedit->setEnabled(true);
ui->connectbtn->setEnabled(true);
}
void Widget::readyRead_slot()
{
QByteArray servermsg = client->readAll();
QStringList splitList = QString::fromLocal8Bit(servermsg).split(":");
if(splitList.first()==username)
{
QListWidgetItem *item = new QListWidgetItem(QString::fromLocal8Bit(servermsg));
item->setTextAlignment(Qt::AlignRight);
ui->listWidget->addItem(item);
}
else
{
ui->listWidget->addItem(QString::fromLocal8Bit(servermsg));
}
}
void Widget::on_disconnectbtn_clicked()
{
QString disconnectmsg = username + "left...";
client->write(disconnectmsg.toLocal8Bit());
client->disconnectFromHost();
}