#include "server.h"
#include <QDebug>
Server::Server(QObject *parent):QTcpServer(parent)
{
}
//新的客户端连接到服务器,则新建一个socket对象用以实例化客户端
void Server::incomingConnection(qintptr socketDescriptor)
{
TcpClientSocket *tcpClientSocket = new TcpClientSocket(this);
connect(tcpClientSocket,SIGNAL(updateClients(QHostAddress,QString)),this,SLOT(updateClients(QHostAddress,QString)));
connect(tcpClientSocket,SIGNAL(disconnected(int)),this,SLOT(slotDisconnected(int)));
tcpClientSocket->setSocketDescriptor(socketDescriptor);
tcpClientSocketList.append(tcpClientSocket);
//新客户端进来,触发更新信号,这个信号函数是自己定义的,可以显示目前有多少个客户端在线
emit updateServer(tcpClientSocketList.count());
}
//有客户端发送数据进来了,可以在这里处理数据,然后发送到界面显示。
void Server::updateClients(QHostAddress ip,QString msg)
{
//TODO 这里可以进行一些逻辑处理
//把信息转发给主界面显示
emit sendreceivedClientDataToMainWindow(ip.toString(),msg);
}
void Server::acceptSendDataFromInputToClient(QString msg)
{
for(int i=0;i<tcpClientSocketList.count();i++)
{
QTcpSocket *item = tcpClientSocketList.at(i);
item->write(msg.toLocal8Bit());
}
}
//客户端断连接触发信号,如果该客户端断链,则从IP队列中删除该客户端IP
void Server::slotDisconnected(int descriptor)
{
for(int i=0;i<tcpClientSocketList.count();i++)
{
QTcpSocket *item = tcpClientSocketList.at(i);
if(item->socketDescriptor()==descriptor)
{
tcpClientSocketList.removeAt(i);
}
}
emit updateServer(tcpClientSocketList.count());
}
//获取本机IP地址函数,这个函数可以获得当前电脑的IP地址
QString Server::getHostIpAddress()
{
QString strIpAddress;
QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
int nListSize = ipAddressesList.size();
for (int i = 0; i < nListSize; ++i)
{
if (ipAddressesList.at(i) != QHostAddress::LocalHost &&
ipAddressesList.at(i).toIPv4Address()) {
strIpAddress = ipAddressesList.at(i).toString();
break;
}
}
if (strIpAddress.isEmpty())
strIpAddress = QHostAddress(QHostAddress::LocalHost).toString();
return strIpAddress;
}