TCP服务器端
接触QT一段时间了,也写过几个简单的项目,总体上感觉还可以,只是对安卓的支持个人感觉还不行,也可能是我菜,本文记录一下学习过程方便以后回头看,如果对你有所帮助那更好。我没有使用传统的Qwidgets,和Qmainwindow,采用qml语言进行界面设计,下面开始了。
准备工作
第一步,需要在你工程的pro文件中加入QT += network
,我的是QTQuick工程看起来像这样
第二步新建一个类,我的类名是TCPServer
,记得继承QObject并且使用Q_OBJECT
宏
OK下面开始注入灵魂。
服务器相关函数编写
一个简单的TCP服务器其实很简单,包含开始侦听、接收数据、发送数据、停止侦听,跟把大象装冰箱一样。
开始侦听函数:
1.包含相关的头文件
#include <QTcpSocket>
#include <QTcpServer>
2.在我们新建类的构造函数里新建两个对象分别是QTcpServer
类的对象和QTcpSocket
类的对象
这里我定义的方式是 ,在头文件里定义两个public
的指针,然后再构造函数里面再去new
,也可以直接定义,看个人喜好。
3.侦听函数也十分简单,QTcpServer
类里面就包含这个方法,我们直接把IP地址和端口传进去就行了,我输入参数都用的QString
类,方便和qml里面的text进行交互。
停止侦听
不多说了,一看就明白。
往客户端发送消息、从客户端读取消息
1.发送数据到服务器:
第一句qDebug()
是我调试时为了看数据 ,可以不加。
2.接收来自客户端的数据:
这是一个槽函数,因为再socket接收到数据后,会发送一个readReady()信号,我们把这个信号和上面槽函数相连,收到数据后就会触发槽函数处理(这里我写的只是聊天程序,只需要简单读出来,需要处理的时候就可以在这里处理)。
这里读出来之后我手动发射了一个我自己定义的信号,到qml里面去接收,方便我做显示。信号定义如下:
创建连接
还有一个比较容易忽略的东西,就是当有客户端连接到服务器时,服务器要用一个socket去和客户端通信
至此有关服务器的相关函数都已经写完了,如下:
qml与C++交互的补充
public的函数前面加Q_INVOKABLE
,是为了让qml能够访问到这些函数,当然前提是需要把这个类注册到qml成为一个元对象。只需要在main里面加这么一句代码:
qmlRegisterType<TCPServer>("My.tcpserver",1,12,"TcpServer");
<>里面的TCPServer代表的是我们定义的那个类的名字,最后那个“TcpServer”,是注册之后元对象的名字,就像Qml里面的Button
一样,都是一个控件。然后我们只要在qml里面import
一下就可以使用这个控件了。
import My.tcpserver 1.12
我这里接收到来自C++那边发送的data_Is_Coming()
信号,就把接收到的数据显示在一个TextEdit
里面,接收信号地方法就是on
+信号名(首字母变大写),当这个信号触发之后,就会自动进入这个函数。
关于其他一些通过输入框填写IP地址和端口也是,直接在qml用我们注册过来的元对象的id
调用我们之前写好的开始侦听函数,我这里id就在上图中id:tcpserver
TextInput
里面的text是String
类型,等同于QString
,这也是为什么我前面函数输入参数都用QString
,就是为了方便通过qml界面传入。
其他停止侦听和发送数据,都是一样的操作,就不细讲了,我把代码放在下面:
//tcpserver.h
#ifndef TCPSERVER_H
#define TCPSERVER_H
#include <QObject>
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
class TCPServer :public QObject
{
Q_OBJECT
public:
TCPServer();
Q_INVOKABLE void listen_To_Client(const QString &addr,QString port);
Q_INVOKABLE void quit_Listen();
Q_INVOKABLE void send_Data_To_Client(const QString data);
Q_INVOKABLE QByteArray get_Read_Buf();
QByteArray recieve_buf;
QTcpSocket *servertcpsocket;
QTcpServer *tcpserver;
public slots:
void server_New_Connect();
void read_From_Client();
signals:
void successed_Connected_to_Server();
void successed_Disconnected_To_Server();
void data_Is_Coming();
};
#endif // TCPSERVER_H
//tcpserver.cpp
#include "tcpserver.h"
#include <QTcpServer>
#include <QTcpSocket>
#include <QMessageBox>
TCPServer::TCPServer()
{
tcpserver = new QTcpServer();
servertcpsocket = new QTcpSocket;
connect(tcpserver,&QTcpServer::newConnection,this,&TCPServer::server_New_Connect);
}
void TCPServer::listen_To_Client(const QString &addr,QString port)
{
tcpserver->listen(QHostAddress(addr), port.toInt());
}
void TCPServer::quit_Listen()
{
tcpserver->close();
}
void TCPServer::send_Data_To_Client(const QString data)
{
qDebug()<<data.toUtf8();
servertcpsocket-