intellij idea使用教程 ipv4 url replace syntax loam算法测试 directory upload signalr angularjs版本 后台管理系统模板 mac虚拟打印机 mysql降序 docker的安全特性有哪些 java多行注释 java常用的包 js基本数据类型有哪些 mysql查询 python操作mongodb python中get函数 javapackage java8函数式接口 java基础代码 java写入txt java8函数式编程 java字符比较 怎么装linux系统 java网络编程实例 win10长期服务版 win10计算器下载 java疯狂讲义 矩阵分析与应用 bz2解压 现代操作系统 天谕玲珑技能加点 贪吃蛇c语言代码 ps光照效果 汉仪旗黑字体下载 ps画笔颜色 思源字体打包
当前位置: 首页 > 学习教程  > 编程语言

QTcp编程

2020/12/5 10:59:42 文章标签:

服务器端: 服务器端有两个套接字—QTcpServer(监听套接字)、QTcpSocket(通信套接字) 。为实现QT环境下的网络编程首先应在“pro”工程文件中添加QT network ,如下图所示: 接着便可以着手编写服务端程序,首先在头文件中声明两个…

服务器端:

服务器端有两个套接字—QTcpServer(监听套接字)、QTcpSocket(通信套接字) 。为实现QT环境下的网络编程首先应在“pro”工程文件中添加QT  += network  ,如下图所示:

接着便可以着手编写服务端程序,首先在头文件中声明两个套接字,在服务器主函数中,使用监听套接字调用listen()函数。

    /*动态分配通信套接字**/
    tcpSocket = NULL ;
    /*动态分配监听套接字**/
    tcpServer = new QTcpServer(this) ;
    /*监听**/
    tcpServer->listen(QHostAddress::Any,8888) ;//第一个参数为系统默认,第二个参数为端口号
    /*设定窗口名称**/
    this->setWindowTitle("服务器:8888");

实现以上步骤之后服务器便会等待连接,当连接成功之后,对方的通信套接字会发送newConnection() 信号,当接到该信号之后服务器便建立通信套接字和对方的通信套接字进行通信。在通信过程中若对方成功发送信息,服务器会收到readyRead()信号,之后在相应的槽函数中实现传输数据的显示。具体代码如下所示:

     / *信号与槽:用以判断是否链接成功,若链接成功则建立好通信套接字**/
    connect(tcpServer,&QTcpServer::newConnection,
            [=]()
            {
               /*分配通信套接字的空间,注意该空间为监听套接字队列中的对象**/
               tcpSocket = tcpServer->nextPendingConnection() ;
               /*提供通信套接字的相关信息**/
               QString Ip = tcpSocket->peerAddress().toString() ;
               qint16 port = tcpSocket->peerPort() ;
               /*提示链接成功信息**/
               QString temp = QString("[%1:%2],成功链接!").arg(Ip).arg(port) ;
               ui->textEditRead->setText(temp);

               connect(tcpSocket,&QTcpSocket::readyRead,
                       [=]()
                       {
                           //从通信套接字中取出信息
                           QByteArray info = tcpSocket->readAll() ;
                           ui->textEditRead->append(info);
                       }
                       );
            }
            ) ;

以上步骤已经实现了通信连接和接受数据部分,因此接下来要实现发送数据部分,首先在UI界面中画一个按钮命名为Send 之后转到相应的槽函数编写一下代码:

void ServerWidget::on_ButtonSend_clicked()
{
    if(NULL == tcpSocket)
        return ;
    /*获取编辑框的信息**/
    QString str = ui->textEditRead->toPlainText() ;
    /*通信套接字发送信息**/
    tcpSocket->write(str.toUtf8().data()) ;
}

最后实现服务器端的断开连接,创建Close按钮,跳转槽函数。代码如下:

void ServerWidget::on_pushButton_2_clicked()
{
    if(NULL == tcpSocket)
        return ;
    /*断开连接**/
    tcpSocket->disconnectFromHost();
    /*关闭通信套接字**/
    tcpSocket->close();
}

服务器的UI布局如下图所示:

客户端:

客户端只涉及QTcpSocket(通信套接字),首先实现客户端与服务器连接,创建一个Connect按钮跳转槽,代码编写如下:

void Client::on_ButtonConnect_clicked()
{
    /*获取服务器信息**/
    QString IP = ui->lineEditIP->text(); // Ip地址
    qint16 port = ui->lineEditPort->text().toInt(); //端口号
    /*建立连接**/
    tcpSocket->connectToHost(QHostAddress(IP),port);
}

连接成功之后客户端的通信套接字会接受connected()信号以此来编写槽函数来提示用户连接成功:

connect(tcpSocket,&QTcpSocket::connected,
            [=]()
            {
               /*连接好之后打印提示字节**/
               ui->textEditRead->setText("连接成功!");
            }
            );

同样当连接成功之后,服务器像客户端传送数据会触发readyRead()信号,接受到该信号之后在相应的槽函数中实现数据显示:

connect(tcpSocket,&QTcpSocket::readyRead,
            [=]()
            {
               /*从信号套接字中取出信息**/
               QByteArray temp = tcpSocket->readAll() ;
               /*显示**/
               ui->textEditRead->append(temp);
            }
            ) ;

最后实现服务器断开连接,建立Close按钮,跳转槽函数:

void Client::on_ButtonClose_clicked()
{
    /*断开连接**/
    tcpSocket->disconnectFromHost();
    /*关闭**/
    tcpSocket->close();
}

客户端的UI界面如下所示:


本文链接: http://www.dtmao.cc/news_show_450358.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?