QT中的简单TCP

一.服务端

首先,我们要在pro文件中加上一句:

QT       +=network

编译一下

然后这样创建好ui,并且将三个按钮转到槽

在父类中写上:

private:
    QTcpSocket *tcpSocket;//通信套接字

我们先写connect按钮点击的槽函数:

void ClienWdiget::on_buttonconnect_clicked()
{
    //获取服务器端口和IP
    QString ip=ui->lineEditIP->text();
    qint16 port=ui->lineEditPort->text().toInt();
    //主动和服务器建立链接
    tcpSocket->connectToHost(QHostAddress(ip),port);
}

一旦connectToHost链接成功,那么就会客户端的  newConnection信号(见下面的客户端代码)就会被触发

我们来看一下构造函数:

ClienWdiget::ClienWdiget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ClienWdiget)
{
    ui->setupUi(this);
    setWindowTitle("客户端");
    tcpSocket=NULL;
    tcpSocket=new QTcpSocket(this);
    connect(tcpSocket,&QTcpSocket::connected,//当链接成功的时候会触发connected信号
            [=]()
            {
                 ui->textEditRead->setText("链接成功");
            }
            );
    connect(tcpSocket,&QTcpSocket::readyRead,//对方发送消息成功后会自动触发这个信号
            [=]()
            {
                  //获取对方发送的内容
                  QByteArray array=tcpSocket->readAll();
                  //追加到编辑区
                  ui->textEditRead->append(array);
            }
            );

}

如果链接成功,就会触发connected这个信号,这个可以当作是判断是否链接成功的标志

如果和对方断开链接,自动触发disconnected信号

如果对方发送信息成功,就会触发readyRead信号

ui界面中的Text  Edit有一个属性readOnly:

选定之后这个文本框是只读,不能输入文本

二.客户端

private:
    QTcpServer *tcpServer;//监听套接字
    QTcpSocket *tcpSocket;//通信套接字

构造函数:

ServerWidget::ServerWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ServerWidget)
{
    ui->setupUi(this);
    setWindowTitle("服务端");
    tcpServer=NULL;
    tcpSocket=NULL;
    //动态分配空间
    //指定父对象,自动回收空间
    tcpServer=new QTcpServer(this);
    tcpServer->listen(QHostAddress::Any,8888);//任何IP地址,端口是8888
    connect(tcpServer,&QTcpServer::newConnection,//如果链接成功,就会自动触发newConnection信号
            [=]()
            {
                //取出建立好链接的套接字
                tcpSocket=tcpServer->nextPendingConnection();
                //获取对方的IP和端口
                QString ip=tcpSocket->peerAddress().toString();
                qint16 port=tcpSocket->peerPort();
                QString temp=QString("[%1:%2]:成功链接").arg(ip) .arg(port);
                ui->textEditRead->setText(temp);
                //如果对方发送信息成功,就会触发readRead
                connect(tcpSocket,&QTcpSocket::readyRead,
                        [=]()
                        {
                            //从通信套接字中取出内容
                            QByteArray array=tcpSocket->readAll();
                            ui->textEditRead->append(array);
                        }
                        );
            }
            );
}

效果图:

猜你喜欢

转载自blog.csdn.net/scwMason/article/details/81148433
今日推荐