QT下的TCP通信过程
Qt中提供的所有的Socket类都是非阻塞的。
Qt中常用的用于socket通信的套接字类:
1、QTcpServer 用于TCP/IP通信, 作为服务器端套接字使用
2、QTcpSocket 用于TCP/IP通信,作为客户端套接字使用。
3、QUdpSocket 用于UDP通信,服务器,客户端均使用此套接字。
一、建立一个客户端 5步
1分别是创建套接字对象(QTcpSocket类)
2连接服务器(connectToHost()函数),
3向服务器发送数据(write()函数),
4读取缓冲区数据(Net_readData()函数),
5断开与服务器连接(disconnectFromHost()函数)。
//1、创建一个SOCK连接
m_sockClientFd = new QTcpSocket;
//2、连接服务器
m_sockClientFd>connectToHost(g_NetInfot.ipBuf,g_NetInfot.portBuf.toInt(0,10),QTcpSocket::ReadWrite);
if(!m_sockClientFd->waitForConnected(10000))
{
qDebug()<<"等待超过10s,请重新连接.....";
m_CurCLientConnectStatus = CLLIENT_CONNSTATUS_FAILED;
continue;
}
else
{
m_CurCLientConnectStatus = CLLIENT_CONNSTATUS_SUCCEE;
qDebug()<<"连接服务器成功.....";
}
//3、向服务器发送数据
int ret = m_sockClientFd->write(m_writeStr.toLocal8Bit().data());
bool Boolflush = m_sockClientFd->flush();//检测是否写入成功
if(ret != -1 && Boolflush == 1)
{
qDebug()<<"Client 写入数据成功.....";
}
//4、读取缓冲区数据
connect(m_sockClientFd,SIGNAL(readyRead()),this,SLOT(Net_readData()));
//5关闭sock,类似close
connect(m_sockClientFd, SIGNAL(disconnected()), this, SLOT(socket_Disconnected()));
二、服务端
/*
服务端的编写主要分为五个步骤
1、分别是创建套接字对象(QTcpSocket类)
//1、创建一个SOCK连接,注意跟客户端创建sock类不一样
m_sockServerFd = new QTcpServer();
m_socket = new QTcpSocket();
2、侦听端口(listen)
if(!m_sockServerFd->listen(QHostAddress::Any, g_NetInfot.portBuf.toInt(0,10)))
{
//若出错,则输出错误信息
qDebug()<<m_sockServerFd->errorString();
continue;
}
else
{
qDebug()<<"listen success:"<<m_sockServerFd;
}
3、当服务器被客户端访问时newConnection
connect(m_sockServerFd, SIGNAL(newConnection()), this, SLOT(m_acceptConnection()));
4、//读取数据
connect(m_socket,SIGNAL(readyRead()),this,SLOT(m_receiveData()));
//5、向服务器发送数据
int ret = m_socket->write(m_writeStr.toLocal8Bit().data());
6、取消侦听(close()函数)
//主动和客户端断开连接
m_socket->disconnectFromHost();
m_socket->close();
m_socket = NULL;
*/
三、Udp通讯
客户端发送
1)、发送端流程
//1.建立socket
m_sockUdpFd = new QUdpSocket(this);
//2、bin绑定IP 端口
m_sockUdpFd->bind(g_NetInfot.portBuf.toInt(0,10),QUdpSocket::ShareAddress);
//3、读取缓冲区,接收数据
connect(m_sockUdpFd,&QUdpSocket::readyRead,this,&UDP::m_acceptConnection);
//4、发送消息
m_sockUdpFd->writeDatagram(m_writeStr.toLocal8Bit().data(),QHostAddress::Broadcast,123);