qtcpclienttest.cpp 11.0 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 69 70 71 72 73
		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));
丁劲犇's avatar
丁劲犇 已提交
74
	}
丁劲犇's avatar
丁劲犇 已提交
75 76 77 78

}
void QTcpClientTest::on_client_connected()
{
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
	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
丁劲犇 已提交
100
	{
101 102 103 104 105 106 107
		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
丁劲犇 已提交
108 109 110 111
		QByteArray array(sizeof(EXAMPLE_HEARTBEATING),0);
		char * ptr = array.data();
		EXAMPLE_HEARTBEATING * pMsg = (EXAMPLE_HEARTBEATING *)ptr;
		pMsg->Mark = 0xBEBE;
112
		pMsg->source_id = pSockTcp->uuid();
丁劲犇's avatar
丁劲犇 已提交
113
		pMsg->tmStamp = 0;
114
		(pSockTcp)->SendData(array);
丁劲犇's avatar
丁劲犇 已提交
115
	}
丁劲犇's avatar
丁劲犇 已提交
116 117 118 119

}
void QTcpClientTest::on_client_disconnected()
{
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
	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
丁劲犇 已提交
135
	{
136
		displayMessage(QString("client %1 disconnected.").arg(pSockTcp->uuid()));
丁劲犇's avatar
丁劲犇 已提交
137
		//disconnect the signal immediately so that the system resource could be freed.
138 139 140 141 142 143 144
		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
丁劲犇 已提交
145
	}
丁劲犇's avatar
丁劲犇 已提交
146
}
丁劲犇's avatar
丁劲犇 已提交
147
void QTcpClientTest::displayError(QAbstractSocket::SocketError /*err*/)
丁劲犇's avatar
丁劲犇 已提交
148
{
149
	QTcpSocket * sock = qobject_cast<QTcpSocket *> (sender());
丁劲犇's avatar
丁劲犇 已提交
150
	if (sock)
151 152 153 154 155 156 157 158
	{
		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());
	}
丁劲犇's avatar
丁劲犇 已提交
159 160 161
}
void QTcpClientTest::new_data_recieved()
{
丁劲犇's avatar
丁劲犇 已提交
162 163 164 165
	QTcpSocket * pSock = qobject_cast<QTcpSocket*>(sender());
	if (pSock)
	{
		QByteArray array =pSock->readAll();
166 167
		if (array.size() <= sizeof(EXAMPLE_HEARTBEATING))
			return;
丁劲犇's avatar
丁劲犇 已提交
168
		//in this example, we just do nothing but to display the byte size.
169 170 171 172 173 174 175
		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()));

丁劲犇's avatar
丁劲犇 已提交
176
	}
丁劲犇's avatar
丁劲犇 已提交
177 178 179 180
}

void QTcpClientTest::timerEvent(QTimerEvent * evt)
{
丁劲犇's avatar
丁劲犇 已提交
181 182 183 184 185
	static int nCount = 0;
	if (evt->timerId()==nTimer)
	{
		int nTotalClients = ui.dial->value();
		int nPayload = ui.horizontalSlider->value();
186
		QList<QTcpSocket*> listObj = m_clients.keys();
丁劲犇's avatar
丁劲犇 已提交
187 188 189 190
		nCount++;
		if (nCount % 100 == 0)
		{
			//send heart-beating
191
			foreach(QTcpSocket * pSock,listObj)
丁劲犇's avatar
丁劲犇 已提交
192
			{
193 194 195 196 197 198 199 200 201 202
				quint32 uuid = 0;
				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;

203
				QByteArray array(sizeof(EXAMPLE_HEARTBEATING),0);
丁劲犇's avatar
丁劲犇 已提交
204
				char * ptr = array.data();
205
				EXAMPLE_HEARTBEATING * pMsg = (EXAMPLE_HEARTBEATING *)ptr;
丁劲犇's avatar
丁劲犇 已提交
206
				pMsg->Mark = 0xBEBE;
207
				pMsg->source_id = uuid;
丁劲犇's avatar
丁劲犇 已提交
208
				pMsg->tmStamp = 0;
209 210 211 212
				if (pSockSsl)
					pSockSsl->SendData(array);
				else if (pSockTcp)
					pSockTcp->SendData(array);
丁劲犇's avatar
丁劲犇 已提交
213 214
			}
		}
215
		foreach(QTcpSocket * sock,listObj)
丁劲犇's avatar
丁劲犇 已提交
216 217 218
		{
			if (rand()%1000<5)
			{
219 220 221 222 223 224 225 226 227
				quint32 uuid = 0;
				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;
228 229
				quint16 nMsgLen = qrand()%(32)+nPayload-32-sizeof(EXAMPLE_TRANS_MSG);
				QByteArray array(sizeof(EXAMPLE_TRANS_MSG) + nMsgLen - 1,0);
丁劲犇's avatar
丁劲犇 已提交
230
				char * ptr = array.data();
231
				EXAMPLE_TRANS_MSG * pMsg = (EXAMPLE_TRANS_MSG *)ptr;
丁劲犇's avatar
丁劲犇 已提交
232
				pMsg->Mark = 0x55AA;
233
				pMsg->source_id = uuid;
丁劲犇's avatar
丁劲犇 已提交
234

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

丁劲犇's avatar
丁劲犇 已提交
237 238 239
				pMsg->data_length = nMsgLen;
				for (int i=0;i<nMsgLen;i++)
					pMsg->data[i] = '0' + i%10;
240 241 242 243 244

				if (pSockSsl)
					pSockSsl->SendData(array);
				else if (pSockTcp)
					pSockTcp->SendData(array);
丁劲犇's avatar
丁劲犇 已提交
245 246 247 248 249 250 251 252 253 254
			}
		}
		//
		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;
255
				QList<QTcpSocket*> listObj = m_clients.keys();
丁劲犇's avatar
丁劲犇 已提交
256 257 258 259 260
				for (int i=0;i<nDel;i++)
				{
					listObj.at(i)->abort();
				}
			}
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287
			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());
			}
丁劲犇's avatar
丁劲犇 已提交
288 289
		}
	}
丁劲犇's avatar
丁劲犇 已提交
290
}
291
void QTcpClientTest::displayMessage(QString str)
丁劲犇's avatar
丁劲犇 已提交
292
{
丁劲犇's avatar
丁劲犇 已提交
293 294 295
	model.insertRow(0,new QStandardItem(str));
	while (model.rowCount()>=256)
		model.removeRow(model.rowCount()-1);
丁劲犇's avatar
丁劲犇 已提交
296
}
297 298 299
quint32 QTcpClientTest::getRadomUUIDDestin()
{
	int nTotalClients = ui.dial->value();
300
	int nMinID = ((m_maxUUID - m_minUUID) < nTotalClients) ? m_minUUID:(m_maxUUID - nTotalClients);
301 302 303 304 305 306 307 308 309 310 311
	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);
}