fortune client
2013-11-30 01:43
78 查看
代码摘自于网络:
//client.h
#ifndef CLIENT_H
#define CLIENT_H
#include <QDialog>
#include <QTcpSocket>
QT_BEGIN_NAMESPACE
class QDialogButtonBox;
class QLabel;
class QLineEdit;
class QPushButton;
class QTcpSocket;
class QTextEdit;
QT_END_NAMESPACE
//! [0]
class Client : public QDialog
{
Q_OBJECT
public:
Client(QWidget *parent = 0);
private slots:
void requestNewFortune();
void readFortune();
void displayError(QAbstractSocket::SocketError socketError);
void enableGetFortuneButton();
private:
QLabel *hostLabel;
QLabel *portLabel;
QLineEdit *hostLineEdit;
QLineEdit *portLineEdit;
QTextEdit *textEdit;
QPushButton *getFortuneButton;
QPushButton *quitButton;
QDialogButtonBox *buttonBox;
QTcpSocket *tcpSocket;
QString currentFortune;
quint16 blockSize;
#ifdef Q_OS_SYMBIAN
bool isDefaultIapSet;
#endif
};
//! [0]
#endif
//client.h
#ifndef CLIENT_H
#define CLIENT_H
#include <QDialog>
#include <QTcpSocket>
QT_BEGIN_NAMESPACE
class QDialogButtonBox;
class QLabel;
class QLineEdit;
class QPushButton;
class QTcpSocket;
class QTextEdit;
QT_END_NAMESPACE
//! [0]
class Client : public QDialog
{
Q_OBJECT
public:
Client(QWidget *parent = 0);
private slots:
void requestNewFortune();
void readFortune();
void displayError(QAbstractSocket::SocketError socketError);
void enableGetFortuneButton();
private:
QLabel *hostLabel;
QLabel *portLabel;
QLineEdit *hostLineEdit;
QLineEdit *portLineEdit;
QTextEdit *textEdit;
QPushButton *getFortuneButton;
QPushButton *quitButton;
QDialogButtonBox *buttonBox;
QTcpSocket *tcpSocket;
QString currentFortune;
quint16 blockSize;
#ifdef Q_OS_SYMBIAN
bool isDefaultIapSet;
#endif
};
//! [0]
#endif
//client.cpp #include <QtGui> #include <QtNetwork> #include "client.h" #ifdef Q_OS_SYMBIAN #include "sym_iap_util.h" #endif //! [0] Client::Client(QWidget *parent) : QDialog(parent) { //! [0] hostLabel = new QLabel(tr("&Server name:")); portLabel = new QLabel(tr("S&erver port:")); // find out which IP to connect to QString ipAddress; QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses(); // use the first non-localhost IPv4 address for (int i = 0; i < ipAddressesList.size(); ++i) { if (ipAddressesList.at(i) != QHostAddress::LocalHost && ipAddressesList.at(i).toIPv4Address()) { ipAddress = ipAddressesList.at(i).toString(); break; } } // if we did not find one, use IPv4 localhost if (ipAddress.isEmpty()) ipAddress = QHostAddress(QHostAddress::LocalHost).toString(); hostLineEdit = new QLineEdit(ipAddress); portLineEdit = new QLineEdit; portLineEdit->setValidator(new QIntValidator(1, 65535, this)); hostLabel->setBuddy(hostLineEdit); portLabel->setBuddy(portLineEdit); textEdit = new QTextEdit; textEdit->setReadOnly(true); textEdit->append("This examples requires that you run the " "Fortune Server example as well."); getFortuneButton = new QPushButton(tr("Get Fortune")); getFortuneButton->setDefault(true); getFortuneButton->setEnabled(false); quitButton = new QPushButton(tr("Quit")); buttonBox = new QDialogButtonBox; buttonBox->addButton(getFortuneButton, QDialogButtonBox::ActionRole); buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole); //! [1] tcpSocket = new QTcpSocket(this); //! [1] connect(hostLineEdit, SIGNAL(textChanged(QString)), this, SLOT(enableGetFortuneButton())); connect(portLineEdit, SIGNAL(textChanged(QString)), this, SLOT(enableGetFortuneButton())); connect(getFortuneButton, SIGNAL(clicked()), this, SLOT(requestNewFortune())); connect(quitButton, SIGNAL(clicked()), this, SLOT(close())); //! [2] //! [3] connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readFortune())); //! [2] //! [4] connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), //! [3] this, SLOT(displayError(QAbstractSocket::SocketError))); //! [4] QGridLayout *mainLayout = new QGridLayout; mainLayout->addWidget(hostLabel, 0, 0); mainLayout->addWidget(hostLineEdit, 0, 1); mainLayout->addWidget(portLabel, 1, 0); mainLayout->addWidget(portLineEdit, 1, 1); mainLayout->addWidget(textEdit, 2, 0, 3, 2); mainLayout->addWidget(buttonBox, 5, 0, 1, 2); setLayout(mainLayout); setWindowTitle(tr("Fortune Client")); portLineEdit->setFocus(); } //主要是这个函数改了 void Client::requestNewFortune() { getFortuneButton->setEnabled(false); for(int i=0;i<5;i++) { blockSize = 0; tcpSocket->abort(); tcpSocket->connectToHost(hostLineEdit->text(), portLineEdit->text().toInt()); } } //! [6] //! [8] void Client::readFortune() { //! [9] QDataStream in(tcpSocket); in.setVersion(QDataStream::Qt_4_0); if (blockSize == 0) { if (tcpSocket->bytesAvailable() < (int)sizeof(quint16)) return; //! [8] //! [10] in >> blockSize; } if (tcpSocket->bytesAvailable() < blockSize) return; //! [10] //! [11] QString nextFortune; in >> nextFortune; if (nextFortune == currentFortune) { QTimer::singleShot(0, this, SLOT(requestNewFortune())); return; } //! [11] //! [12] currentFortune = nextFortune; //! [9] textEdit->append(currentFortune); getFortuneButton->setEnabled(true); } //! [12] //! [13] void Client::displayError(QAbstractSocket::SocketError socketError) { switch (socketError) { case QAbstractSocket::RemoteHostClosedError: break; case QAbstractSocket::HostNotFoundError: QMessageBox::information(this, tr("Fortune Client"), tr("The host was not found. Please check the " "host name and port settings.")); break; case QAbstractSocket::ConnectionRefusedError: QMessageBox::information(this, tr("Fortune Client"), tr("The connection was refused by the peer. " "Make sure the fortune server is running, " "and check that the host name and port " "settings are correct.")); break; default: QMessageBox::information(this, tr("Fortune Client"), tr("The following error occurred: %1.") .arg(tcpSocket->errorString())); } getFortuneButton->setEnabled(true); } //! [13] void Client::enableGetFortuneButton() { getFortuneButton->setEnabled(!hostLineEdit->text().isEmpty() && !portLineEdit->text().isEmpty()); }
#include "client.h" #include <QtGui/QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Client client; #ifdef Q_OS_SYMBIAN // Make application better looking and more usable on small screen client.showMaximized(); #else client.show(); #endif return a.exec(); }
相关文章推荐
- QTcpServer
- QTcpSocket类中文参考(二)
- QTcpSocket类中文参考(三)
- QTcpsocket
- QT自带QTcpServer架构分析
- Qt 网络编程-TCP
- Qt 查看IP是否在线的两种方法
- QT类似于QQ的即时聊天程序用开发QTcpServer,QTcpSocket简单开发
- QTcpServer和QTcpSocket的使用
- Qt之网络编程
- Qt之进程间通信(TCP/IP)
- QTcpServer / QTcpSocket 简单示例
- 一个简单的文件传输验证码识别c/s实现
- Qt5 lambda表达式连接QTcpServer信号槽
- QTcpSocket的一次奇异之旅
- QT类似 4000 于QQ的即时聊天程序用开发QTcpServer,QTcpSocket简单开发
- Qt CS架构 客户端代码编写技巧 QTcpSocket
- QTcpServer+QTcpSocket使用整理
- 解决QTcpSocket类中readAll()函数调用失败问题
- 网络学习笔记(2)