简述
qt中为网络编程提供了一个QtNetwork类,使用QtNetwork可以实现ftp文件传输,基于tcp/ip协议的客户端和(服务端)开发等等,本文基于QtNetwork中的tcp/ip协议实现的简单版网络调试助手。
使用模块时需要在pro工程文件中加入:
QT += network
效果
TCP服务端
QT对TCP/IP协议进行了封装,因此使用Qt创建一个TCP服务端变得简单。创建一个TCP服务端分为以下几个步骤:
- 新建一个socket,绑定新的客户端连接槽
- 监听
- 收发消息
头文件:
#ifndef TCPSERVER_H
#define TCPSERVER_H
#include <QObject>
class QTcpServer;
class QTcpSocket;
class QTextEdit;
class TCPServer : public QObject
{
Q_OBJECT
public:
explicit TCPServer(QString ip="127.0.0.1",quint16 port=8080,QObject *parent = nullptr);
~TCPServer();
void listen();
int getConnectNum();
void setQTextEdit(QTextEdit *_edit);
void setip(QString _ip);
void setport(quint16 _port);
void sendData(QString data);
void sendData(QString ip,QString data);
void closeServer();
signals:
void connectfilsh();
void disconnectfilsh();
protected slots:
void newClient();
private:
QString ip;
quint16 port;
QTcpServer *tcpserver=nullptr;
QList<QTcpSocket *> clientlist;
QTextEdit *eidt=nullptr;
};
#endif
源文件
#include "tcpserver.h"
#include <QtNetwork>
#include <QTcpServer>
#include <QTcpSocket>
#include <QDebug>
#include <QString>
#include <QTextEdit>
#include <QMessageBox>
TCPServer::TCPServer(QString ip,quint16 port,QObject *parent) : QObject(parent),ip(ip),port(port)
{
tcpserver=new QTcpServer();
connect(tcpserver,&QTcpServer::newConnection,this,&TCPServer::newClient);
}
TCPServer::~TCPServer()
{
if(tcpserver)
{
tcpserver->close();
delete tcpserver;
}
}
void TCPServer::listen()
{
bool r=tcpserver->listen(QHostAddress(this->ip),this->port);
if(r==false)
{
QMessageBox::information(nullptr,QStringLiteral("提示"),QStringLiteral("开启失败!"));
return;
}
else
{
emit connectfilsh();
}
}
int TCPServer::getConnectNum()
{
return clientlist.length();
}
void TCPServer::setQTextEdit(QTextEdit *_edit)
{
this->eidt=_edit;
}
void TCPServer::setip(QString _ip)
{
this->ip=_ip;
}
void TCPServer::setport(quint16 _port)
{
this->port=_port;
}
void TCPServer::sendData(QString data)
{
for(auto cli:clientlist)
{
cli->write(data.toUtf8());
}
}
void TCPServer::sendData(QString ip, QString data)
{
for(auto cli:clientlist)
{
if(cli->peerAddress().toString().contains(ip))
{
cli->write(data.toLocal8Bit());
break;
}
}
}
void TCPServer::closeServer()
{
if(tcpserver)
{
tcpserver->close();
emit disconnectfilsh();
}
}
void TCPServer::newClient()
{
QTcpSocket * client=tcpserver->nextPendingConnection();
clientlist.push_back(client);
connect(client,&QTcpSocket::readyRead,this,[this,client]{
QString data =QString::fromLocal8Bit(client->readAll());
if(eidt)
eidt->append(data+"\n");
});
connect(client,&QTcpSocket::disconnected,this,[this,client]{
QString address= client->peerAddress().toString();
client->close();
clientlist.removeOne(client);
});
}
TCP客户端
创建一个TCP客户端的步骤为:
- 新建一个客户端(QTcpSocket),绑定readyRead信号
- 连接至服务端(connectToHost)
- 收发数据
头文件
#ifndef TCPCLIENT_H
#define TCPCLIENT_H
#include <QObject>
class QTcpSocket;
class QTextEdit;
class QTimer;
class TCPClient : public QObject
{
Q_OBJECT
public:
explicit TCPClient(QString ip,quint16 port,QObject *parent = nullptr);
~TCPClient();
void connectServer();
void setQTextEdit(QTextEdit *_edit);
void setip(QString _ip);
void setport(quint16 _port);
void sendData(QString data);
void close();
signals:
void connectfilsh();
void disconnectfilsh();
public slots:
void readData();
void checkConnectState();
private:
QTcpSocket *client=nullptr;
QTextEdit *edit=nullptr;
QString ip;
quint16 port;
QTimer *timer=nullptr;
};
#endif
源文件
#include "tcpclient.h"
#include <QTcpSocket>
#include <QTextEdit>
#include <QMessageBox>
#include <QTimer>
TCPClient::TCPClient(QString ip,quint16 port,QObject *parent) : QObject(parent),ip(ip),port(port)
{
client=new QTcpSocket();
connect(client,&QTcpSocket::readyRead,this,&TCPClient::readData);
timer=new QTimer();
connect(timer,&QTimer::timeout,this,&TCPClient::checkConnectState);
timer->start(1000);
}
TCPClient::~TCPClient()
{
if(client)
delete client;
if(timer)
{
timer->stop();
delete timer;
}
}
void TCPClient::connectServer()
{
client->connectToHost(ip,port);
if(!client->waitForConnected())
{
QMessageBox::information(nullptr,QStringLiteral("提示"),QStringLiteral("连接失败,错误代码:")+QString::number(client->error()));
delete client;
client=nullptr;
}
else
{
emit connectfilsh();
}
}
void TCPClient::setQTextEdit(QTextEdit *_edit)
{
this->edit=_edit;
}
void TCPClient::setip(QString _ip)
{
this->ip=_ip;
}
void TCPClient::setport(quint16 _port)
{
this->port=_port;
}
void TCPClient::sendData(QString data)
{
if(client)
client->write(data.toLocal8Bit());
}
void TCPClient::close()
{
if(client)
{
client->close();
emit disconnectfilsh();
}
}
void TCPClient::readData()
{
QString data=QString::fromLocal8Bit(client->readAll());
edit->append(data+"\n");
}
void TCPClient::checkConnectState()
{
if(client)
{
if(client->state()==QAbstractSocket::UnconnectedState)
{
client->close();
emit disconnectfilsh();
}
}
}
源码链接
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)