fortune client

代码摘自于网络:

//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();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值