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