哈哈哈,在小女子的一番折腾下,终于把TCPSocket客户端与服务端的小demo整出来了!!
表示很鸡冻!!如下是总结,走过路过不要错过~~
(注:鄙人用的是Qt Quick,不是Qt GUI,Qt版本为Qt5.7)
First,来看看客户端的实现。
1.客户端创建TCP连接的步骤
- new一个QTcpSocket对象出来
- 准备好端口号及IP地址之后,调用connectToHost创建连接
- 启用waitForConnected判断是否连接成功
- 写一个槽函数与信号readyRead连起来,异步读取数据
- 调用write(data)发送数据;
2.以下是客户端的demo
我建了一个客户端的类,类名为TCPClient,在main.cpp中注册了一下这个类,方便跟界面qml交互。
.h文件
#include <QObject>
#include <QTcpSocket>
class TCPClient : public QObject
{
Q_OBJECT
public:
TCPClient();
~TCPClient();
Q_INVOKABLE void setIP(const QString ip);
QString getIP(){return m_ip;}
Q_INVOKABLE void setPort(const int port);
int getPort(){return m_port;}
void onConnected();
void getMsg();
public slots:
void createTcpConnect();
void sendMsg2Sev(const QString msg);
signals:
void showMsg(const QString &msg);
private:
QTcpSocket *m_tcpsocket;
QString m_ip;
int m_port;
};
.cpp文件
#include "tcpclient.h"
#include <QDebug>
TCPClient::TCPClient(){
m_ip = "127.0.0.1";
m_port = 60000;
m_tcpsocket = new QTcpSocket();
/*-<连接信号槽 */
qDebug()<<"create a default TCP client!";
connect(m_tcpsocket,&QTcpSocket::connected,this,&TCPClient::onConnected,Qt::AutoConnection);
connect(m_tcpsocket,&QTcpSocket::readyRead,this,&TCPClient::getMsg,Qt::AutoConnection);
}
TCPClient::~TCPClient(){
m_tcpsocket->deleteLater();
}
void TCPClient::setIP(const QString ip){
m_ip = ip;
qDebug()<<"set IP: "<<ip;
}
void TCPClient::setPort(const int port){
m_port = port;
qDebug()<<"set port: "<<port;
}
void TCPClient::onConnected(){
qDebug()<<"already connect the host : "<<m_ip;
}
/**
* @breaf 与信号QTcpSocket::readyRead信号绑定,异步接收数据
*/
void TCPClient::getMsg(){
qDebug()<<"read sev data-----------------";
QByteArray buffer;
buffer = m_tcpsocket->readAll();/*-<读取数据 */
emit showMsg(buffer); /*-<触发信号,显示在界面上 */
}
/**
* @breaf 创建一个TCP连接
* @param
* @note
*/
void TCPClient::createTcpConnect(){
m_tcpsocket->abort();
m_tcpsocket->connectToHost(m_ip,m_port);/*-<调用connectToHost函数连接指定的IP及端口号 */
if(!m_tcpsocket->waitForConnected(3000))/*-<调用waitForConnected函数判断是否连接成功,ps:不加这个也能连上 */
{
qDebug() << "Connection failed!";
return;
}
}
void TCPClient::sendMsg2Sev(const QString msg){
m_tcpsocket->write(msg.toUtf8()); /*-<调用write函数发送数据 */
m_tcpsocket->flush();
/*-< write函数执行后,其实不一定会把数据写入socket,
* 可能要等到事件循环(main函数的return a.exec())才会写入。
* 如果需要立即写入,要执行QTcpSocket的flush函数。*/
}
Second,再来一个服务端的demo:
1.服务端创建TCP连接的步骤:
- new一个QTcpServer,再new一个QTcpSocket对象出来
- 调用QTcpServer的listen监听端口
- 调用QTcpServer的nextPendingConnection函数获取连接进来的socket
- 然后剩下的就是绑定各种信号槽
我给服务端也建了一个类,类名为TcpSev,同样在main.cpp中注册了这个类。
2.以下是服务端的demo
我给服务端也建了一个类,类名为TcpSev,同样在main.cpp中注册了这个类。
.h文件
#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>
class TcpSev: public QObject
{
Q_OBJECT
public:
TcpSev();
int getPort(){ return m_port;}
Q_INVOKABLE void setPort(int port);
void onConnected();
void getMsg();
void onNewConnected();
public slots:
void listenPort();
void sendMsg2Client(const QString msg);
signals:
void showMsg(const QString &msg);
private:
QTcpServer *m_tcpsev;
QTcpSocket *m_tcpSocket;
int m_port;
};
.cpp文件
#include "tcpsev.h"
#include <QDebug>
TcpSev::TcpSev()
{
m_tcpsev = new QTcpServer();
m_tcpSocket = new QTcpSocket();
m_port = 111;
connect(m_tcpsev,&QTcpServer::newConnection,this,&TcpSev::onNewConnected);
}
void TcpSev::setPort(int port){
m_port = port;
qDebug()<<"set port!";
}
void TcpSev::listenPort(){
m_tcpsev->listen(QHostAddress::Any,m_port);
qDebug()<<"listen-------";
}
void TcpSev::onConnected(){
qDebug()<<"Already connect the client! ";
}
void TcpSev::getMsg(){
qDebug()<<"read client data-----------------";
QByteArray buffer;
buffer = m_tcpSocket->readAll();
emit showMsg(buffer);
}
void TcpSev::onNewConnected(){
qDebug()<<"new connect!";
m_tcpSocket->abort();
m_tcpSocket = m_tcpsev->nextPendingConnection();
qDebug()<<"new connect!"<<m_tcpSocket;
connect(m_tcpSocket,&QTcpSocket::connected,this,&TcpSev::onConnected,Qt::AutoConnection);
connect(m_tcpSocket,&QTcpSocket::readyRead,this,&TcpSev::getMsg,Qt::AutoConnection);
}
void TcpSev::sendMsg2Client(const QString msg){
m_tcpSocket->write(msg.toUtf8());
m_tcpSocket->flush();
}
main.qml中只需要画几个框,填一下端口号、ip地址、调一下类里面的函数,就可以愉快的玩耍了。
放个大招,贡献一下我的源码。