服务器:
// 有新客户连接时进行的处理(糟)
void newConnHandleSlot()
{
QTcpSocket * tcpSocket= tcpServer->nextPendingConnection();
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(receiveDataSlot()));
}
// 有新数据来时进行的处理(糟)
void receiveDataSlot()
{
if(tcpSocket->bytesAvailable()>0) // **** 问题在这里 **** //
{
// 这里进行读数据操作
// ...
}
}
上面 // **** 问题在这里 **** // 标记行中的 tcpSocket 怎么确定是那个客户的 tcpSocket ?
换句话说就是,当有数据过来时(即收到readyRead()信号时)怎么确定用哪一tcpSocket来调用bytesAvailable()读取数据?
------解决方案--------------------
sender()获取发送信号QOjbect,用qobject_cast转成QTcpSocket 就可以了
QObject * QObject::sender() const [protected]
------解决方案--------------------
新写一个类socketToClient
class SocketToClient
{
public:
setSocket(QTcpSocket * s);
private:
QTcpSocket * tcpSocket
private slots:
void receiveDataSlot();
};
setSocket中连接槽
connect tcpSocket -> receiveDataSlot
然后在你的newConnHandleSlot()中这样:
QTcpSocket * tcpSocket= tcpServer->nextPendingConnection();
SocketToClient *stc = new socketToClient;
stc->setSocket(tcpSocket)
------解决方案--------------------
最好用一个表来存储所有的SocketToClient
发心跳包来管理,上线,下线
------解决方案--------------------
建一个qtcpsocket的list 然后在有连接的时候保存handle 判断handle
------解决方案--------------------
QTcpSocket *connection = qobject_cast<QTcpSocket*>(sender());
根据connection->peerAddress()或者端口啥的,区分数据来自那个客户端