관리 메뉴

Value Creator의 IT(프로그래밍 / 전자제품)

#9 [QT4] Network programming - Server 본문

1. 프로그래밍/3) QT

#9 [QT4] Network programming - Server

valuecreatort 2019. 6. 14. 18:32
반응형

1. QT Fortune Client 예제와 함께 실행하면 서버<->클라이언트 통신을 확인할 수 있다.

 

2. 이 예제에서는 QTcpServer를 사용하여 들어오는 TCP 연결을 허용하고 간단한 QDataStream 기반 데이터 전송 프로토콜을 사용하여 연결을 종료하기 전에 연결 클라이언트 (Fortune 클라이언트 예제)에 임의의 텍스트 메세지를 씁니다.

Fortune 함수는 C언어의 Random함수와 동일한 것 같습니다.

 

 

3. 예제 작동 절차 설명

//1. --> 임의의 port, 임의의 주소로 QTcpServer를 선언

tcpServer = new QTcpServer(this);

 

//2. --> 임의의 메세지를 생성한다.

fortunes << tr("You've been leading a dog's life. Stay off the furniture.")

 

//3. --> 임의의 메세지를 연결된 클라이언트로 보낸다.

connect(tcpServer, SIGNAL(newConnection()), this, SLOT(sendFortune()));

 

//4. --> 클라이언트가 서버에 연결되면, QTcpServer는 QTcpServer::newConnection() 신호를 방출한다. // newConnection 신호는 sendFortune() 슬롯을 호출한다.

void Server::sendFortune()

 

 //5. --> QDataStream을 이용해서 QByteArray로 인코딩한다. 연결된 소켓에 랜덤한 텍스트를 쓴다. QTcpSocket을 이용해서 binary 데이터를 전송한다.

QByteArray block;

QDataStream out(&block, QIODevice::WriteOnly);

out.setVersion(QDataStream::Qt_4_0);

 

//6. --> 데이터 블록의 크기를 16비트 INTEGER 값에 저장한다. 전체 패킷 크기가 얼마인지 클라이언트가 있다.

out << (quint16)0;

out << fortunes.at(qrand() % fortunes.size());

out.device()->seek(0);

out << (quint16)(block.size() - sizeof(quint16));

 

//7. --> nextPendingConnection()을 사용하여 QTcpSocket을 반환한다. 소켓 연결 해제(disconnected) 후에 소켓 삭제(deleteLater)를 확인한다.

QTcpSocket *clientConnection = tcpServer->nextPendingConnection();

connect(clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater()));

 

//8. --> 인코딩된 텍스트는 write 함수로 클라이언트에 쓰여진다.

clientConnection->write(block); 

clientConnection->disconnectFromHost();

// 클라이언트에 텍스트 쓰기가 끝나면 Host연결을 종료한다.

//QTcpSocket은 비동기 적으로 작동하기 때문에 함수가 반환 후에 데이터가 쓰여지고 제어는 Qt의 이벤트 루프로 돌아갑니다.

//그러면 소켓이 닫히고 QObject :: deleteLater ()가 이를 삭제합니다.

 

 

4. 소스코드

fortuneserver.zip
0.04MB

 

5. 원문

 

반응형
Comments