QT TCP简单的通信示例

TCP服务端:
第一步:创建监听套接字的QTcpSever

	QTcpServer *m_tsTcpServer;

第二部步:listen------监听是否有新的连接进来
int iMyport;如果有新的客户端连接的话,会触发信号newConnection(),定义一个槽函数接收连接好的套接字.

	//监听的端口号
	iMyport = iPort;
    //判断是否接收到了新的连接
    if(m_tsTcpServer->listen(QHostAddress::Any,iMyport))
    {
        connect(m_tsTcpServer,SIGNAL(newConnection()),this,SLOT(slotServerNewConnection()));
    }
    else
    {
        qDebug() << "server listen error";
    }

第三步:取出套接字
QTcpSocket *m_tsTcpSocket; 如果客户端有消息进来的话,会触发信号readyRead();断开连接的话会触发disconnected();

	//获得连接客户端的SOCKET套接字
    m_tsTcpSocket = m_tsTcpServer->nextPendingConnection();

    //获取对方的IP和端口
    QString sIp = m_tsTcpSocket->peerAddress().toString();
    quint16 sPort = m_tsTcpSocket->peerPort();
    qDebug() << sIp << sPort;

    connect(m_tsTcpSocket,SIGNAL(readyRead()),this,SLOT(slotServerReadData()));
    connect(m_tsTcpSocket, SIGNAL(disconnected()), this, SLOT(slotServerDisConnection()));

第四步:读取套接字的内容

	//从socket中读出数据
    QByteArray baArray = m_tsTcpSocket->readAll();
    QString sMsg = baArray;

到此服务端简单的通信搭建就完成了.
TCP客户端:
第一步:创建套接字,与服务端的IP地址和端口号连接.注:这里的端口号和上面服务端绑定的那个端口号是一样的,别搞错了.

	//连接服务端
    m_tsTcpSocket->connectToHost(sIP,iPort);
    //成功连接返回true,错误返回false
    if(m_tsTcpSocket->waitForConnected())
    {
        qDebug() << "connect success";
    }
    //成功连接会触发槽函数 如果在找在这个槽函数里写write的话只能写一次,所以可以等连接成功后自己把写的函数放在自己想要发送的模块
    //connect(m_tsTcpSocket,SIGNAL(connected()),this,SLOT(slotConnectedSuccess()));

第二步:连接成功后就可以直接向服务端发消息了.

	QString str;
	int iSize = m_tsTcpSocket->write(str.toUtf8().data());//返回字节的大小
    //等待write写完再写下一次的write
    if(!m_tsTcpSocket->waitForBytesWritten(50000))
    {
        return;
    }
    //判断发送是否成功
    if(iSize ==-1)
    {
        qDebug() << "write error";
        return;
    }

到此客户端的简单通信就搭建好了.
若要多次向服务端发消息,可以while循环或者是其他.在这里要注意如果要多次发消息的话,waitForBytesWritten()这个函数是必不可少的,不然多次的话可能通信会失败.

注:write()函数和被触发的读的readyRead()信号并不是一一对应的,比如可能你客户端write了三次,服务端那边的readyRead可能才被触发一次.
想要了解详细的原因可以自己再去了解.
同理服务端向客服端发消息的话直接发送就可,服务端要收消息的话也是直接读就好,因为连接已经成功了.
相信小聪明脑袋瓜的你能懂的.

补充:客户端主动断开服务的连接

void TcpClient::disConnectSever()
{
    //方式一
    m_tcpSocket->flush();
    m_tcpSocket->disconnectFromHost();
    
    //方式二
    m_tcpSocket->abort();
}

注:方式二abort与方式一的区别:abort中止当前连接并重置套接字。与disConnectFromHost()不同,该函数会立即关闭套接字,丢弃写缓冲区中的所有挂起数据。

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼2333号程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值