ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Qt网络程序:基于TCP的服务器、客户端实例

2019-06-23 10:50:05  阅读:288  来源: 互联网

标签:tcpSocket Qt TCP ui QTcpSocket 服务器 接字 连接 客户端


首先我们需要设置服务器: 
项目文件中加入:QT += network 
相关头文件:

#include<QTcpServer>//监听套接字
#include<QTcpSocket>//建立连接的通信套接字
1
2
在头文件中,定义套接字:

    QTcpServer *tcpServer;//监听套接字
    QTcpSocket *tcpSocket;//通信套接字
1
2
随后,在cpp文件中初始化:

    //初始化套接字
    tcpServer = NULL;
    tcpSocket = NULL;
    //监听套接字,指定父对象自动回收空间
    tcpServer = new QTcpServer(this);
    //设定端口
    tcpServer->listen(QHostAddress::Any,8888);
1
2
3
4
5
6
7
当新连接建立时,监听套接字会自动触发信号:newConnection ,读取到数据之后,通信套接字会触发信号readyRead,因此,我们可以通过信号槽机制进行操作,这里嵌套了两个Qt5的Lambda表达式:

//新连接建立的信号槽
connect(tcpServer,&QTcpServer::newConnection,[=]()
    {
    //取出建立好连接的套接字
        tcpSocket = tcpServer->nextPendingConnection();
    //获取对方的IP和端口
    QString ip = tcpSocket->peerAddress().toString();
    qint16 port = tcpSocket->peerPort();
    //将信息显示到UI
    QString temp = QString("[%1:%2]:成功连接").arg(ip).arg(port);
    ui->textEditRead->setText(temp);  
     //连接建立后,读取到数据的信号槽
    connect(tcpSocket,&QTcpSocket::readyRead,
            [=]()
            {
             //从通信套接字取出内容
             QByteArray array = tcpSocket->readAll();
             //显示到UI
             ui->textEditRead->append(array);
            } );
    });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
客户端的设置与服务器类似,只不过少了一个监听套接字: 
头文件中定义套接字:QTcpSocket * tcpSocket;//通信套接字 
cpp文件初始化套接字:

    //初始化套接字
    tcpSocket = NULL;
    //分配空间,指定父对象
    tcpSocket = new QTcpSocket(this);
1
2
3
4
信号槽与服务器类似,这里的Lambda表达式没有嵌套:

 //获取服务器IP和端口
    QString ip = ui->lineEditIP->text();
    qint16 port = ui->lineEditPort->text().toInt();
    //主动连接服务器
    tcpSocket->connectToHost(QHostAddress(ip),port);
 //建立连接的信号槽
    connect(tcpSocket,&QTcpSocket::connected,
            [=]()
            {
                 ui->textEditRead->setText("恭喜,成功连接服务器!");
            }
            );
    //连接建立后收到服务器数据的信号槽
    connect(tcpSocket,&QTcpSocket::readyRead,
            [=]()
           {
         //获取对方发送的内容
        QByteArray array = tcpSocket->readAll();
        //显示到编辑框
        ui->textEditRead->append(array);//append,添加内容
            } 
//发送数据  
   //获取编辑框内容
    QString str = ui->textEditWrite->toPlainText();
     //发送数据
     tcpSocket->write( str.toUtf8().data() );
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
关于断开连接: 
1、disconnectFromHost() 
尝试关闭套接字。如果有等待写入的挂起数据,qabstracksocket将进入关闭状态,并等待所有数据写入完毕。最终,它将进入未连接状态并发出disconnected()信号。 
2、​abort() 
中止当前连接并重置套接字。与disconnectFromHost ( )不同,此函数会立即关闭套接字,丢弃写入缓冲区中的所有挂起数据。 
3、close() 
关闭套接字的I / O设备,断开套接字与主机的连接,关闭套接字,并重置名称、地址、端口号和基础套接字描述符。

效果如图,连接建立后服务器与客户端相互发送数据: 

Demo下载地址: 
链接:https://pan.baidu.com/s/12pGsDS-NlKke7a5SlpBqLQ 密码:eesc

如果阅读本篇博客有障碍,可参考网络编程基础知识: 
可以参考https://blog.csdn.net/qq_40194498/article/details/78901089 
https://blog.csdn.net/qq_40194498/article/details/78934426

原文:https://blog.csdn.net/qq_40194498/article/details/79710824 
 

标签:tcpSocket,Qt,TCP,ui,QTcpSocket,服务器,接字,连接,客户端
来源: https://blog.csdn.net/u011555996/article/details/93378635

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有