Qt 인터넷 채 팅 방 의 예제 코드 구현

9722 단어 Qt채 팅 방
1.효과 설명
클 라 이언 트

서버

연결 성공 후

2.예비 지식
Qt 에서 네트워크 프로 그래 밍 을 실현 하 는 방식 은 C++또는 C 로 실현 하 는 것 보다 훨씬 편리 하고 간단 합 니 다.Qt 가 이미 우 리 를 위해 봉 인 했 기 때문에 우 리 는 사용 하면 됩 니 다.그리고 여러분 은 Qt 의 신호 슬롯 체 제 를 이해 해 야 합 니 다.제 글 을 참고 하 실 수 있 습 니 다.Qt 신호 슬롯
2.1 QTcpServer
QTcpServer 클래스 는 클 라 이언 트 연결 을 감청 하고 클 라 이언 트 와 연결 하 는 데 사 용 됩 니 다.사용 하기 전에 이 클래스 가 제공 하 는 일반적인 API 함 수 를 소개 합 니 다.
구조 함수

QTcpServer::QTcpServer(QObject *parent = Q_NULLPTR);
감청 의 소켓 에 감청 을 설치 하 다.

bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);
//            ,    true,      false
bool QTcpServer::isListening() const;
//                       ,      QHostAddress::Null
QHostAddress QTcpServer::serverAddress() const;
//            ,         ;     0
quint16 QTcpServer::serverPort() const
인자:
address:클래스 QHostAddress 를 통 해 IPv 4,IPv 6 형식의 IP 주 소 를 봉인 할 수 있 습 니 다.QHostAddress:Any 는 자동 으로 연결 됨 을 표시 합 니 다.
port:0 으로 지정 하면 사용 가능 한 포트 를 무 작위 로 연결 합 니 다.
반환 값:귀속 성공 반환 true,실패 반환 false
클 라 이언 트 와 연결 한 후 통신 에 사용 되 는 QTcpSocket 소켓 소켓 대상 을 받 습 니 다.QTcpServer 의 하위 대상 입 니 다.QTcpServer 대상 을 분석 할 때 이 하위 대상 을 자동 으로 분석 합 니 다.물론 직접 수 동 으로 분석 할 수도 있 습 니 다.사용 한 후에 이 통신 의 QTcpSocket 대상 을 수 동 으로 분석 하 는 것 을 권장 합 니 다.

QTcpSocket *QTcpServer::nextPendingConnection();
클 라 이언 트 가 시작 하 는 연결 요청 을 막 습 니 다.단일 스 레 드 프로그램 에서 사용 하 는 것 을 추천 하지 않 습 니 다.새 연결 을 차단 하지 않 고 처리 하 는 것 을 권장 합 니 다.즉,신호 new Connection()을 사용 하 는 것 을 권장 합 니 다.

bool QTcpServer::waitForNewConnection(int msec = 0, bool *timedOut = Q_NULLPTR);
인자:
msec:차단 의 최대 시간 을 지정 합 니 다.단 위 는 밀리초(ms)입 니 다.
timeout:매개 변 수 를 전달 합 니 다.시간 초과 timeout 이 true 이면 시간 초과 timeout 이 false 입 니 다.
2.2 QTcpServer 신호
새로운 연결 을 받 아들 이 는 데 오류 가 발생 하면 다음 과 같은 신 호 를 보 냅 니 다.socketError 매개 변 수 는 발생 한 오류 와 관련 된 정 보 를 설명 합 니 다.

[signal] void QTcpServer::acceptError(QAbstractSocket::SocketError socketError);
새로운 연결 이 있 을 때마다 new Connection()신 호 를 보 냅 니 다.

[signal] void QTcpServer::newConnection();
2.3 QTcpSocket
QTcpSocket 은 클 라 이언 트 든 서버 든 모두 사용 해 야 하 는 소켓 통신 클래스 입 니 다.Qt 에서 데 이 터 를 보 내 고 받 는 것 도 IO 작업(네트워크 IO)에 속 합 니 다.
구조 함수

QTcpSocket::QTcpSocket(QObject *parent = Q_NULLPTR);
서버 에 연결 하려 면 서버 쪽 에 연 결 된 IP 와 포트 정 보 를 지정 해 야 합 니 다.

[virtual] void QAbstractSocket::connectToHost(const QString &hostName, quint16 port, OpenMode openMode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol);

[virtual] void QAbstractSocket::connectToHost(const QHostAddress &address, quint16 port, OpenMode openMode = ReadWrite);
Qt 에서 읽 기 동작 함수 로 데 이 터 를 받 든 쓰기 함수 로 데 이 터 를 보 내 든 작업 대상 은 모두 로 컬 Qt 프레임 워 크 가 유지 하 는 메모리 입 니 다.따라서 전송 함수 데 이 터 를 호출 하면 반드시 네트워크 에 바로 전송 되 는 것 이 아니 라 수신 함수 도 네트워크 에서 데 이 터 를 직접 받 는 것 이 아니 라 바 텀 에 관 한 조작 은 사용자 가 유지 할 필요 가 없다.
수신 데이터

//             maxSize        data       
qint64 QIODevice::read(char *data, qint64 maxSize);
//             maxSize,        
QByteArray QIODevice::read(qint64 maxSize);
//              ,             
QByteArray QIODevice::readAll();
2.4 QTcpSocket 신호
QTcpSocket 을 사용 하여 소켓 통신 을 하 는 과정 에서 이러한 대상 이 ready Read()신 호 를 보 내 면 엔 드 에서 보 낸 데이터 가 도 착 했 음 을 설명 하고 read 함수 로 데 이 터 를 받 을 수 있 습 니 다.

[signal] void QIODevice::readyRead();
connectToHost()함 수 를 호출 하고 연결 을 성공 적 으로 만 든 후 connected()신 호 를 보 냅 니 다.
소켓 이 연결 을 끊 을 때 disconnected()신 호 를 보 냅 니 다.

   connectToHost()               connected()   。
[signal] void QAbstractSocket::disconnected();
3.통신 프로 세 스
3.1 서버 엔 드
  • 소켓 서버 QTcpServer 대상 생 성
  • QTcpServer 대상 을 통 해 감청 을 설정 합 니 다.즉,QTcpServer::listen()
  • QTcpServer::new Connection()신호 로 새로운 클 라 이언 트 연결 여 부 를 감지 합 니 다
  • 새로운 클 라 이언 트 연결 이 있 으 면 QTcpSocket*QTcpServer::nextPendingConnection()에서 통신 을 받 은 소켓 대상
  • 을 호출 합 니 다.
  • 통신 의 소켓 대상 QTcpSocket 과 클 라 이언 트 를 이용 하여 통신
  • 헤더 파일
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    private slots:
        void on_startServer_clicked();
    
        void on_sendMsg_clicked();
    
    private:
        Ui::MainWindow *ui;
        QTcpServer* m_server;
        QTcpSocket* m_tcp;
    };
    
    원본 파일
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        setWindowTitle("TCP -    ");
        //    QTcpServer   
        m_server = new QTcpServer(this);
        //             
        connect(m_server, &QTcpServer::newConnection, this, [=]()
        {
            m_tcp = m_server->nextPendingConnection();
            ui->record->append("             ...");
            m_status->setPixmap(QPixmap(":/connect.png").scaled(20, 20));
            //           
            connect(m_tcp, &QTcpSocket::readyRead, this, [=]()
            {
                //     
                QString recvMsg = m_tcp->readAll();
                ui->record->append("   Say: " + recvMsg);
            });
            //         
            connect(m_tcp, &QTcpSocket::disconnected, this, [=]()
            {
                ui->record->append("          ...");
                m_tcp->deleteLater();
                m_status->setPixmap(QPixmap(":/disconnect.png").scaled(20, 20));
            });
        });
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    //            
    void MainWindow::on_startServer_clicked()
    {
        unsigned short port = ui->port->text().toInt();
        //        
        m_server->listen(QHostAddress::Any, port);
        ui->startServer->setEnabled(false);
    }
    
    //         
    void MainWindow::on_sendMsg_clicked()
    {
        QString sendMsg = ui->msg->toPlainText();
        m_tcp->write(sendMsg.toUtf8());
        ui->record->append("   Say: " + sendMsg);
        ui->msg->clear();
    3.2 클 라 이언 트
    통신 프로 세 스
  • 통신 의 소켓 클래스 QTcpSocket 대상 만 들 기
  • 서버 쪽 에 연 결 된 IP 와 포트 를 사용 하여 서버 QAbstract Socket::connectToHost()
  • QTcpSocket 대상 과 서버 를 이용 하여 통신
  • 헤더 파일
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    private slots:
        void on_connectServer_clicked();
    
        void on_sendMsg_clicked();
    
        void on_disconnect_clicked();
    
    private:
        Ui::MainWindow *ui;
        QTcpSocket* m_tcp;
    };
    원본 파일
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        setWindowTitle("TCP -    ");
    
        //           
        m_tcp = new QTcpSocket(this);
        //             
        connect(m_tcp, &QTcpSocket::readyRead, [=]()
        {
            //           
            QByteArray recvMsg = m_tcp->readAll();
            ui->record->append("   Say: " + recvMsg);
        });
            
        //                
        connect(m_tcp, &QTcpSocket::connected, this, [=]()
        {
            ui->record->append("  ,        !!!");
            m_status->setPixmap(QPixmap(":/connect.png").scaled(20, 20));
        });
            
        //                 
        connect(m_tcp, &QTcpSocket::disconnected, this, [=]()
        {
            ui->record->append("          , ...");
            ui->connectServer->setEnabled(true);
            ui->disconnect->setEnabled(false);
        });
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    //                 
    void MainWindow::on_connectServer_clicked()
    {
        QString ip = ui->ip->text();
        unsigned short port = ui->port->text().toInt();
        //      
        m_tcp->connectToHost(QHostAddress(ip), port);
        ui->connectServer->setEnabled(false);
        ui->disconnect->setEnabled(true);
    }
    
    //                
    void MainWindow::on_sendMsg_clicked()
    {
        QString sendMsg = ui->msg->toPlainText();
        m_tcp->write(sendMsg.toUtf8());
        ui->record->append("   Say: " + sendMsg);
        ui->msg->clear();
    }
    
    //                 
    void MainWindow::on_disconnect_clicked()
    {
        m_tcp->close();
        ui->connectServer->setEnabled(true);
        ui->disconnect->setEnabled(false);
    }
    Qt 가 인터넷 채 팅 방 을 실현 하 는 예제 코드 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Qt 채 팅 방 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기