Qt:TCP通信、UDP通信

在Qt 进行网络编程首先需要在 .pro文件添加: QT += network

TCP: 传输控制协议(Transmission Control Protocol)
是一种面向连接(连接导向)的、可靠的、基于字节流的运输层通信协议。
在Qt上利用TCP进行网络通信:
客户端:

tcpSocket=NULL;
//分配控件,指定父对象
tcpSocket=new QTcpSocket(this);

使用connectToHost主动和服务器建立连接:

tcpSocket->connectToHost(QHostAddress(ip),port);

成功连接时通信套接字会自动触发connected():

connect(tcpSocket,&QTcpSocket::connected,[=](){
        ui->textEditRead->setText("成功连接");
    });

使用write发送数据:

tcpSocket->write((str.toUtf8().data()));

接收到数据时通信套接字会自动触发readyRead(),需要在对应的槽函数做接收处理:

connect(tcpSocket,&QTcpSocket::readyRead,[=](){
        //获取对方发送的内容
        QByteArray array=tcpSocket->readAll();
        //追加到编辑区中
        ui->textEditRead->append(array);
    });

主动和服务器断开连接:

tcpSocket->disconnectFromHost();
tcpSocket->close();//关闭通信套接字

服务器:同时需要监听套接字和通信套接字

tcpServer=NULL;
tcpSocket=NULL;
//监听套接字,指定父对象,让其自动回收空间
tcpServer=new QTcpServer(this);
tcpServer->listen(QHostAddress::Any,8888);

连接成功时会触发newConnection()信号:
取出套接字才能使用readyRead()信号获得信息。

connect(tcpServer,&QTcpServer::newConnection,[=](){
        //取出建立好连接的套接字
        tcpSocket=tcpServer->nextPendingConnection();
        //获取对方的IP和端口
        QString ip =tcpSocket->peerAddress().toString();
        qint16 port=tcpSocket->peerPort();
        QString temp=QString("[%1:%2]:成功连接").arg(ip).arg(port);
        ui->readtext->setText(temp);
        connect(tcpSocket,&QTcpSocket::readyRead,[=](){
            //先取出套接字才能再处理
            //从通信套接字中取出内容
            QByteArray array=tcpSocket->readAll();
            ui->readtext->append(array);
        });
    });

发送数据和断开连接也是使用write()和disconnectFromHost()方法。

UDP:用户数据报协议(User Datagram Protocol)
是一种轻量级、无连接、不可靠、快速传输的传输层协议。
适用:
1.网络数据大多为短消息 2.拥有大量客户端 3.对数据安全性无特殊要求 4.网络负担重但要求响应速度高

在Qt上利用UDP进行网络通信:
UDP没有特定的发送端和接收端,仅执行向特定的ip发送报文的功能,所以仅需知道对方IP地址和端口号,不需要建立连接。

1.bind()用于绑定IP和端口:

udpSocket->bind(QHostAddress::AnyIPv4,2333);

2.接收数据:当对方发送数据过来时,套接字自动触发readyRead()信号,使用readDatagram()读取接收到的数据。
3.发送数据:使用writeDatagram()。
使用标准的QIODevice中的read(),readLine(),write()这些函数,要使用connectToHost().,直接连接socket。
4.加入某个组播 组播地址是D类地址

udpSocket->joinMulticastGroup(QHostAddress("224.0.0.2"));
udpSocket->leaveMulticastGroup();//退出组播

获取本机IP地址:

//会输出结果为192.168.136.121和127.0.0.1,排除本机地址
QList<QHostAddress> list = QNetworkInterface::allAddresses();
        foreach(QHostAddress address,list){
           if(address.protocol() == QAbstractSocket::IPv4Protocol&&address.toString()!="127.0.0.1"){
               QString localip=address.toString();
               qDebug()<<localip;
        }
        else if(address.isNull())
               continue;}

QString localHost = QHostInfo::localHostName();
QHostInfo info = QHostInfo::fromName(localHost);
//QHostInfo的address函数获取本机ip地址
info.addresses();
        foreach(QHostAddress address,info.addresses()){
           if(address.protocol() == QAbstractSocket::IPv4Protocol){
               QString localip=address.toString();
               qDebug()<<localip;
        }
        else if(address.isNull())
               continue;}
//获取主机名
qDebug()<<localHost;

你可能感兴趣的:(Qt,qt,tcp/ip,udp)