1、socket通信
Qt中也提供TCP/UDP的套接字通信,使用时需要包含网络模块和对应的头文件
1、在项目文件中添加
QT += network
2、在代码中添加
#include <QtNetwork>
2、套接字分类
1、TCP流式套接字--------------QTcpSocket
2、UDP数据包套接字--------------QUdpSocket
应用层网络的相关类
QNetworkRequest QNetworkReplay QNetworkAccessManager
3、TCP网络通信的实现
(1)服务器
1、创建一个TCP服务对象
mServer = new QTcpServer;
2、调用QTcpServer对象的接口进行监听
mServer->listen(QHostAddress::Any(IP地址),端口号);
//当客户端链接上来时,会触发信号(newConnection),连接到信号和槽
3、在槽函数中获取和客户端通信的套接字
mSocket = nServer->nextPandingConnection();
4、和客户端通信
发送:
通过QTcpSocket对象的write成员函数发送数据
接收:
收到数据会触发信号(readyRead),在连接的槽函数中调用QTcpSocket对象的read/readAll接收
(2)客户端
1、创建一个QTcpSocket对象
mSocket= new QTcpServer;
2、通过QTcpSocket对象成员函数connectToHost连接服务器
mSocket->connectToHost(ip,端口号);
//连接成功后成功触发connected信号
3、和服务器通信
发送:
通过QTcpSocket对象的write成员函数发送数据
接收:
收到数据会触发信号(readyRead),在连接的槽函数中调用QTcpSocket对象的read/readAll接收
udp:
(1)服务器(recv)
1、创建QUdpSocket对象
mSocket = new QUdpSocket;
2、绑定通信地址
mSocket->bind(ip , 端口号);
3、通信(先接收)
收到数据会触发信号(readyRead),通过QUdpSocket对象的readDatagram函数来接收
//readDatagram(首地址(),长度,发送方ip,发送方端口号);
(2)客户端(send)
1、创建QUdpSocket对象
mSocket = new QUdpSocket;
2、通信(先发送)
writeDatagram(数据,接收方ip,接收方端口号);
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QUdpSocket>
#include <QTcpSocket>
#include <QTcpServer>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
sock = new QUdpSocket;
conect(sock,&QUdpSocket::readyRead,this,&MainWindow::readRead);
sock->bind(QHostAddress("127.0.0.1"),9988);//sock绑定了一个地址和一个端口
sock->writeDatagram("hello",5,QHostAddress("127.0.0.1"),9999); //发送hello给地址和9999端口
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::readRead()
{
char buf[100] = {0};
sock->readDatagram(buf,100,NULL,NULL);// buf接受数据
qDebug() << "read::" << buf ;
}
Tcp:
客户端:
MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
sock = new QTcpSocket;
connect(sock,&QTcpSocket::readyRead,this,&MainWindow::onRead); //有人发信息给sock就转
//到槽函数onRead
sock->bind(QHostAddress("127.0.0.1") , 9988);//sock绑定ip和端口
sock->connectToHost(QHostAddress("127.0.0.1") , 9999); //sock去连接上ip为127.0.0.1和
//端口为9999的服务器
sock->write("hello tcp",9);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::onRead()
{
char buf[100] = {0};
sock->read(buf,100);
qDebug() <<"read:: " <<buf;
}
服务器:
MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ser = new QTcpServer;
connect( ser , &QTcpServer::newConnection,this,&MainWindow::onConnection);
ser->listen(QHostAddress("192.168.21.21"),8899);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::onReady()
{
char buf[100] = {0};
sock->read(buf,100);
qDebug() << buf;
}
void MainWindow::onConnection()
{
sock = ser->nextPendingConnection();
connect(sock , &QTcpSocket::readyRead,this,&MainWindow::onReady);
sock->write("hello client",12);
}