在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;