LiunxQT开发篇—QT网络编程TCP实现(二)服务端代码

需要包含三个头文件

#include <QTcpServer>
#include <QTcpSocket>
#include <QString>

需要添加一个模块

QT       += core gui network

在这里插入图片描述

使用到了两个类(QTcpServer、QTcpSocket)

QTcpServer Class
QTcpSocket Class

声明两个对象

QTcpServer *tcpServer;
QTcpSocket *tcpSocket;

涉及到的信号:

tcpServer:

newConnection()(This signal is emitted every time a new connection is available.)(这个信号在每次有新的连接可用时发出。)

tcpSocket:

readyRead()(This signal is emitted once every time new data is available for reading from the device’s current read channel.)(每当有新的数据可以从设备当前的读通道读取时,这个信号就会发出一次。)

程序大致流程图

在这里插入图片描述

widget.cpp程序

#include "widget.h"
#include "ui_widget.h"
/*构造函数*/
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);

    tcpServer = new QTcpServer(this);
    tcpSocket = new QTcpSocket(this);
    
    /*信号与槽的关联,此处信号为newConnection(),槽函数为newConnection_Slot()*/
    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(newConnection_Slot()));
}
/*建立新连接槽函数*/
void Widget::newConnection_Slot()
{
    
    
     tcpSocket = tcpServer->nextPendingConnection();
     /*信号与槽的关联,此处信号为readyRead(),槽函数为readyRead_Slot()*/
     connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));
}
/*读取数据槽函数*/
void Widget:: readyRead_Slot()
{
    
    
    QString buf;
    buf = tcpSocket->readAll();
    ui->recvEdit->appendPlainText(buf);
}
/*析构函数*/
Widget::~Widget()
{
    
    
    delete ui;
}
/*按键槽函数*/

/*打开(监听)服务器*/
void Widget::on_openBt_clicked()
{
    
    
   tcpServer->listen(QHostAddress::Any,ui->portEdit->text().toUInt());
}
/*关闭服务器*/
void Widget::on_closeBt_clicked()
{
    
    
    tcpServer->close();
}
/*发送信息到客户端*/
void Widget::on_pushButton_clicked()
{
    
    
    tcpSocket->write(ui->sendEdit->text().toLocal8Bit().data());
}

main.cpp程序

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    
    
    QApplication a(argc, argv);
    Widget w;
    w.setWindowTitle("服务器");/*更改窗口名*/
    w.show();

    return a.exec();
}

widget.h程序

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QString>

namespace Ui {
    
    
class Widget;
}
class Widget : public QWidget
{
    
    
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    QTcpServer *tcpServer;
    QTcpSocket *tcpSocket;

private slots:
/*槽函数*/
    void on_openBt_clicked();
    void newConnection_Slot();
    void readyRead_Slot();
    void on_closeBt_clicked();
    void on_pushButton_clicked();
private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

注:

1、connect函数

函数声明
 bool QObject::connect ( const QObject * sender, const char * signal, 
		 const QObject * receiver, const char * member ) [static]
参数:

(1)const QObject * sender
填写对象名
(2)const char * signal
填写信号名。
格式:SIGNAL(xxx),xxx填写信号名。
(3)const QObject * receiver
this关键字是一个指向对象自己的一个指针
(4)const char * member
填写槽函数名。
格式:SLOT(xxx),xxx填写槽函数名。

例子:
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(newConnection_Slot()));

2、readAll函数

无参数。

从设备中读取所有剩余数据,并将其作为字节数组返回。
这个函数没有报告错误的方法;返回一个空的QByteArray可能意味着当前没有数据可供读取,或者发生了错误。

返回值:

成功读取,将数据作为字节数组返回。失败读取,返回一个空的QByteArray可能意味着当前没有数据可供读取,或者发生了错误。

例子:
/*将读取的数据存入buf*/
QString buf;
buf = tcpSocket->readAll();

3、listen函数

告诉服务器在地址地址和端口端口上监听传入的连接。如果“port”为“0”,则自动选择端口。如果address是QHostAddress::Any,服务器将监听所有的网络接口。成功回报真;否则返回false。

函数声明:
bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
参数:

(1)address
允许接入的地址。如果address是QHostAddress::Any,服务器将监听所有的网络接口。
(2)port
端口号。如果“port”为“0”,则自动选择端口。

返回值:

成功回报真;否则返回false。

例子:
tcpServer->listen(QHostAddress::Any,ui->portEdit->text().toUInt());

4、write函数

(Writes data from a zero-terminated string of 8-bit characters to the device. Returns the number of bytes that were actually written, or -1 if an error occurred.)
(将以0结束的8位字符串的数据写入设备。返回实际写入的字节数,如果发生错误则返回-1。)

函数声明
write(const char *data)
返回值
返回实际写入的字节数,如果发生错误则返回-1
例子:
 tcpSocket->write(ui->sendEdit->text().toLocal8Bit().data());

5、close

(Closes the server. The server will no longer listen for incoming connections.)
关闭服务器。服务器将不再监听传入的连接。

例子:
tcpServer->close();

实现效果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44933419/article/details/114479962
今日推荐