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

来源:互联网 发布:没有网络安装网卡驱动 编辑:程序博客网 时间:2024/05/16 12:56
/*功能描述:多线程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_NAMESPACEclass 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]

原创粉丝点击