使用qt实现tcp之间的通信
ser
#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()
{
//获取服务器端口号
quint16 port =ui->lineEdit->text().toUInt();
//将服务器设置成监听状态
if(server->listen(QHostAddress::Any,port))
{
QMessageBox::information(this,"成功","打开服务器成功");
}
else {
QMessageBox::information(this,"失败","打开服务器失败");
}
connect(server,&QTcpServer::newConnection,this,&Widget::newconnect_slot);
}
void Widget::newconnect_slot()
{
QTcpSocket *s=server->nextPendingConnection();
//将该套接字放入到套接字文件中
clientVector.push_back(s);
connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}
void Widget::readyRead_slot()
{
//删除无效客户端
for(int i=0;i<clientVector.size();i++)
{
if(clientVector[i]->state()==0)
{
//删除
clientVector.removeAt(i);
}
}
for(int i=0;i<clientVector.size();i++)
{
if(clientVector[i]->bytesAvailable()!=0)
{
QByteArray msg=clientVector[i]->readAll();
ui->listWidget->addItem(QString::fromLocal8Bit(msg));
for(int j=0;j<clientVector.size();j++)
{
clientVector[j]->write(msg);
}
}
}
}
cli
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//实例化一个客户端
socket= new QTcpSocket(this);
connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);
connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}
Widget::~Widget()
{
delete ui;
}
//连接服务器按钮所对应的槽
void Widget::on_pushButton_2_clicked()
{
//获取ui界面上的主机地址和端口号
// QString ip=;
// quint8 port=ui->PORT->text().toUINt();
if(ui->pushButton_2->text()=="连接服务器")
{
socket->connectToHost(ui->IP->text(),ui->PORT->text().toUInt());
ui->pushButton_2->setText("断开服务器");
}
else {
QString msg=username +":进入聊天室";
//socket->write(msg.)
//断开服务器
socket->disconnectFromHost();
ui->pushButton_2->setText("连接服务器");
}
}
//处理connected信号的槽函数定义
void Widget::connected_slot()
{
QMessageBox::information(this,"成功","连接服务器成功");
//顺便给服务器发送"***进入聊天室"
QString msg=username +":进入聊天室";
socket->write(msg.toLocal8Bit());
}
//有关readyRead信号对应的槽函数
void Widget::readyRead_slot()
{
//判断当前客户端是否有数据
if(socket->bytesAvailable()!=0)
{
//读取当前客户端的数据
QString msg = QString::fromLocal8Bit(socket->readAll());
//将数据展示到ui界面上
ui->listWidget->addItem(msg);
}
}
//发送按钮对应的槽函数
void Widget::on_pushButton_clicked()
{
QString msg=ui->lineEdit->text();
socket->write(msg.toLocal8Bit());
ui->lineEdit->clear();
}