#8 [QT4] Network programming - Client
* QT4와 QT5의 소스코드는 호환이 되지 않으니 참고 바랍니다.
1. QtNetwork 모듈이 TCP/IP 클라이언트/서버를 사용할 수 있는 클래스를 제공함.
2. QtNetwork 모듈이 포함하는 클래스
QAbstractSocket --> QTcpSocket
3. QTcpSocket 클래스에서 사용하는 함수
read()
write()
readLine()
readAll()
((QIODevice 클래스에서 상속받은))
getChar()
putChar()
ungetChar()
데이터 전송 : byteWritten() 시그널을 통해 이벤트를 쉽게 호출
데이터 수신 : readyRead() 시그널을 통해 이벤트 제공
소켓 서비스 종료 : disconnectFromHost() 함수 호출, disconnected() 함수 호출
* 서버/클라이언트 간 요청과 응답을 위한 멤버 함수
waitForConnected() : 서버와 클라이언트가 연결될 때까지 블로킹
waitForReadyRead() : 새로운 데이터가 수신될 때까지 블로킹
waitForByteWritten() : 소켓으로부터 데이터가 전송될 때까지 블로킹
waitForDisconnected() : 함수는 연결이 닫힐 때까지 블로킹
4. Fortune Client, Fortune Server 예제(fortune : 랜덤함수 비슷하게 임의 값 도출하는 함수)
4.1 Fortune Client
https://doc.qt.io/archives/qt-4.8/qt-network-fortuneclient-example.html
Fortune Client Example | Qt 4.8
Fortune Client Example The example is intended to be run alongside the Fortune Server example or the Threaded Fortune Server example. This example uses a simple QDataStream-based data transfer protocol to request a line of text from a fortune server (from
doc.qt.io
Fortune Client <-> Fortune Server
클라이언트가 서버에게 메세지를 요청하면, 서버가 클라이언트에게 메세지를 내려준다.
데이터 전송 프로토콜 : QDataStream 사용하여 서버로부터 메세지 한 줄을 요청.
* 연결 절차
1) 서버로 연결하면서 fortune 요청(임의의 메세지 요청)
2) 서버는 16비트 integer 길이의 fortune 메세지 응답.
* QTcpSocket은 두 가지 접근 방법 제공.
1) 비동기 방식(non-blocking)
-> 제어가 Qt 루프 이벤트 반환시 스케줄되고 수행됨.
동작 완료시 신호 발생.
연결 완료시 QTcpSocket이 connected() 반환.
2) 동기 방식(blocking)
-> non-GUI, 멀티스레드 어플리케이션.
wiatFor...() 함수 호출 가능.
호출 스레드
5. 주석 달아놓은 소스코드
6. 아래는 원문