164 lines
3.9 KiB
C++
164 lines
3.9 KiB
C++
|
#include "tcpserver.h"
|
|||
|
#include "quiwidget.h"
|
|||
|
|
|||
|
TcpClient::TcpClient(QObject *parent) : QTcpSocket(parent)
|
|||
|
{
|
|||
|
ip = "127.0.0.1";
|
|||
|
port = 6000;
|
|||
|
|
|||
|
connect(this, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(deleteLater()));
|
|||
|
connect(this, SIGNAL(disconnected()), this, SLOT(deleteLater()));
|
|||
|
connect(this, SIGNAL(readyRead()), this, SLOT(readData()));
|
|||
|
}
|
|||
|
|
|||
|
void TcpClient::setIP(const QString &ip)
|
|||
|
{
|
|||
|
this->ip = ip;
|
|||
|
}
|
|||
|
|
|||
|
QString TcpClient::getIP() const
|
|||
|
{
|
|||
|
return this->ip;
|
|||
|
}
|
|||
|
|
|||
|
void TcpClient::setPort(int port)
|
|||
|
{
|
|||
|
this->port = port;
|
|||
|
}
|
|||
|
|
|||
|
int TcpClient::getPort() const
|
|||
|
{
|
|||
|
return this->port;
|
|||
|
}
|
|||
|
|
|||
|
void TcpClient::readData()
|
|||
|
{
|
|||
|
QByteArray data = this->readAll();
|
|||
|
if (data.length() <= 0) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
QString buffer;
|
|||
|
if (App::HexReceiveTcpServer) {
|
|||
|
buffer = QUIHelper::byteArrayToHexStr(data);
|
|||
|
} else if (App::AsciiTcpServer) {
|
|||
|
buffer = QUIHelper::byteArrayToAsciiStr(data);
|
|||
|
} else {
|
|||
|
buffer = QString(data);
|
|||
|
}
|
|||
|
|
|||
|
emit receiveData(ip, port, buffer);
|
|||
|
|
|||
|
//自动回复数据,可以回复的数据是以;隔开,每行可以带多个;所以这里不需要继续判断
|
|||
|
if (App::DebugTcpServer) {
|
|||
|
int count = App::Keys.count();
|
|||
|
for (int i = 0; i < count; i++) {
|
|||
|
if (App::Keys.at(i) == buffer) {
|
|||
|
sendData(App::Values.at(i));
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void TcpClient::sendData(const QString &data)
|
|||
|
{
|
|||
|
QByteArray buffer;
|
|||
|
if (App::HexSendTcpServer) {
|
|||
|
buffer = QUIHelper::hexStrToByteArray(data);
|
|||
|
} else if (App::AsciiTcpServer) {
|
|||
|
buffer = QUIHelper::asciiStrToByteArray(data);
|
|||
|
} else {
|
|||
|
buffer = data.toLatin1();
|
|||
|
}
|
|||
|
|
|||
|
this->write(buffer);
|
|||
|
emit sendData(ip, port, data);
|
|||
|
}
|
|||
|
|
|||
|
TcpServer::TcpServer(QObject *parent) : QTcpServer(parent)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
void TcpServer::incomingConnection(int handle)
|
|||
|
{
|
|||
|
TcpClient *client = new TcpClient(this);
|
|||
|
client->setSocketDescriptor(handle);
|
|||
|
connect(client, SIGNAL(disconnected()), this, SLOT(disconnected()));
|
|||
|
connect(client, SIGNAL(sendData(QString, int, QString)), this, SIGNAL(sendData(QString, int, QString)));
|
|||
|
connect(client, SIGNAL(receiveData(QString, int, QString)), this, SIGNAL(receiveData(QString, int, QString)));
|
|||
|
|
|||
|
QString ip = client->peerAddress().toString();
|
|||
|
int port = client->peerPort();
|
|||
|
client->setIP(ip);
|
|||
|
client->setPort(port);
|
|||
|
emit clientConnected(ip, port);
|
|||
|
emit sendData(ip, port, "客户端上线");
|
|||
|
|
|||
|
//连接后加入链表
|
|||
|
clients.append(client);
|
|||
|
}
|
|||
|
|
|||
|
void TcpServer::disconnected()
|
|||
|
{
|
|||
|
TcpClient *client = (TcpClient *)sender();
|
|||
|
QString ip = client->getIP();
|
|||
|
int port = client->getPort();
|
|||
|
emit clientDisconnected(ip, port);
|
|||
|
emit sendData(ip, port, "客户端下线");
|
|||
|
|
|||
|
//断开连接后从链表中移除
|
|||
|
clients.removeOne(client);
|
|||
|
}
|
|||
|
|
|||
|
bool TcpServer::start()
|
|||
|
{
|
|||
|
#if (QT_VERSION > QT_VERSION_CHECK(5,0,0))
|
|||
|
bool ok = listen(QHostAddress::AnyIPv4, App::TcpListenPort);
|
|||
|
#else
|
|||
|
bool ok = listen(QHostAddress::Any, App::TcpListenPort);
|
|||
|
#endif
|
|||
|
|
|||
|
return ok;
|
|||
|
}
|
|||
|
|
|||
|
void TcpServer::stop()
|
|||
|
{
|
|||
|
remove();
|
|||
|
this->close();
|
|||
|
}
|
|||
|
|
|||
|
void TcpServer::writeData(const QString &ip, int port, const QString &data)
|
|||
|
{
|
|||
|
foreach (TcpClient *client, clients) {
|
|||
|
if (client->peerAddress().toString() == ip && client->peerPort() == port) {
|
|||
|
client->sendData(data);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void TcpServer::writeData(const QString &data)
|
|||
|
{
|
|||
|
foreach (TcpClient *client, clients) {
|
|||
|
client->sendData(data);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void TcpServer::remove(const QString &ip, int port)
|
|||
|
{
|
|||
|
foreach (TcpClient *client, clients) {
|
|||
|
if (client->peerAddress().toString() == ip && client->peerPort() == port) {
|
|||
|
client->disconnectFromHost();
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void TcpServer::remove()
|
|||
|
{
|
|||
|
foreach (TcpClient *client, clients) {
|
|||
|
client->disconnectFromHost();
|
|||
|
}
|
|||
|
}
|