Qt 网格编程

来源:互联网 发布:带着淘宝混异世 编辑:程序博客网 时间:2024/06/07 06:28

Qt的网络编程具有如下特征:

(1)Qt的网络接口采用C++语言封装,使用起来更加方便。

(2)Qt的网络接口采用事件驱动来实现,进一步提高了易用性。

(3)Qt的网络接口具有更好的跨平台性。


对于面向连接的TCP编程,Qt提供了QTcpSocket和QTcpServer两个类,其中QTcpServer用来实现服务端的监听,QTcpSocket用来实现服务端和客户端的通信。使用QTcpServer建立TCP监听,只需要调用listen即可实现在特定的端口上等待客户端的连接,每个新的连接都会触发newConnection事件。典型的建立监听代码:

server = new QTcpServer();

connect(server, SIGNAL(newConnection()), this, SLOT(my_new_conn()));

server->listen(QHostAddress::Any,m MY_PORT);

当新连接建立的时候,可以调用nextPendingConnection获得一个用于通信的QTcpSocket类,如果只需要等待新数据的到来,就可以对QTcp的readyRead信号进行处理,在接收这个信号的槽函数中调用read函数读取接收的数据。下面示例代码实现了连接信号和槽,并且关闭了监听的socket:

client = server->nextPendingConnection();

connect(client, SIGNAL(readRead()), this, SLOT(my_new_data()));

server->close();

客户端的实现,示例代码:

client = new QTcpSocket(this);

connect(client, SIGNAL(readyRead()), this, SLOT(my_new_data()));

connect(client, SIGNAL(connected()), this,  SLOT(my_new_conn()));

client->connectToHost(ip->text(), MY_PORT);

客户端通过connectToHost函数连接到服务器,其中一个参数是QString类型的ip地址,第二个参数wie整型端口号。当连接建立以后就会发射一个connected()信号,而如果有新数据到来,同样会触发readyRead信号。


对于面向非连接的UDP网络通信程序,使用Qt的QUdpSocket类。使用QUdpSocket作为服务器方式接受客户端的数据必须首先将其绑定到特定的UDP端口。

udp = new QUdpSocket(this);

udp->bind(QHostAddress::LocalHost, MY_PORT);

connect(udp, SIGNAL(readyRead()), this, SLOT(my_new_data()));

其中静态变量QHostAddress::LocalHost表示本机的ipv4地址。

当从udp端口获得数据之后,hasPendingDatagrams函数将返回真,使用pendingDatagramSize函数可以获得接收到数据包的大小,然后可以使用readDatagram函数获得具体的数据包内容:

while(udp->hasPendingDatagrams())

{

QByteArray datagrams;

int len;

len = udp->pendingDatagramSize();

datagram.resize(len);

udp->readDatagram(datagram.data(), len);

}

如果仅需要发送UDP数据包,则可以省略bind函数,直接调用writeDatagram函数发送数据。writeDatagram函数的两种定义:

qint64  writeDatagram(const char* data,  qint64 size, const  QHostAddresss& host,  quint16 port);

qint64 writeDatagram(const QByteArray  & datagram,  const QHostAddress & host, quint16 port)

其中QHostAddress类型的地址可以使用这个类的setAddress函数设置,如 host->setAddress(ip->text());


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


QTcpSocket 详细描述:
QTcpSocket 类提供一个TCP套接字
TCP是一个面向连接,可靠的的通信协议,非常适合于连续不断的数据传递
QTcpSocket 是QAbstractSocket类非常方便的一个子类,让你创建一个TCP连接和数据流交流。
注意:TCP套接字不能以QIODevice::Unbuffered模式来打开

在Symbian系统上,程序想用这个类的话必须拥有NetworkServices平台支持,如果客户机缺少这个能力,将会导致"恐惧"(不明白为什么这么翻译)

成员函数:
QTcpSocket::QTcpSocket ( QObject * parent = 0 )
以UnconnectedState态创建一个QTcpSocket对象
QTcpSocket::~QTcpSocket ()   [virtual]‘
析构函数,销毁对象

QTcpServer类

提供一个TCP基础服务类 继承自QObject
这个类用来接收到来的TCP连接,可以指定TCP端口或者用QTcpServer自己挑选一个端口,可以监听一个指定的地址或者所有的机器地址。
 调用listen()监听所有的连接,每当一个新的客户端连接到服务端就会发射信号newConnection()
调用nextPendingConnection()来接受待处理的连接。返回一个连接的QTcpSocket(),我们可以用这个返回的套接字和客户端进行连接

如果有错误,serverError()返回错误的类型。调用errorString()来把错误打印出来
当监听连接时候,可以调用serverAddress()serverPort()来返回服务端的地址和端口。
调用close()来关闭套接字,停止对连接的监听。‘
尽管QTcpServer大多时候设计使用事件循环,也可以不适用事件循环,可以使用waitForNewConnection(),会一直阻塞,知道一个连接可以用或者超时。
在Symbian平台上,同样的需要NetworkServices平台支持。

成员函数
------------------------------
void close() 关闭服务,然后服务器讲不再监听任何连接
QString errorString()const 错误时候返回错误的字符串
------------------------------
bool hasPendingConnections()const 如果服务端有一个待处理的连接,就返回真,否则返回假
QTcpSocket* nextPendingConnection()
返回一个套接字来处理一个连接,这个套接字作为服务端的一个子对象,意味着当QTcpServer对象销毁时候,这个套接字也自动删除,当使用完后明确的删除这个套接字也好,这样可以避免内存浪费。当没有可处理的连接时候,这个函数返回0。
注意:返回的套接字不能再其他线程中使用。如果想在其他线程中使用,那么你需要重载incomingConnection()
-------------------------------------
void incomingConnection(int socketDescriptor)[virtual protected]
当QTcpServer有一个新连接时候调用这个虚函数,socketDescriptor参数是新连接的套接字描述符
这个函数新建一个QTcpSocket套接字,建立套接字描述符,然后存储套接字在一个整形的待连接链表中。最后发射信号newConnection()
重写这个函数,当一个新连接时候,来调整这个函数的行为。
当服务端使用QNetworkProxy服务器代理时候,使用一般的套接字函数套接字描述符可能不可以用,这时候应该使用 QTcpSocket::setSocketDescriptor()来设置描述符
--------------------------------------
bool isListening()const
当服务端正在监听连接时候返回真,否则返回假
bool listen( const QHostAddress & address = QHostAddress::Any, quint16 port = 0 )
告诉服务端监听所有来自地址为address端口为Port的连接,如果Port为0,那么会自动选择,如果address是QHostAddress::Any,那么服务端监听所有连接,成功返回1,否则返回0
int maxPendingConnections()const
返回最大允许连接数。默认是30
void setMaxPendingConnections(int numConnections)
设定待处理的连接最大数目为numConnections,当超过了最大连接数后,客户端仍旧可以连接服务端,但是服务端不在接受连接,操作系统会把这些链接保存在一个队列中。
-----------------------------------------
QNetworkProxy proxy()const
返回这个套接字的网络代理层。
void setProxy(const QNetworkProxy & networkProxy)
设置这个套接字的网络代理层,进制使用代理时候,使用QNetworkProxy::NoProxy类型,例如server->setProxy(QNetworkProxy::NoProxy);

quint16 serverPort()const      serverAddress()
当服务端正在监听时候,返回服务端的端口和地址

-----------------------------------------
bool waitForNewConnection(int msec=0,bool *timedOut=0)
最大等待msec毫秒或者等待一个新连接可用。如果一个连接可用,返回真,否则返回假。如果msec不等于0,那么超时将会被调用
这是一个阻塞函数,最好用在单线程应用程序中。由于会阻塞。当没有事件循环可用时候,这个函数很好用。
非阻塞的选项和信号newConnection()关联起来。
当msec为-1时候,函数将没有超时。



原创粉丝点击