如何解决QTcpServer或QTcpClient在服务器端知道,已连接的客户端现在已断开连接
| 在下面的代码中,我可以确定客户端是否已连接,并且在QTableWidget中添加了一行,但是我怎么知道客户端已断开连接,因此我可以从同一表中删除一行断开连接的客户端。Tcpserver::Tcpserver(QWidget *parent) :QDialog(parent),ui(new Ui::Tcpserver)
{
ui->setupUi(this);
m_coSerSo =new CoServerSocket(this);
count=0;
connect(m_coSerSo,SIGNAL(newConnection()),this,SLOT(updateConnectionTable()));
}
Tcpserver::~Tcpserver()
{
delete ui;
}
void Tcpserver::updateConnectionTable()
{
int row = ui->tableWidget->rowCount();
ui->tableWidget->setRowCount(row + 1);
ui->tableWidget->setItem(row,new QTableWidgetItem(m_coSerSo->getPeerAdd()));
ui->tableWidget->setItem(row,1,new QTableWidgetItem(QDateTime::currentDateTime ().toString()));
}
CoServerSocket::CoServerSocket(QObject *parent)
: QTcpserver(parent)
{ peerAdd =\"good1\";
}
void CoServerSocket::incomingConnection(int socketId)
{
socketClient = new CoClientSocket(this);
socketClient->setSocketDescriptor(socketId);
peerAdd = socketClient->peerAddress().toString();
}
QString CoServerSocket::getPeerAdd()
{
return peerAdd;
}
解决方法
您在ѭ1inside中创建的套接字具有
disconnected()
信号。使用QSignalMapper
确定哪个套接字已断开连接并更新表视图。快速而肮脏的代码,可能有用,并且肯定充满语法错误:
TcpServer::TcpServer(QWidget *parent) :
QDialog(parent),ui(new Ui::TcpServer)
{
ui->setupUi(this);
m_coisSerSo = new CoisServerSocket(this);
count = 0;
// The mapper forwards the signal from the client socket,// adding the socket itself as an argument.
this->mapper = new QSignalMapper(this);
connect(this->mapper,SIGNAL(mapped(QObject*)),this,SLOT(clientDisconnected(QObject*)));
connect(m_coisSerSo,SIGNAL(newConnection()),SLOT(updateConnectionTable()));
}
void CoisServerSocket::incomingConnection(int socketId)
{
socketClient = new CoisClientSocket(this);
socketClient->setSocketDescriptor(socketId);
// Map the socket so that we can receive its disconnection
// notification. When the socket emits the \"disconnected()\"
// signal,the mapper will emit \"mapped(QObject*)\" and will
// pass the socket as the argument.
this->mapper->setMapping(socketClient,socketClient);
connect(socketClient,SIGNAL(disconnected()),this->mapper,SLOT(map()));
peerAdd = socketClient->peerAddress().toString();
}
void CoisServerSocket::clientDisconnected(QObject* object)
{
if (CoisClientSocket* client = qobject_cast<CoisClientSocket*>(object))
{
// Unmap the socket.
this->mapper->removeMappings(client);
// Handle disconnection here.
...
// A consequence of mixing a TCP server and a dialog in the
// same class is that passing \"this\" as an argument to the
// socket constructor doesn\'t help much with memory management.
// They will stay around as long as the dialog lives. Delete
// them once they aren\'t needed anymore.
client->deleteLater();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。