网络编程(2)

基于TCP的网络聊天室程序

1、TCP工作原理

如下图所示,TCP能够为应用程序提供可靠的通信连接,使一台计算机发出的字节流无差错地送达网络 上的其他计算机。因此,对可靠性要求高的数据通信系统往往使用TCP传输数据,但在正式收发数据 前,通信双方必须首先建立连接。
网络编程(2)_第1张图片

2、TCP编程模型

下面介绍基于TCP的经典编程模型,TCP客户端与服务器间的交互时序如下图所示。
网络编程(2)_第2张图片

3、接口解析

QTcpSocket类提供Tcp套接字,QTcpSocket也是QAbstractSocket的一个子类,程序可以通过它很方 便的建立TCP连接和发送或接收Tcp数据报。

//在固定端口上与主机建立网络连接
virtual void connectToHost(const QString &hostName, quint16 port, OpenMode
openMode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol)
virtual void connectToHost(const QHostAddress &address, quint16 port, OpenMode
openMode = ReadWrite)
//与主机断开连接
virtual void disconnectFromHost()
//发送数据
qint64 write(const char *data, qint64 maxSize)
qint64 write(const QByteArray &byteArray)
//返回接收到的数据的长度
virtual qint64 bytesAvailable() const
//读取指定长度的数据
qint64 read(char *data, qint64 maxSize)
//信号:在调用 connectToHost()方法之后并且成功建立连接时发送该信号
[signal] void connected()
//信号:TCP套接字连接断开时发送该信号
[signal] void disconnected()
//信号:当收到消息时发送该信号
[signal] void readyRead()

QTcpServer类提供一个基于TCP的服务。此类使接收传入的TCP连接成为可能。可以指定端口或让 QTcpServer自动选择一个端口。也可以监听特定地址或所有计算机地址。

//监听地址为address,端口为port的TCP连接。QHostAddress::Any代表任意地址,如果port值为0,
则自动分配一个端口。
bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
//当有新的连接时发送该信号
[signal] void newConnection()
//若有新的连接则返回true,否则返回false
virtual bool hasPendingConnections() const
//得到下一个等待连接的套接字对象,如果返回null代表当前没有连接对象,和hasPendingConnections
配合使用。
virtual QTcpSocket *nextPendingConnection()
//当有新的连接收到之后会调用该函数。重写该函数可以使用自定义TcpSocket类型。
//socketDescriptor是本地套接字描述符,需要使用QTcpSocket::setSocketDescriptor()与
Socket进行绑定
virtual void QTcpServer::incomingConnection(qintptr socketDescriptor)

4、案例

使用TCP制作一个简易的聊天程序,包含一个客户端和一个服务器。

客户端负责用户登录,服务器负责监听用户登录。聊天信息同时显示在客户端和服务器中。

效果图:
网络编程(2)_第3张图片

你可能感兴趣的:(网络,tcp/ip,服务器)