Qt 搭建c/s框架总结
一 服务端
使用QTcpServer类
QTcpServer *tcpServer = new QTcpServer(this);
开启监听
tcpServer->listen(QHostAddress::LocalHost, port); //port为端口号
如果监听失败, 请查看tcpServer->errorString();
可以连接tcpServer对象的newConnection信号, 这样一有客户端连接上来, 就可以调用我们的连接槽进行处理
connect(tcpServer, SIGNAL(newConnection), this, SLOT(slotNewClientConnect()));
当断开监听时, 可以先判断单前是否在监听
tcpServer->isListening(), 若果是, 则调用tcpServer->close();关闭监听
当客户端连接上来的时候, 可以调用tcpServer->nextPendingConnection();来允许客户端连接, 并返回客户端的socket对象
可以对连接上来的socket对象进行信号-槽关联, 这样就可以对这个客户端的socket对象进行更多的控制
二 客户端
使用QTcpSocket对象连接到服务器
QTcpSocket *tcpSocket = new QTcpSocket(this);
tcpSocket->abort(); //取消已有的连接
tcpSocket->connectToHost(服务器ip, 服务器端口);
可以关联tcpSocket的error信号, 这样连接失败时候就可以得到通知了
可以关联tcpSocket的readyRead()信号, 这样接收到数据时候也可以得到通知了
同样connected()信号提示已成功连接到服务端
disconnected()信号提示已经断开连接, 可以关联到该对象的deleteLater()槽上删除连接(服务端)
这样, 只要得到通讯的socket对象, 关联一下readyRead()信号就可以读取连接端发送过来的数据, 写的话直接调用write方法即可
写数据发送可以用QByteArray和QDataStream进行操作:
QDataStream对象可以对QByteArray对象进行读写操作
比如:
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0); //要设置版本, 版本号要和接受端读取版本号一致
out << (quint16)0; //写要发送数据的长度, 这里先用0写前面两个字节占位, 后面再补上来
out << tr("发送的数据");
out.device()->seek(0); //又跳到缓冲区的开头, 准备些数据包的长度
out << (quint16)(block.size() - sizeof(quint16));
然后使用连接套接字对象 conObj->write(QByteArray对象); 这样就把数据发送出去了, 如
conObj->write(block);
读取连接端发送过来的数据
同样用QDataStream来处理:
QDataStream in(连接端套接字对象);
in.setVersion(QDataStream::Qt_4_0); //要和发送端的版本号一致
qint16 blockSize = 0; //初始化0
if(0 == blockSize)
{
if(conSocket->bytesAvailable() < (int)sizeof(quint16)) //如果已经接收到的数据小于2个字节,
{ //说明数据还没接收完,直接退出,等待数据接收完全
return;
}
in >> bIockSize; //保存数据包大小(两个字节)
}
if(conSocket->bytesAvailable() < blockSize)
{//接收到的数据不完全
return;
}
in >> message; //QString message; 把接收到的数据存放到message对象里面
这样就ok了
//取得本地ip地址信息
QString localHostName = QHostInfo::localHostName();
QHostInfo info = QHostInfo::fromName(localHostName);
qDebug() << "localHostName:" << localHostName << endl
<< "IP Address:" << info.addresses();