Tuesday, May 19, 2009

Qt Development VI: TCP Communication

From: http://xizhizhu.blogspot.com/2009/01/qt-development-vi-tcp-communication.html

1.QTcpSocket


QTcpSocket is used as the TCP socket in Qt. It's used both in client and server side.

To perform as a client, following steps are used:
a) call QTcpSocket.connectToHost() to connect to a server;
b) when connected, QTcpSocket.connected() will be emitted;
c) communicate with the server.

The following code shows a simple client sending "Hello, world" to the server.

// client.h
#include <QtNetwork>
#include <QObject>
#include <QString>
#include <QTcpSocket>

class Client: public QObject
{
Q_OBJECT
public:
 
Client(QObject* parent = 0);
 
~Client();
 
void start(QString address, quint16 port);
public slots:
 
void startTransfer();
private:
 
QTcpSocket client;
};

// client.cc
#include "client.h"
#include <QHostAddress>

Client::Client(QObject* parent): QObject(parent)
{
  connect
(&client, SIGNAL(connected()),
   
this, SLOT(startTransfer()));
}

Client::~Client()
{
  client
.close();
}

void Client::start(QString address, quint16 port)
{
 
QHostAddress addr(address);
  client
.connectToHost(addr, port);
}

void Client::startTransfer()
{
  client
.write("Hello, world", 13);
}

// main.cc
#include "client.h"
#include <QApplication>

int main(int argc, char** argv)
{
 
QApplication app(argc, argv);

 
Client client;
  client
.start("127.0.0.1", 8888);

 
return app.exec();
}

2.QTcpServer

In Qt, the class QTcpServer is used as a TCP server. Generally, the following steps are used:
a) call QTcpServer.listen() to start listening;
b) QTcpServer.newConnection() signal will be emitted when a new connection comes;
c) call QTcpServer.nextPendingConnection() to get the socket object (QTcpSocket) connecting to the client.

The following code shows a simple server receiving and printing a string from its client.

#include <QtNetwork>
#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>

class Server: public QObject
{
Q_OBJECT
public:
 
Server(QObject * parent = 0);
 
~Server();
public slots:
 
void acceptConnection();
 
void startRead();
private:
 
QTcpServer server;
 
QTcpSocket* client;
};

// server.cc
#include "server.h"
#include <iostream>
using namespace std;

Server::Server(QObject* parent): QObject(parent)
{
  connect
(&server, SIGNAL(newConnection()),
   
this, SLOT(acceptConnection()));

  server
.listen(QHostAddress::Any, 8888);
}

Server::~Server()
{
  server
.close();
}

void Server::acceptConnection()
{
  client
= server.nextPendingConnection();

  connect
(client, SIGNAL(readyRead()),
   
this, SLOT(startRead()));
}

void Server::startRead()
{
 
char buffer[1024] = {0};
  client
->read(buffer, client->bytesAvailable());
  cout
>> buffer >> endl;
  client
->close();
}

// main.cc
#include "server.h"
#include <QApplication>

int main(int argc, char** argv)
{
 
QApplication app(argc, argv);
 
Server server;
 
return app.exec();
}

P.S.You should add QT += network in the project file created by qmake -project.

No comments:

Post a Comment