- #include "mytcpserver.h"
- #include <QHostAddress>
- myTcpServer::myTcpServer(QObject *parent) :
- QTcpServer(parent)
- {
- this->clientCount=0;
- }
- void myTcpServer::incomingConnection(int handle)
- {
- myTcpClient *client=new myTcpClient(this,handle);
- client->setSocketDescriptor(handle);
- connect(client,SIGNAL(ClientReadData(int,QString,int,QByteArray)),this,SIGNAL(ClientReadData(int,QString,int,QByteArray)));
- connect(client,SIGNAL(ClientDisConnect(int,QString,int)),this,SLOT(DisConnect(int,QString,int)));
- emit ClientConnect(handle, client->peerAddress().toString(),client->peerPort());
- ClientList.append(client);//将新的连接添加到客户端列表
- ClientID.append(handle);//将新的连接的ID添加到客户端ID列表
- clientCount++;
- //存储当前连接
- CurrentClient=client;
- }
- void myTcpServer::DisConnect(int clientID,QString IP,int Port)
- {
- for (int i=0;i<clientCount;i++)
- {
- if (ClientID[i]==clientID)
- {
- ClientList.removeAt(i);//从列表中移除该连接
- ClientID.removeAt(i);
- clientCount--;
- i--;//不然的话,永远只会移除第一个连接
- emit ClientDisConnect(clientID,IP,Port);
- break;
- }
- }
- }
- //指定客户端连接发消息
- void myTcpServer::SendData(int clientID, QByteArray data)
- {
- for (int i=0;i<clientCount;i++)
- {
- if (ClientID[i]==clientID)
- {
- ClientList[i]->write(data);
- break;
- }
- }
- }
- //对当前连接发送数据
- void myTcpServer::SendDataCurrent(QByteArray data)
- {
- //如果没有一个存在的连接,则不处理
- if (clientCount<1){return;}
- CurrentClient->write(data);
- }
- //对所有连接发送数据
- void myTcpServer::SendDataAll(QByteArray data)
- {
- for (int i=0;i<clientCount;i++)
- {
- ClientList[i]->write(data);
- }
- }
- void myTcpServer::CloseAllClient()
- {
- for (int i=0;i<clientCount;i++)
- {
- ClientList[i]->close();
- i--;//不然的话,永远只会断开第一个连接
- }
- }
- #include "frmmain.h"
- #include "ui_frmmain.h"
- #include "myhelper.h"
- frmMain::frmMain(QWidget *parent) :
- QWidget(parent),
- ui(new Ui::frmMain)
- {
- ui->setupUi(this);
- myHelper::FormInCenter(this);
- this->Init();
- }
- frmMain::~frmMain()
- {
- delete ui;
- }
- void frmMain::Init()
- {
- ui->txtIP->setText("192.168.1.186");
- ui->txtPortClient->setText("60000");
- ui->txtPortServer->setText("60000");
- ui->btnSendClient->setEnabled(false);
- ui->txtDataClient->setReadOnly(true);
- tcpClient=new QTcpSocket(this);
- tcpClient->abort();//取消原有连接
- connect(tcpClient,SIGNAL(readyRead()),this,SLOT(ReadData()));
- connect(tcpClient,SIGNAL(error(QAbstractSocket::SocketError)),
- this,SLOT(ReadError(QAbstractSocket::SocketError)));
- ui->btnSendServer->setEnabled(false);
- ui->txtDataServer->setReadOnly(true);
- tcpServer=new myTcpServer(this);
- connect(tcpServer,SIGNAL(ClientConnect(int,QString,int)),
- this,SLOT(ClientConnect(int,QString,int)));
- connect(tcpServer,SIGNAL(ClientDisConnect(int,QString,int)),
- this,SLOT(ClientDisConnect(int,QString,int)));
- connect(tcpServer,SIGNAL(ClientReadData(int,QString,int,QByteArray)),
- this,SLOT(ClientReadData(int,QString,int,QByteArray)));
- for (int i=10;i<=1000;i=i+10)
- {
- ui->cboxMax->addItem(QString::number(i));
- }
- }
- void frmMain::ReadData()
- {
- QByteArray buffer=tcpClient->readAll();
- if (!buffer.isEmpty())
- {
- if (ui->ckHexReceiveClient->isChecked())
- {
- ui->txtDataClient->append(tr("接收数据:%1 时间:%2")
- .arg(myHelper::ByteArrayToHexStr(buffer)).arg(QTime::currentTime().toString("hh:mm:ss")));
- }
- else
- {
- ui->txtDataClient->append(tr("接收数据:%1 时间:%2")
- .arg(QString(buffer)).arg(QTime::currentTime().toString("hh:mm:ss")));
- }
- }
- }
- void frmMain::ReadError(QAbstractSocket::SocketError)
- {
- tcpClient->disconnectFromHost();
- ui->btnConnect->setText("连接");
- ui->txtDataClient->append(tr("连接服务器失败,原因:%1").arg(tcpClient->errorString()));
- }
- void frmMain::ClientReadData(int clientID,QString IP,int Port,QByteArray data)
- {
- if (!data.isEmpty())
- {
- if (ui->ckHexReceiveServer->isChecked())
- {
- ui->txtDataServer->append(tr("接收数据:%1 来自:[clientID:%2 IP:%3 Port:%4] 时间:%5")
- .arg(QString(myHelper::ByteArrayToHexStr(data)))
- .arg(clientID).arg(IP).arg(Port).arg(QTime::currentTime().toString("hh:mm:ss")));
- }
- else
- {
- ui->txtDataServer->append(tr("接收数据:%1 来自:[clientID:%2 IP:%3 Port:%4] 时间:%5")
- .arg(QString(data)).arg(clientID).arg(IP).arg(Port).arg(QTime::currentTime().toString("hh:mm:ss")));
- }
- }
- }
- void frmMain::ClientConnect(int clientID,QString IP,int Port)
- {
- ui->txtDataServer->append(tr("客户端:[clientID:%1 IP:%2 Port:%3]上线 时间:%4")
- .arg(clientID).arg(IP).arg(Port).arg(QTime::currentTime().toString("hh:mm:ss")));
- ui->cboxClient->addItem(tr("%1:%2:%3").arg(clientID).arg(IP).arg(Port));
- }
- void frmMain::ClientDisConnect(int clientID,QString IP,int Port)
- {
- ui->txtDataServer->append(tr("客户端:[clientID:%1 IP:%2 Port:%3]下线 时间:%4")
- .arg(clientID).arg(IP).arg(Port).arg(QTime::currentTime().toString("hh:mm:ss")));
- ui->cboxClient->removeItem(ui->cboxClient->findText(tr("%1:%2:%3").arg(clientID).arg(IP).arg(Port)));
- }
- void frmMain::on_btnSendServer_clicked()
- {
- QString txt=ui->txtSendServer->text();
- if (txt==""){return;}
- QString str=ui->cboxClient->currentText();
- int clientID=str.split(":")[0].toInt();
- QByteArray tempData;
- if (ui->ckHexSendServer->isChecked())
- {
- tempData=myHelper::HexStrToByteArray(txt);
- tcpServer->SendData(clientID,tempData);
- }
- else
- {
- tempData=txt.toAscii();
- tcpServer->SendData(clientID,tempData);
- }
- }
- void frmMain::on_btnSendClient_clicked()
- {
- QString data=ui->txtSendClient->text();
- if (data!="")
- {
- if (ui->ckHexSendClient->isChecked())
- {
- tcpClient->write(myHelper::HexStrToByteArray(data));
- }
- else
- {
- tcpClient->write(data.toAscii());
- }
- }
- }
- void frmMain::on_btnListen_clicked()
- {
- if (ui->btnListen->text()=="监听")
- {
- bool ok=tcpServer->listen(QHostAddress::Any,ui->txtPortServer->text().toInt());
- if (ok)
- {
- ui->btnListen->setText("停止");
- ui->txtDataServer->append("监听成功");
- ui->btnSendServer->setEnabled(true);
- }
- }
- else
- {
- tcpServer->CloseAllClient();//断开所有已连接的客户端
- tcpServer->close();//停止监听
- ui->btnListen->setText("监听");
- ui->txtDataServer->append("停止监听成功");
- ui->btnSendServer->setEnabled(false);
- }
- }
- void frmMain::on_btnClearServer_clicked()
- {
- ui->txtDataServer->clear();
- }
- void frmMain::on_btnConnect_clicked()
- {
- if (ui->btnConnect->text()=="连接")
- {
- tcpClient->connectToHost(ui->txtIP->text(),ui->txtPortClient->text().toInt());
- if (tcpClient->waitForConnected(1000))
- {
- ui->btnConnect->setText("断开");
- ui->txtDataClient->append("连接服务器成功");
- ui->btnSendClient->setEnabled(true);
- }
- }
- else
- {
- tcpClient->disconnectFromHost();
- if (tcpClient->state() == QAbstractSocket::UnconnectedState || tcpClient->waitForDisconnected(1000))
- {
- ui->btnConnect->setText("连接");
- ui->txtDataClient->append("断开连接成功");
- ui->btnSendClient->setEnabled(true);
- }
- }
- }
- void frmMain::on_btnClearClient_clicked()
- {
- ui->txtDataClient->clear();
- }
- void frmMain::on_cboxMax_currentIndexChanged(int index)
- {
- tcpServer->setMaxPendingConnections(index+1);
- }
- //该片段来自于http://www.codesnippet.cn/detail/140720149976.html
来源: http://www.codesnippet.cn/detail/140720149976.html