同时实现了QTcpSocket、QWebSocket和QLocalSocket的简单通讯deamon,支持自动获取本机ip,多个客户端交互。在这个基础上你可以自己加错误检测、心跳发送、包封装解析和客户端自动重连等功能。
获取本机电脑ip:
QString Widget::getIp()
{
QString hostName=QHostInfo::localHostName();//主机信息查询:返回本机主机名
QHostInfo hostInfo=QHostInfo::fromName(hostName);//通过主机名称,获取IP地址,返回一个hostInfo类
QString localIP="";//本地IP地址string数组
QList<QHostAddress> addList=hostInfo.addresses();//创建一个QList对象,容器内部存储QHostAddress类型的数据,返回一个address数组,QHostAddress类提供一个IP地址的信息,包括IPv4和Ipv
if (!addList.isEmpty())
{
for (int i=0;i<addList.count();i++)
{
QHostAddress aHost=addList.at(i);//访问指定位置的元素
//测试
//qDebug()<<aHost.toString();
if (QAbstractSocket::IPv4Protocol==aHost.protocol()) //protocol()返回IP地址的协议类型,并且只返回IPv4的地址
{
localIP=aHost.toString();//返回IP地址的字符串
break;
}
}
}
qDebug()<<localIP;
return localIP;
}
tcpsocket
介绍:TCP/IP: TCP(Transmission Control Protocol,传输控制协议),IP(Internet Protocol 网络协议)。TCP提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量,是一种流控制。
优点:
1、高效率:QTcpSocket利用了Qt的事件驱动架构,确保数据传输的高效处理。它会自动管理套接字的读写操作,并利用底层操作系统的能力进行优化。
2、实时性:对于需要实时通讯的应用程序,提供低延迟的数据传输。
3、异步操作:不会阻塞事件循环,从而允许其他事件同时处理。
4、跨平台。
tcp服务器连接介绍:
1、定义并创建接收的信号与槽:
//创建tcp服务器对象
m_tcpServer = new QTcpServer(this);
//捕获客户端连接
connect(m_tcpServer,SIGNAL(newConnection()),this,SLOT(slottcpNewConnection()));
2、开启监听ip和端口
m_tcpServer->listen(QHostAddress(ui->tcpip->text()),ui->tcpport->text().toInt());
3、接入连接进来的客户端,并配置接收。
//获取新的连接对象
QTcpSocket *tcpSocket = m_tcpServer->nextPendingConnection();
//捕获客户端发送数据的信号
connect(tcpSocket,&QTcpSocket::readyRead,this,[&]()
{
QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());
QString val = socket->readAll();
});
//捕获客户端断开的信号
connect(tcpSocket,&QTcpSocket::disconnected,this,[=]()
{
});
}
4、发送数据
tcpSocket->write(ui->tcpsendedit->text().toLatin1());
tcp客户端连接流程
1、定义并连接ip和端口
m_tcpSocket = new QTcpSocket(this);
m_tcpSocket->connectToHost(QHostAddress(ui->tcpip->text()),ui->tcpport->text().toInt());
2、绑定连接、断开连接和接收的信号与槽
connect(m_tcpSocket,&QTcpSocket::connected,this,[=]()
{
});
connect(m_tcpSocket,&QTcpSocket::disconnected,this,[=]()
{
});
connect(m_tcpSocket,&QTcpSocket::readyRead,this,&Widget::slotTcpReadData);
3、发送
m_tcpSocket->write(ui->tcpsendedit->text().toLatin1());
websowcket
介绍:WebSocket 是一种网络传输协议,可在单个 TCP 连接上进行全双工通信,位于 OSI 模型的应用层,广泛地应用在即时通讯/IM、实时音视频、在线教育和游戏等领域。
优点:
1、较少的控制开销:在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小;
2、更强的实时性:由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于 HTTP 请求需要等待客户端发起请求服务端才能响应,延迟明显更少;
3、保持连接状态:与 HTTP 不同的是,WebSocket 需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息;
4、更好的二进制支持:WebSocket 定义了二进制帧,相对 HTTP,可以更轻松地处理二进制内容;
5、可以支持扩展:WebSocket 定义了扩展,用户可以扩展协议、实现部分自定义的子协议。
websowcket服务器连接流程
1、定义并创建接收的信号与槽:
//使用给定的serverName构造一个新的QWebSocketServer。该服务器名称将在HTTP握手阶段被用来识别服务器。它可以为空,此时不会将服务器名称发送给客户端。
//SslMode指示服务器是通过wss(SecureMode)还是ws(NonSecureMode)运行。QWebSocketServer::SecureMode服务器以安全模式运行(通过wss);QWebSocketServer::NonSecureMode服务器以非安全模式运行(通过ws)
m_webServer = new QWebSocketServer("",QWebSocketServer::NonSecureMode,this);
connect(m_webServer,SIGNAL(newConnection()),this,SLOT(slotWebNewConnect()));
2、开启监听ip和端口
m_webServer->listen(QHostAddress(ui->webip->text()),ui->webport->text().toInt());
3、接入连接进来的客户端,并配置接收。
QWebSocket* webSocket = m_webServer->nextPendingConnection();
connect(webSocket,&QWebSocket::disconnected,this,[=]()
{
});
connect(webSocket,&QWebSocket::textMessageReceived,this,[=](QString val)
{
});
4、发送数据
webSocket>sendTextMessage(ui->websendedit->text());//sendBinaryMessage发送二进制数据。
websocket客户端连接流程
1、定义并连接ip和端口
m_webSocket = new QWebSocket("");
m_webSocket->open(QUrl(QString("ws://%1:%2").arg(ui->webip->text()).arg(ui->webport->text())));
2、绑定连接、断开连接和接收的信号与槽
connect(m_webSocket,&QWebSocket::connected,this,[=]()
{
});
connect(m_webSocket,&QWebSocket::disconnected,this,[=]()
{
});
connect(m_webSocket,&QWebSocket::textMessageReceived,this,&Widget::slotwebReadData);
3、发送
m_webSocket->sendTextMessage(ui->websendedit->text());//sendBinaryMessage发送二进制数据。
localsocket
介绍:在windows它是一个命名管道,在unix中它是一个本地socket。
优点:
1、简单的 API。
2、跨平台。
3、安全性:在 Unix 系统上,本地套接字通信是基于文件系统的权限系统的,因此可以提供一定程度的安全性。
4、异步操作:不会阻塞事件循环,从而允许其他事件同时处理。
本地通信服务器连接流程
1、定义并创建接收的信号与槽:
//创建本地服务器对象
m_localServer = new QLocalServer(this);
//捕获客户端连接
connect(m_localServer,SIGNAL(newConnection()),this,SLOT(slotlocalnewConnection()));
2、开启监听key值
QLocalServer::removeServer(m_oldKey); //删除已有的连接
m_localServer->listen(ui->localkey->text()); //监听客户端
m_oldKey = ui->localkey->text();
3、接入连接进来的客户端,并配置接收。
if (m_localServer->hasPendingConnections())
{
//获取新的连接对象
QLocalSocket* localSocket = m_localServer->nextPendingConnection();
//捕获客户端发送数据的信号
connect(localSocket,&QLocalSocket::readyRead,this,[&]()
{
QLocalSocket* socket = qobject_cast<QLocalSocket*>(sender());
QString val = socket->readAll();
});
//捕获客户端断开的信号
connect(localSocket,&QLocalSocket::disconnected,this,[=]()
{
});
}
4、发送
localSocket->write(ui->tcpsendedit->text().toLatin1());
本地通信客户端连接流程
1、定义并连接key值
m_localSocket = new QLocalSocket(this);
m_localSocket->connectToServer(ui->localkey->text(),QIODevice::ReadWrite);
2、绑定连接、断开连接和接收的信号与槽
connect(m_localSocket,&QLocalSocket::connected,this,[=]()
{
});
connect(m_localSocket,&QLocalSocket::disconnected,this,[=]()
{
});
connect(m_localSocket,&QLocalSocket::readyRead,this,&Widget::slotlocalReadData);
3、发送
m_localSocket->write(ui->localsendedit->text().toLatin1());