qtcpclienttest.cpp 14.2 KB
Newer Older
丁劲犇's avatar
丁劲犇 已提交
1 2
#include "qtcpclienttest.h"
#include <QSettings>
丁劲犇's avatar
丁劲犇 已提交
3
#include <QCoreApplication>
4
#include <QFileDialog>
丁劲犇's avatar
丁劲犇 已提交
5
#include "../ZoomPipeline_FuncSvr/smartlink/st_message.h"
6
using namespace ExampleServer;
丁劲犇's avatar
丁劲犇 已提交
7
QTcpClientTest::QTcpClientTest(QWidget *parent, Qt::WindowFlags flags)
丁劲犇's avatar
丁劲犇 已提交
8
	: QMainWindow(parent, flags)
丁劲犇's avatar
丁劲犇 已提交
9
{
丁劲犇's avatar
丁劲犇 已提交
10 11
	ui.setupUi(this);
	//Paramenters
12 13
	QString iniFile = QCoreApplication::applicationFilePath()+".ini";
	QSettings settings(iniFile,QSettings::IniFormat);
丁劲犇's avatar
丁劲犇 已提交
14 15 16 17 18 19
	ui.lineEdit_ip->setText(settings.value("ip","localhost").toString());
	ui.lineEdit_Port->setText(settings.value("port","23457").toString());
	ui.dial->setValue(settings.value("clientNum","32").toInt());
	ui.lcdNumber->display(settings.value("clientNum","32").toInt());
	ui.horizontalSlider->setValue(settings.value("Payload","2048").toInt());
	ui.label_load->setText(QString("Payload = %1").arg(settings.value("Payload","2048").toInt()));
20 21
	ui.checkBox_SSL->setChecked(settings.value("SSL",false).toBool());
	ui.lineEdit_globalFile->setText(settings.value("globalFile","/zpserver_syn.debug").toString());
丁劲犇's avatar
丁劲犇 已提交
22
	ui.listView_msg->setModel(&model);
23 24
	m_maxUUID = 2;
	m_minUUID = 0xffffffff;
丁劲犇's avatar
丁劲犇 已提交
25 26 27 28 29 30 31 32
}

QTcpClientTest::~QTcpClientTest()
{

}
void QTcpClientTest::on_horizontalSlider_valueChanged(int value)
{
丁劲犇's avatar
丁劲犇 已提交
33
	ui.label_load->setText(QString("Payload = %1").arg(value));
丁劲犇's avatar
丁劲犇 已提交
34 35 36
}
void QTcpClientTest::on_action_Connect_triggered(bool bConn)
{
丁劲犇's avatar
丁劲犇 已提交
37
	//connect to the server
38 39
	QString iniFile = QCoreApplication::applicationFilePath()+".ini";
	QSettings settings(iniFile,QSettings::IniFormat);
丁劲犇's avatar
丁劲犇 已提交
40 41 42 43
	settings.setValue("ip",ui.lineEdit_ip->text());
	settings.setValue("port",ui.lineEdit_Port->text());
	settings.setValue("clientNum",ui.dial->value());
	settings.setValue("Payload",ui.horizontalSlider->value());
44 45
	settings.setValue("SSL",ui.checkBox_SSL->isChecked());
	settings.setValue("globalFile",ui.lineEdit_globalFile->text());
丁劲犇's avatar
丁劲犇 已提交
46 47 48
	if (bConn==true)
	{
		nTimer = startTimer(100);
49
		ui.dockWidget->setEnabled(false);
丁劲犇's avatar
丁劲犇 已提交
50 51
	}
	else
52
	{
丁劲犇's avatar
丁劲犇 已提交
53
		killTimer(nTimer);
54 55 56 57 58 59
		ui.dockWidget->setEnabled(true);
		QList<QTcpSocket*> listObj = m_clients.keys();
		foreach(QTcpSocket * sock,listObj)
			sock->disconnectFromHost();

	}
丁劲犇's avatar
丁劲犇 已提交
60 61 62
}
void QTcpClientTest::on_client_trasferred(qint64 dtw)
{
63 64 65
	if (dtw <= sizeof(EXAMPLE_HEARTBEATING))
		return;
	QTcpSocket * pSock = qobject_cast<QTcpSocket*>(sender());
丁劲犇's avatar
丁劲犇 已提交
66 67
	if (pSock)
	{
68
#if (ZP_WANTSSL!=0)
69 70 71 72 73 74
		QGHSslClient * pSockSsl = qobject_cast<QGHSslClient*>(sender());
		QGHTcpClient * pSockTcp = qobject_cast<QGHTcpClient*>(sender());
		if (pSockSsl)
			displayMessage(QString("client %1 Transferrd %2 bytes.").arg(pSockSsl->uuid()).arg(dtw));
		else if (pSockTcp)
			displayMessage(QString("client %1 Transferrd %2 bytes.").arg(pSockTcp->uuid()).arg(dtw));
75 76 77 78 79
#else
		QGHTcpClient * pSockTcp = qobject_cast<QGHTcpClient*>(sender());
		if (pSockTcp)
			displayMessage(QString("client %1 Transferrd %2 bytes.").arg(pSockTcp->uuid()).arg(dtw));
#endif
丁劲犇's avatar
丁劲犇 已提交
80
	}
丁劲犇's avatar
丁劲犇 已提交
81 82 83 84

}
void QTcpClientTest::on_client_connected()
{
85
#if (ZP_WANTSSL!=0)
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
	QGHSslClient * pSockSsl = qobject_cast<QGHSslClient*>(sender());
	QGHTcpClient * pSockTcp = qobject_cast<QGHTcpClient*>(sender());

	if (pSockSsl)
	{
		pSockSsl->geneGlobalUUID(ui.lineEdit_globalFile->text());
		if (pSockSsl->uuid()>m_maxUUID)
			m_maxUUID = pSockSsl->uuid();
		if (pSockSsl->uuid()<m_minUUID)
			m_minUUID = pSockSsl->uuid();

		displayMessage(QString("client %1 connected.").arg(pSockSsl->uuid()));
		QByteArray array(sizeof(EXAMPLE_HEARTBEATING),0);
		char * ptr = array.data();
		EXAMPLE_HEARTBEATING * pMsg = (EXAMPLE_HEARTBEATING *)ptr;
		pMsg->Mark = 0xBEBE;
		pMsg->source_id = pSockSsl->uuid();
		pMsg->tmStamp = 0;
		(pSockSsl)->SendData(array);
	}
	else if (pSockTcp)
丁劲犇's avatar
丁劲犇 已提交
107
	{
108 109 110 111 112 113 114
		pSockTcp->geneGlobalUUID(ui.lineEdit_globalFile->text());
		if (pSockTcp->uuid()>m_maxUUID)
			m_maxUUID = pSockTcp->uuid();
		if (pSockTcp->uuid()<m_minUUID)
			m_minUUID = pSockTcp->uuid();

		displayMessage(QString("client %1 connected.").arg(pSockTcp->uuid()));
丁劲犇's avatar
丁劲犇 已提交
115 116 117 118
		QByteArray array(sizeof(EXAMPLE_HEARTBEATING),0);
		char * ptr = array.data();
		EXAMPLE_HEARTBEATING * pMsg = (EXAMPLE_HEARTBEATING *)ptr;
		pMsg->Mark = 0xBEBE;
119
		pMsg->source_id = pSockTcp->uuid();
丁劲犇's avatar
丁劲犇 已提交
120
		pMsg->tmStamp = 0;
121
		(pSockTcp)->SendData(array);
丁劲犇's avatar
丁劲犇 已提交
122
	}
123 124 125 126 127 128 129 130 131
#else
	QGHTcpClient * pSockTcp = qobject_cast<QGHTcpClient*>(sender());
	if (pSockTcp)
	{
		pSockTcp->geneGlobalUUID(ui.lineEdit_globalFile->text());
		if (pSockTcp->uuid()>m_maxUUID)
			m_maxUUID = pSockTcp->uuid();
		if (pSockTcp->uuid()<m_minUUID)
			m_minUUID = pSockTcp->uuid();
丁劲犇's avatar
丁劲犇 已提交
132

133 134 135 136 137 138 139 140 141 142
		displayMessage(QString("client %1 connected.").arg(pSockTcp->uuid()));
		QByteArray array(sizeof(EXAMPLE_HEARTBEATING),0);
		char * ptr = array.data();
		EXAMPLE_HEARTBEATING * pMsg = (EXAMPLE_HEARTBEATING *)ptr;
		pMsg->Mark = 0xBEBE;
		pMsg->source_id = pSockTcp->uuid();
		pMsg->tmStamp = 0;
		(pSockTcp)->SendData(array);
	}
#endif
丁劲犇's avatar
丁劲犇 已提交
143 144 145
}
void QTcpClientTest::on_client_disconnected()
{
146
#if (ZP_WANTSSL!=0)
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
	QGHSslClient * pSockSsl = qobject_cast<QGHSslClient*>(sender());
	QGHTcpClient * pSockTcp = qobject_cast<QGHTcpClient*>(sender());
	if (pSockSsl)
	{
		displayMessage(QString("client %1 disconnected.").arg(pSockSsl->uuid()));
		//disconnect the signal immediately so that the system resource could be freed.
		disconnect(pSockSsl, SIGNAL(readyRead()),this, SLOT(new_data_recieved()));
		disconnect(pSockSsl, SIGNAL(encrypted()),this, SLOT(on_client_connected()));
		disconnect(pSockSsl, SIGNAL(disconnected()),this,SLOT(on_client_disconnected()));
		disconnect(pSockSsl, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(displayError(QAbstractSocket::SocketError)));
		disconnect(pSockSsl, SIGNAL(bytesWritten(qint64)), this, SLOT(on_client_trasferred(qint64)));
		m_clients.remove(pSockSsl);
		pSockSsl->deleteLater();
	}
	else if (pSockTcp)
丁劲犇's avatar
丁劲犇 已提交
162
	{
163
		displayMessage(QString("client %1 disconnected.").arg(pSockTcp->uuid()));
丁劲犇's avatar
丁劲犇 已提交
164
		//disconnect the signal immediately so that the system resource could be freed.
165 166 167 168 169 170 171
		disconnect(pSockTcp, SIGNAL(readyRead()),this, SLOT(new_data_recieved()));
		disconnect(pSockTcp, SIGNAL(connected()),this, SLOT(on_client_connected()));
		disconnect(pSockTcp, SIGNAL(disconnected()),this,SLOT(on_client_disconnected()));
		disconnect(pSockTcp, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(displayError(QAbstractSocket::SocketError)));
		disconnect(pSockTcp, SIGNAL(bytesWritten(qint64)), this, SLOT(on_client_trasferred(qint64)));
		m_clients.remove(pSockTcp);
		pSockTcp->deleteLater();
丁劲犇's avatar
丁劲犇 已提交
172
	}
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
#else
	QGHTcpClient * pSockTcp = qobject_cast<QGHTcpClient*>(sender());
	if (pSockTcp)
	{
		displayMessage(QString("client %1 disconnected.").arg(pSockTcp->uuid()));
		//disconnect the signal immediately so that the system resource could be freed.
		disconnect(pSockTcp, SIGNAL(readyRead()),this, SLOT(new_data_recieved()));
		disconnect(pSockTcp, SIGNAL(connected()),this, SLOT(on_client_connected()));
		disconnect(pSockTcp, SIGNAL(disconnected()),this,SLOT(on_client_disconnected()));
		disconnect(pSockTcp, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(displayError(QAbstractSocket::SocketError)));
		disconnect(pSockTcp, SIGNAL(bytesWritten(qint64)), this, SLOT(on_client_trasferred(qint64)));
		m_clients.remove(pSockTcp);
		pSockTcp->deleteLater();
	}
#endif
丁劲犇's avatar
丁劲犇 已提交
188
}
丁劲犇's avatar
丁劲犇 已提交
189
void QTcpClientTest::displayError(QAbstractSocket::SocketError /*err*/)
丁劲犇's avatar
丁劲犇 已提交
190
{
191
	QTcpSocket * sock = qobject_cast<QTcpSocket *> (sender());
丁劲犇's avatar
丁劲犇 已提交
192
	if (sock)
193
	{
194
#if (ZP_WANTSSL!=0)
195 196 197 198 199 200
		QGHSslClient * pSockSsl = qobject_cast<QGHSslClient*>(sock);
		QGHTcpClient * pSockTcp = qobject_cast<QGHTcpClient*>(sock);
		if (pSockSsl)
			displayMessage(QString("client %1 error msg:").arg(pSockSsl->uuid())+sock->errorString());
		else if (pSockTcp)
			displayMessage(QString("client %1 error msg:").arg(pSockTcp->uuid())+sock->errorString());
201 202 203 204 205
#else
		QGHTcpClient * pSockTcp = qobject_cast<QGHTcpClient*>(sock);
		if (pSockTcp)
			displayMessage(QString("client %1 error msg:").arg(pSockTcp->uuid())+sock->errorString());
#endif
206
	}
丁劲犇's avatar
丁劲犇 已提交
207 208 209
}
void QTcpClientTest::new_data_recieved()
{
丁劲犇's avatar
丁劲犇 已提交
210 211 212 213
	QTcpSocket * pSock = qobject_cast<QTcpSocket*>(sender());
	if (pSock)
	{
		QByteArray array =pSock->readAll();
214 215
		if (array.size() <= sizeof(EXAMPLE_HEARTBEATING))
			return;
丁劲犇's avatar
丁劲犇 已提交
216
		//in this example, we just do nothing but to display the byte size.
217
#if (ZP_WANTSSL!=0)
218 219 220 221 222 223
		QGHSslClient * pSockSsl = qobject_cast<QGHSslClient*>(pSock);
		QGHTcpClient * pSockTcp = qobject_cast<QGHTcpClient*>(pSock);
		if (pSockSsl)
			displayMessage(QString("client %1 Recieved %2 bytes.").arg(pSockSsl->uuid()).arg(array.size()));
		else if (pSockTcp)
			displayMessage(QString("client %1 Recieved %2 bytes.").arg(pSockTcp->uuid()).arg(array.size()));
224 225 226 227 228
#else
		QGHTcpClient * pSockTcp = qobject_cast<QGHTcpClient*>(pSock);
		if (pSockTcp)
			displayMessage(QString("client %1 Recieved %2 bytes.").arg(pSockTcp->uuid()).arg(array.size()));
#endif
丁劲犇's avatar
丁劲犇 已提交
229
	}
丁劲犇's avatar
丁劲犇 已提交
230 231 232 233
}

void QTcpClientTest::timerEvent(QTimerEvent * evt)
{
丁劲犇's avatar
丁劲犇 已提交
234 235 236 237 238
	static int nCount = 0;
	if (evt->timerId()==nTimer)
	{
		int nTotalClients = ui.dial->value();
		int nPayload = ui.horizontalSlider->value();
239
		QList<QTcpSocket*> listObj = m_clients.keys();
丁劲犇's avatar
丁劲犇 已提交
240 241 242 243
		nCount++;
		if (nCount % 100 == 0)
		{
			//send heart-beating
244
			foreach(QTcpSocket * pSock,listObj)
丁劲犇's avatar
丁劲犇 已提交
245
			{
246
				quint32 uuid = 0;
247
#if (ZP_WANTSSL!=0)
248 249 250 251 252 253 254 255
				QGHSslClient * pSockSsl = qobject_cast<QGHSslClient*>(pSock);
				QGHTcpClient * pSockTcp = qobject_cast<QGHTcpClient*>(pSock);
				if (pSockSsl)
					uuid = pSockSsl->uuid();
				else if (pSockTcp)
					uuid = pSockTcp->uuid();
				else
					continue;
256 257 258 259 260 261 262
#else
				QGHTcpClient * pSockTcp = qobject_cast<QGHTcpClient*>(pSock);
				if (pSockTcp)
					uuid = pSockTcp->uuid();
				else
					continue;
#endif
263

264
				QByteArray array(sizeof(EXAMPLE_HEARTBEATING),0);
丁劲犇's avatar
丁劲犇 已提交
265
				char * ptr = array.data();
266
				EXAMPLE_HEARTBEATING * pMsg = (EXAMPLE_HEARTBEATING *)ptr;
丁劲犇's avatar
丁劲犇 已提交
267
				pMsg->Mark = 0xBEBE;
268
				pMsg->source_id = uuid;
丁劲犇's avatar
丁劲犇 已提交
269
				pMsg->tmStamp = 0;
270
#if (ZP_WANTSSL!=0)
271 272 273 274
				if (pSockSsl)
					pSockSsl->SendData(array);
				else if (pSockTcp)
					pSockTcp->SendData(array);
275 276 277 278
#else
				if (pSockTcp)
					pSockTcp->SendData(array);
#endif
丁劲犇's avatar
丁劲犇 已提交
279 280
			}
		}
281
		foreach(QTcpSocket * sock,listObj)
丁劲犇's avatar
丁劲犇 已提交
282 283 284
		{
			if (rand()%1000<5)
			{
285
				quint32 uuid = 0;
286
#if (ZP_WANTSSL!=0)
287 288 289 290 291 292 293 294
				QGHSslClient * pSockSsl = qobject_cast<QGHSslClient*>(sock);
				QGHTcpClient * pSockTcp = qobject_cast<QGHTcpClient*>(sock);
				if (pSockSsl)
					uuid = pSockSsl->uuid();
				else if (pSockTcp)
					uuid = pSockTcp->uuid();
				else
					continue;
295 296 297 298 299 300 301
#else
				QGHTcpClient * pSockTcp = qobject_cast<QGHTcpClient*>(sock);
				if (pSockTcp)
					uuid = pSockTcp->uuid();
				else
					continue;
#endif
302 303
				quint16 nMsgLen = qrand()%(32)+nPayload-32-sizeof(EXAMPLE_TRANS_MSG);
				QByteArray array(sizeof(EXAMPLE_TRANS_MSG) + nMsgLen - 1,0);
丁劲犇's avatar
丁劲犇 已提交
304
				char * ptr = array.data();
305
				EXAMPLE_TRANS_MSG * pMsg = (EXAMPLE_TRANS_MSG *)ptr;
丁劲犇's avatar
丁劲犇 已提交
306
				pMsg->Mark = 0x55AA;
307
				pMsg->source_id = uuid;
丁劲犇's avatar
丁劲犇 已提交
308

309
				pMsg->destin_id = getRadomUUIDDestin();
丁劲犇's avatar
丁劲犇 已提交
310

丁劲犇's avatar
丁劲犇 已提交
311 312 313
				pMsg->data_length = nMsgLen;
				for (int i=0;i<nMsgLen;i++)
					pMsg->data[i] = '0' + i%10;
314
#if (ZP_WANTSSL!=0)
315 316 317 318
				if (pSockSsl)
					pSockSsl->SendData(array);
				else if (pSockTcp)
					pSockTcp->SendData(array);
319 320 321 322
#else
				if (pSockTcp)
					pSockTcp->SendData(array);
#endif
丁劲犇's avatar
丁劲犇 已提交
323 324 325 326 327 328 329 330 331 332
			}
		}
		//
		if (rand()%100 <1)
			//if (m_clients.size()==0)
		{
			//1/10 chance to make new connections.
			if (m_clients.size()>nTotalClients)
			{
				int nDel = m_clients.size()-nTotalClients;
333
				QList<QTcpSocket*> listObj = m_clients.keys();
丁劲犇's avatar
丁劲犇 已提交
334 335 336 337 338
				for (int i=0;i<nDel;i++)
				{
					listObj.at(i)->abort();
				}
			}
339
#if (ZP_WANTSSL!=0)
340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366
			if (ui.checkBox_SSL->isChecked()==true)
			{
				QGHSslClient * client = new QGHSslClient(this,ui.horizontalSlider->value());
				//client->connectToHost(ui.lineEdit_ip->text(),ui.lineEdit_Port->text().toUShort());
				m_clients[client] = QDateTime::currentDateTime();
				connect(client, SIGNAL(readyRead()),this, SLOT(new_data_recieved()));
				//connect(client, SIGNAL(connected()),this, SLOT(on_client_connected()));
				connect(client, SIGNAL(disconnected()),this,SLOT(on_client_disconnected()));
				connect(client, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(displayError(QAbstractSocket::SocketError)));
				connect(client, SIGNAL(bytesWritten(qint64)), this, SLOT(on_client_trasferred(qint64)));
				connect(client, SIGNAL(encrypted()), this, SLOT(on_client_connected()));
				QString strCerPath =  QCoreApplication::applicationDirPath() + "/ca_cert.pem";
				QList<QSslCertificate> lstCas = QSslCertificate::fromPath(strCerPath);
				client->setCaCertificates(lstCas);
				client->connectToHostEncrypted(ui.lineEdit_ip->text(),ui.lineEdit_Port->text().toUShort());
			}
			else
			{
				QGHTcpClient * client = new QGHTcpClient(this,ui.horizontalSlider->value());
				m_clients[client] = QDateTime::currentDateTime();
				connect(client, SIGNAL(readyRead()),this, SLOT(new_data_recieved()));
				connect(client, SIGNAL(connected()),this, SLOT(on_client_connected()));
				connect(client, SIGNAL(disconnected()),this,SLOT(on_client_disconnected()));
				connect(client, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(displayError(QAbstractSocket::SocketError)));
				connect(client, SIGNAL(bytesWritten(qint64)), this, SLOT(on_client_trasferred(qint64)));
				client->connectToHost(ui.lineEdit_ip->text(),ui.lineEdit_Port->text().toUShort());
			}
367 368 369 370 371 372 373 374 375 376
#else
			QGHTcpClient * client = new QGHTcpClient(this,ui.horizontalSlider->value());
			m_clients[client] = QDateTime::currentDateTime();
			connect(client, SIGNAL(readyRead()),this, SLOT(new_data_recieved()));
			connect(client, SIGNAL(connected()),this, SLOT(on_client_connected()));
			connect(client, SIGNAL(disconnected()),this,SLOT(on_client_disconnected()));
			connect(client, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(displayError(QAbstractSocket::SocketError)));
			connect(client, SIGNAL(bytesWritten(qint64)), this, SLOT(on_client_trasferred(qint64)));
			client->connectToHost(ui.lineEdit_ip->text(),ui.lineEdit_Port->text().toUShort());
#endif
丁劲犇's avatar
丁劲犇 已提交
377 378
		}
	}
丁劲犇's avatar
丁劲犇 已提交
379
}
380
void QTcpClientTest::displayMessage(QString str)
丁劲犇's avatar
丁劲犇 已提交
381
{
丁劲犇's avatar
丁劲犇 已提交
382
	model.insertRow(0,new QStandardItem(str));
383
	while (model.rowCount()>=128)
丁劲犇's avatar
丁劲犇 已提交
384
		model.removeRow(model.rowCount()-1);
丁劲犇's avatar
丁劲犇 已提交
385
}
386 387 388
quint32 QTcpClientTest::getRadomUUIDDestin()
{
	int nTotalClients = ui.dial->value();
389
	int nMinID = ((m_maxUUID - m_minUUID) < nTotalClients) ? m_minUUID:(m_maxUUID - nTotalClients);
390 391 392 393 394 395 396 397 398 399 400
	int nSpan = (m_maxUUID - nMinID + 1);
	int nChoose = rand() % nSpan;

	return nMinID + nChoose ;
}
void QTcpClientTest::on_toolButton_brFile_clicked()
{
	QString file = QFileDialog::getOpenFileName(this,tr("Open UUID global Syn File"));
	if (file.length()>0)
		ui.lineEdit_globalFile->setText(file);
}