阅读背景:

Qt 实现TcpServer与TcpClient

来源:互联网 
我的生活,我的点点滴滴!!
#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 



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: