qtcpclienttest.cpp 10.9 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 12 13 14 15 16 17 18
	ui.setupUi(this);
	//Paramenters
	QSettings settings("goldenhawking club","QTcpClientTest",this);
	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()));
19 20
	ui.checkBox_SSL->setChecked(settings.value("SSL",false).toBool());
	ui.lineEdit_globalFile->setText(settings.value("globalFile","/zpserver_syn.debug").toString());
丁劲犇's avatar
丁劲犇 已提交
21
	ui.listView_msg->setModel(&model);
22 23
	m_maxUUID = 2;
	m_minUUID = 0xffffffff;
丁劲犇's avatar
丁劲犇 已提交
24 25 26 27 28 29 30 31
}

QTcpClientTest::~QTcpClientTest()
{

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

	}
丁劲犇's avatar
丁劲犇 已提交
58 59 60
}
void QTcpClientTest::on_client_trasferred(qint64 dtw)
{
61 62 63
	if (dtw <= sizeof(EXAMPLE_HEARTBEATING))
		return;
	QTcpSocket * pSock = qobject_cast<QTcpSocket*>(sender());
丁劲犇's avatar
丁劲犇 已提交
64 65
	if (pSock)
	{
66 67 68 69 70 71
		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
丁劲犇 已提交
72
	}
丁劲犇's avatar
丁劲犇 已提交
73 74 75 76

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

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

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

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

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

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

				if (pSockSsl)
					pSockSsl->SendData(array);
				else if (pSockTcp)
					pSockTcp->SendData(array);
丁劲犇's avatar
丁劲犇 已提交
243 244 245 246 247 248 249 250 251 252
			}
		}
		//
		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;
253
				QList<QTcpSocket*> listObj = m_clients.keys();
丁劲犇's avatar
丁劲犇 已提交
254 255 256 257 258
				for (int i=0;i<nDel;i++)
				{
					listObj.at(i)->abort();
				}
			}
259 260 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
			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
丁劲犇 已提交
286 287
		}
	}
丁劲犇's avatar
丁劲犇 已提交
288 289 290
}
void QTcpClientTest::displayMessage(const QString &str)
{
丁劲犇's avatar
丁劲犇 已提交
291 292 293
	model.insertRow(0,new QStandardItem(str));
	while (model.rowCount()>=256)
		model.removeRow(model.rowCount()-1);
丁劲犇's avatar
丁劲犇 已提交
294
}
295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
quint32 QTcpClientTest::getRadomUUIDDestin()
{
	int nTotalClients = ui.dial->value();
	int nMinID = m_maxUUID - m_minUUID < nTotalClients ? m_minUUID:m_maxUUID - nTotalClients;
	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);
}