我的生活,我的点点滴滴!!
#include "tcpserver.h"#include <QDebug>#include <QHostAddress>const int kPort = 22222;const QString connectflag = "server return message: connect server is ok!";const QString hasconnect = "I'm still connect";const int kBase = 1000;const char *socketErrors[100] = {"ConnectionRefusedError", "RemoteHostClosedError", "HostNotFoundError", "SocketAccessError", "SocketResourceError", "SocketTimeoutError", "DatagramTooLargeError", "NetworkError", "AddressInUseError", "SocketAddressNotAvailableError", "UnsupportedSocketOperationError", "ProxyAuthenticationRequiredError", "SslHandshakeFailedError", "UnfinishedSocketOperationError", "ProxyConnectionRefusedError", "ProxyConnectionClosedError", "ProxyConnectionTimeoutError", "ProxyNotFoundError", "ProxyProtocolError", "UnknownSocketError" };TcpServer::TcpServer(QObject *parent) : QObject(parent), m_tcpserver(NULL), m_hearttime(5), m_startHeartTime(false){ m_userlist.clear(); initserver();}void TcpServer::initserver(){ //启动一个tcpserver m_tcpserver = new QTcpServer(this); //监听 if( !m_tcpserver->listen(QHostAddress::Any, kPort) ) { qDebug() << "listen error: " << m_tcpserver->errorString(); return; } else { qDebug() << "server start is ok!"; } //来一个客户端连接,就会产生一个slot connect(m_tcpserver, SIGNAL(newConnection()), this, SLOT(slot_newConnection())); m_timer = new QTimer(); connect(m_timer, SIGNAL(timeout()), this, SLOT(slot_updateUserList()));}void TcpServer::slot_newConnection(){ //得到每一个连接成功的客户段socket套接字 QTcpSocket *newtcpsocket = m_tcpserver->nextPendingConnection(); if( NULL == newtcpsocket ) { qDebug() << "socket is error"; return ; } m_tcpsocket = newtcpsocket; QHostAddress address = newtcpsocket->peerAddress(); QString clientIp = address.toString(); qDebug() << "clientIp: " << clientIp; qDebug() << "currnet user count: "<< m_userlist.size(); if( m_userlist.size() > 0 ) { qDebug() << "they is :"; } QMap<QString, QTcpSocket*>::Iterator iter; for(iter = m_userlist.begin(); iter != m_userlist.end(); ++ iter) { qDebug() << iter.key(); } if( NULL == m_userlist[clientIp] ) { qDebug() << "new user join it's ip: " << clientIp; m_userlist.insert(clientIp, newtcpsocket); connect(newtcpsocket, SIGNAL(readyRead()), this, SLOT(slot_readdata())); connect(newtcpsocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(slot_errors(QAbstractSocket::SocketError))); if( "" != clientIp ) { senddata(newtcpsocket, connectflag); } if( false == m_startHeartTime ) { //qDebug() << "start heart time"; startHeart(); m_startHeartTime = true; } }}void TcpServer::startHeart(){ int socketcount = m_userlist.size(); if( socketcount > 0 ) { m_timer->start(m_hearttime * kBase); } else { m_startHeartTime = false; m_timer->stop(); }}void TcpServer::slot_updateUserList(){ QMap<QString, QTcpSocket*>::Iterator iter; for(iter = m_userlist.begin(); iter != m_userlist.end(); ) { //senddata() QAbstractSocket::SocketState curstate = (*iter)->state(); if( QAbstractSocket::UnconnectedState == curstate || QAbstractSocket::ClosingState == curstate ) { qDebug() << "erase close socket"; iter = m_userlist.erase(iter); } else { ++iter; } }}void TcpServer::senddata(QTcpSocket *newtcpsocket, const QString &str){ int len = newtcpsocket->write(str.toAscii()); if( len > 0 ) { QString userip = newtcpsocket->peerAddress().toString(); qDebug() << "user "<< userip << "has connected ok"; }}void TcpServer::slot_readdata(){ QTcpSocket *newtcpsocket = static_cast<QTcpSocket*>(this->sender()); QString recvbuf = ""; recvbuf = newtcpsocket->readAll(); QString clientip = newtcpsocket->peerAddress().toString();// if( recvbuf == "I'm will disconnect" )// {// m_userlist.remove(clientip);// return ;// } qDebug() << "user " << clientip << "sendText: " << recvbuf; newtcpsocket->write("server return message:send text is sucess!");}void TcpServer::slot_errors(QAbstractSocket::SocketError errors){ QString displays = ""; QTcpSocket *newtcpsocket = static_cast<QTcpSocket*>(this->sender()); //发生错误时,服务端踢掉出错socket m_userlist.remove(newtcpsocket->peerAddress().toString()); qDebug() << "user " << newtcpsocket->peerAddress().toString() << " is left.."; if( errors == 1 ) { return ; } else if( -1 == errors ) { displays = socketErrors[19]; } else { displays = socketErrors[errors]; }}#include "tcpserver.h"#include