Threaded Fortune Server-Qt4自带例子(网络通信)

/*功能描述:多线程TCP服务器*/
/*main实例化一个Dialog,在Dialog里实例化一个FortuneServer,重写FortuneServer虚函数incomingConnection (int socketDescriptor),在此函数里实例化线程fortunethread,开启,在线程的 run()里发送文件 */
/* QTcpServer类的虚函数incomingConnection (int socketDescriptor)是自动运行的。也可以通过写SIGNAL(newConnection())对应的槽完成相同的功能  */
//main.cpp================= #include <QApplication>
#include <QtCore> #include <stdlib.h> #include "dialog.h" int main(int argc, char *argv[]) QApplication app(argc, argv);
Dialog dialog;
dialog.show();
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));     /*获得随机种子*/
return dialog.exec();
}
// dialog.h================= #ifndef DIALOG_H
#define DIALOG_H #include <QDialog>
#include "fortuneserver.h"QT_BEGIN_NAMESPACE
class QLabel;
class QPushButton;
QT_END_NAMESPACE class Dialog : public QDialog Q_OBJECT public:
Dialog(QWidget *parent = 0); private:
QLabel *statusLabel;     /*声明一个指针*/
QPushButton *quitButton;
FortuneServer server;    /*声明一个FortuneServer实例server,需要加上此类的头文件。这样就可以在cpp里直接引用这个实例  */
}; #endif
//dialog.cpp ================ #include <QtGui>
#include <QtNetwork> #include <stdlib.h> #include "dialog.h"
#include "fortuneserver.h" Dialog::Dialog(QWidget *parent)
: QDialog(parent) statusLabel = new QLabel;
quitButton = new QPushButton(tr("Quit"));
quitButton->setAutoDefault(false); if (!server.listen()) {  /*这里直接就使用实例server ,没有new,也没在cpp里声明 */
QMessageBox::critical(this, tr("Threaded Fortune Server"),
tr("Unable to start the server: %1.")
.arg(server.errorString()));
close();
return;
} statusLabel->setText(tr("The server is running on port %1.\n"
"Run the Fortune Client example now.")
.arg(server.serverPort())); connect(quitButton, SIGNAL(clicked()), this, SLOT(close())); QHBoxLayout *buttonLayout = new QHBoxLayout;
buttonLayout->addStretch(1);
buttonLayout->addWidget(quitButton);
buttonLayout->addStretch(1); QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(statusLabel);
mainLayout->addLayout(buttonLayout);
setLayout(mainLayout); setWindowTitle(tr("Threaded Fortune Server"));
}
// fortuneserver.h ============== #ifndef FORTUNESERVER_H
#define FORTUNESERVER_H #include <QStringList>
#include <QTcpServer> //! [0]
class FortuneServer : public QTcpServer Q_OBJECT public:
FortuneServer(QObject *parent = 0); protected:
void incomingConnection(int socketDescriptor); private:
QStringList fortunes; //! [0] #endif
// fortuneserver.cpp=========== #include "fortuneserver.h"
#include "fortunethread.h" #include <stdlib.h> //! [0]
FortuneServer::FortuneServer(QObject *parent)
: QTcpServer(parent) fortunes << tr("You've been leading a dog's life. Stay off the furniture.")
<< tr("You've got to think about tomorrow.")
<< tr("You will be surprised by a loud noise.")
<< tr("You will feel hungry again in another hour.")
<< tr("You might have mail.")
<< tr("You cannot kill time without injuring eternity.")
<< tr("Computers are not intelligent. They only think they are."); //! [0] //! [1]
void FortuneServer::incomingConnection(int socketDescriptor)       /* 虚函数,当*/ QString fortune = fortunes.at(qrand() % fortunes.size());   /*在前面已经获得了随机种子 */
FortuneThread *thread = new FortuneThread(socketDescriptor, fortune, this);
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));   /*线程一结束,就删除*/
thread->start(); //! [1]//fortunethread.h ============= #ifndef FORTUNETHREAD_H
#define FORTUNETHREAD_H #include <QThread>
#include <QTcpSocket> //! [0]
class FortuneThread : public QThread Q_OBJECT public:
FortuneThread(int socketDescriptor, const QString &fortune, QObject *parent); void run(); signals:
void error(QTcpSocket::SocketError socketError); private:
int socketDescriptor;
QString text; //! [0] #endif
//fortunethread.cpp ======================== #include "fortunethread.h" #include <QtNetwork> //! [0]
FortuneThread::FortuneThread(int socketDescriptor, const QString &fortune, QObject *parent)
: QThread(parent), socketDescriptor(socketDescriptor), text(fortune) }
//! [0] //! [1]
void FortuneThread::run() QTcpSocket tcpSocket;
//! [1] //! [2]
if (!tcpSocket.setSocketDescriptor(socketDescriptor)) {
emit error(tcpSocket.error());
return; //! [2] //! [3] QByteArray block;       /*定制消息格式*/
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << (quint16)0;
out << text;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
//! [3] //! [4] tcpSocket.write(block);
tcpSocket.disconnectFromHost();
tcpSocket.waitForDisconnected(); //! [4]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值