该程序包含的内容如下:
- TCP服务器端程序,与客户端交互,将接收的数据存储到文件中
- 设置界面样式,包含读样式表文件设置样式
- 编码格式转换,显示中文不乱码
结合上次开发的客户端程序,测试结果如下:
程序开发记录
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);
}