《Qt开发》TCP编程之服务器端程序

该程序包含的内容如下:

  1. TCP服务器端程序,与客户端交互,将接收的数据存储到文件中
  2. 设置界面样式,包含读样式表文件设置样式
  3. 编码格式转换,显示中文不乱码

结合上次开发的客户端程序,测试结果如下:

程序开发记录

1. 新建项目时要选择Network模块

2.在头文件中添加引用

#include <QtNetWork>

添加如下变量和函数

QTcpServer *tcpServer

QTcpSocket *clientConn; //建立连接后获取的套接字

void SetQss();

private slots:

void sendMsg();

void recvMsg();

void on_pBtnSend_clicked();

3. 在源文件中添加编码转换函数,这样plainTextEdit控件中正常显示中文

/*

有的文字中文是GBK的,转成QString

text = QTextCodec::codecForName("GBK")->toUnicode(ba);

有的文字中文是UTF8的,转成QString

text = QTextCodec::codecForName("UTF-8")->toUnicode(ba);

*/

QString GetCorrectUnicode(const QByteArray &ba)

{

QTextCodec::ConverterState state;

QTextCodec *codec = QTextCodec::codecForName("UTF-8");

    QString text = codec->toUnicode(ba.constData(), ba.size(), &state);

if (state.invalidChars > 0)

{

        text = QTextCodec::codecForName("GBK")->toUnicode(ba);

}

else

    {

        text = ba;

    }

return text;

}

4. 在构造函数中添加如下代码

SetQss();

tcpServer = new QTcpServer(this);

if (!tcpServer->listen(QHostAddress::AnyIPv4, 7589));

{

     qDebug() << tcpServer->errorString();

     close();

    

}

connect(tcpServer, SIGNAL(newConnection()), this, SLOT(sendMsg()));

5. 其他函数定义如下

//连接槽函数

void ServerEg::conn()

{

    QByteArray block;    //暂存要发送的数据

    QDataStream out(&block, QIODevice::WriteOnly); //使用数据流写入数据

    out.setVersion(QDataStream::Qt_4_6);

    //获取创建连接的子套接字

    clientConn = tcpServer->nextPendingConnection();

    connect(clientConn, SIGNAL(readyRead()), this, SLOT(recvMsg()));

    //connect(clientConn, SIGNAL(disconnected()), clientConn, SLOT(deleteLater()));

    connect(clientConn, SIGNAL(disconnected()), SLOT(deleteLater()));

    clientConn->write("Connected successfully!");

    ui.plainTextEdit->setPlainText("Connected successfully!");

}

//向客户端发送消息

void ServerEg::on_pBtnSend_clicked()

{

    QString string = ui.plainTextEdit->toPlainText();

    clientConn->write(string.toUtf8());

}

//接收客户端消息,并写入文件

void ServerEg::recvMsg()

{

    QByteArray recvByte = clientConn->readAll();

    QString recvStr = GetCorrectUnicode(recvByte);

    ui.plainTextEdit->appendPlainText(recvStr);

    //将收到的数据存储到文件

    QFile file("saveData.txt");

    if (!file.open(QIODevice::WriteOnly | QFile::Append))

        return;

    file.write(recvByte);

    file.close();

}

//读取样式表设置样式

void ServerEg::SetQss()

{

    QString strStyleSheet = "";

    QFile file("Config/StyleSheet.qss");

    file.open(QFile::ReadOnly);

    if (file.isOpen())

    {

        strStyleSheet = QLatin1String(file.readAll());

    }

    this->setStyleSheet(strStyleSheet);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不相信眼泪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值