Qt 인터넷 채 팅 방 의 예제 코드 구현
클 라 이언 트
서버
연결 성공 후
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 QTcpSocketQTcpSocket 은 클 라 이언 트 든 서버 든 모두 사용 해 야 하 는 소켓 통신 클래스 입 니 다.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 서버 엔 드
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 클 라 이언 트통신 프로 세 스
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 채 팅 방 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Qt로 문자와 이미지의 혼합 텍스트 그리기텍스트를 그리려면 QPainter::drawText 함수를 사용하지만 텍스트와 동시에 이미지 (아이콘 등)를 함께 그리기를 원합니다. QLabel와 QPushButton는 이미지와 텍스트를 표시하는 기능을 가지고 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.