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(); |
|