一、结构设计
1,组成
二、编程实现
1,主界面类
1,创建服务端
server = new Server ( this , port) ;
connect ( server, & Server:: pixmapChange, this , & MonitorServer:: receiveAnJianJiPixmap) ;
connect ( server, & Server:: deviceErrorInfoChange, this , & MonitorServer:: showDeviceErrorInfo) ;
connect ( server, & Server:: receiveHeart, this , & MonitorServer:: receiveHeart) ;
2,服务器类
1,监听
Server :: Server ( QObject* parent, int port) : QTcpServer ( parent)
{
listen ( QHostAddress:: Any, port) ;
}
2,创建套接字连接客户端
void Server :: incomingConnection ( qintptr socketDescriptor)
{
TcpClientSocket* tcpclientsocket = new TcpClientSocket ( this ) ;
tcpclientsocket-> setSocketDescriptor ( socketDescriptor) ;
tcpclientsocketlist. append ( tcpclientsocket) ;
connect ( tcpclientsocket, & TcpClientSocket:: clientDisconnected, this , & Server:: slotclientdisconnect) ;
connect ( tcpclientsocket, & TcpClientSocket:: receivePixmapMessage, this , & Server:: receivePixmapMessage) ;
connect ( tcpclientsocket, & TcpClientSocket:: receiveDeviceErrorMessage, this , & Server:: receiveDeviceErrorMessage) ;
connect ( tcpclientsocket, & TcpClientSocket:: receiveHeart, this , & Server:: receiveHeartMessage) ;
}
3,如果有客户端断开连接,将列表中的套接字删除
void Server :: slotclientdisconnect ( int descriptor)
{
for ( int i = 0 ; i < tcpclientsocketlist. count ( ) ; i++ ) {
QTcpSocket* item = tcpclientsocketlist. at ( i) ;
if ( item-> socketDescriptor ( ) == descriptor) {
tcpclientsocketlist. removeAt ( i) ;
return ;
}
}
return ;
}
3,套接字类
1,监控是否有数据可接收,以及套接字连接状态
TcpClientSocket :: TcpClientSocket ( QObject* parent) : QTcpSocket ( parent)
{
connect ( this , & TcpClientSocket:: readyRead, this , & TcpClientSocket:: recvdata) ;
connect ( this , & TcpClientSocket:: disconnected, this , & TcpClientSocket:: slotclientdisconneceted) ;
}
2,接收消息数据
void TcpClientSocket :: recvdata ( )
{
QByteArray buffer = readAll ( ) ;
messageBuffer. append ( buffer) ;
analysisMessage ( ) ;
}