Qt下的TCP通信

  • TCP是一种被大多数Internet网络协议(如HTTP和FTP)用于数据传输的低级网络协议,它是可靠的、面向流、面向连接的传输层协议,特别适用于连续数据传输。
  • TCP通信必须先建立TCP连接,通信端分为客户端和服务器端。
  • Qt提供QTcpSocket类和QTcpServer类用于建立TCP通信应用程序。
  • 服务器端程序必须使用QTcpServer用于端口监听,建立服务器;QTcpSocket用于建立连接够使用套接字(Socket)进行通信
  • QTcpServer是从QObject继承的类,它主要用于服务器端建立网络监听,创建网络Socket连接。

QTcpServer类

  • 公有函数

        --void close()

        --bool listen()

        --bool isListening()

        --QTcpSocket* nextPendingConnection()//返回下一个等待接入的连接

        --QHostAddress serverAddress()

        --quint16 serverPort()

        --bool waitForNewConnection()//以阻塞方式等待新连接

  • 信号

        --void acceptError(QAbstractSocket::SocketError socketError)

        --void newConnection()

  • 保护函数

        --void addPendingConnection(QTcpSocket *socket)

        --virtual void incomingConnection(qintptr socketDescriptor)

1. QTcpServer

 1) 开始监听
     bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
     启动监听
 2) 当监听到新客户端接入时,QTcpServer会调用函数 incomingConnection
    void incomingConnection(qintptr socketDescriptor)
    {
           创建QTcpSocket对象
           调用函数addPendingConnection(),将QTcpSocket对象添加到一个内部的套接字列表中
           发射信号 newConnection ()
    }

 3)处理newConnection()信号(定义槽函数)
      void onNewConnection(){
            调用函数nextPendingConnection(),获取一个套接字
            使用该套接字和对应的客户端进行通信
      }

QTcpSocket类

  • QTcpSocket类从QAbstractSocket继承而来。除了构造函数和析构函数,其他函数由基类提供的。QAbstractSocket用于TCP通信的主要接口函数如下:
  • 公有函数

        --void connectToHost(QHostAddress &address,quint16 port)

        --void disconnectFromHost()

        --bool waitForConnected()

        --bool waitForDisconnected()

        --QHostAddress localAddress()

        --quint16 localPort()

        --QHostAddress peerAddress()

        --QString peerName()

        --quint16 peerPort()

        --qint64 readBufferSize()

        --void setReadBufferSize(qint64 size)

        --qint64 betysAvailable()

        --bool canReadLine()

        --QAbstractSocket::SocketState state()

  • 信号

        --void connected():connectToHost()成功连接到服务器后发射此信号

        --void disconnected():当socket断开连接后发射此信号

        --void error(QAbstractSocket::SocketError,socketError):当socket发生错误时发射此信号

        --void hostFound():调用connectToHost()找到主机后发射此信号

        --void stateChanged(QAbstractSocket::SocketState socketState):

        当socket的状态变化时发射此信号,参数socketState表示了socket当前的状态

        --void readyRead():

        当缓冲区有新数据需要读取时发射此信号,在此信号的槽函数里,读取缓冲区的数据

2. QTcpSocket

 1) 开始连接
   void connectToHost(const QHostAddress &address, quint16 port, QIODevice::OpenMode openMode = ReadWrite)
   {
         ①.  Socket在给定的openMode中打开       
         ②.  进入HostLookupState状态
         ③.  执行 address 主机查找
         ④. 如果查找成功,发射信号hostFound(),同时状态进入 ConnectingState状态
         ⑤. 尝试连接到查找到的一个或多个地址
         ⑥. 如果连接成功,状态进入ConnectedState状态,同时发射信号connected()。

        总结:先进行主机查找,然后尝试连接,如果连接成功,会发射信号connected()信号
   }

 2) 断开连接
    void disconnectFromHost()
    {
           ①. 尝试关闭连接
           ②. 如果有待写入数据正在等待写入,进入ClosingState状态,等待,直到所有数据写入完毕.
           ③. 最后,进入UnconnectedState状态,发射信号 disconnected()。
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值