<Qt>实例:TCP网络传输

来源:互联网 发布:全景补地软件 编辑:程序博客网 时间:2024/05/17 23:09

一、概览


分为服务端和客户端端:


二、服务端


1、UI界面



2、头文件

#ifndef TCPSERVER_H#define TCPSERVER_H#include <QWidget>#include <QTcpServer>#include <QTcpSocket>#include <QList>namespace Ui {class TcpServer;}class TcpServer : public QWidget{    Q_OBJECTpublic:    explicit TcpServer(QWidget *parent = 0);    ~TcpServer();private slots:    void on_startBt_clicked();    void new_client();    void on_sendBt_clicked();    void read_data();    void client_dis();private:    Ui::TcpServer *ui;    QTcpServer* mserver;    QTcpSocket* msocket;    QList<QTcpSocket *> sockets;};#endif // TCPSERVER_H

3、main.cpp

#include "tcpserver.h"#include <QApplication>int main(int argc, char *argv[]){    QApplication a(argc, argv);    TcpServer w;    w.show();    return a.exec();}

4、Tcpserver.cpp

#include "tcpserver.h"#include "ui_tcpserver.h"#include <QMessageBox>#include <QDebug>TcpServer::TcpServer(QWidget *parent) :    QWidget(parent),    ui(new Ui::TcpServer){    ui->setupUi(this);    //初始化QTcpServer对象    mserver = new QTcpServer();    //关联客户端链接信号    connect(mserver,SIGNAL(newConnection()),this, SLOT(new_client()));    ui->sendBt->setEnabled(false);}TcpServer::~TcpServer(){    delete ui;}/*开启服务器*/void TcpServer::on_startBt_clicked(){    //检测是否已经监听    if(mserver->isListening())    {        //如果监听就关闭        mserver->close();        ui->startBt->setText("开启");        ui->portEdit->setEnabled(true);        return ;    }    if(ui->portEdit->text().isEmpty())    {        //提示输入端口号        QMessageBox::warning(this, "提示","请输入端口号");        return ;    }    bool flag = mserver->listen(QHostAddress::Any,ui->portEdit->text().toShort());    if(flag)    {        //监听成功        ui->startBt->setText("关闭");        ui->portEdit->setEnabled(false);    }}/*客户端链接,触发槽函数, 接受链接,得到与客户端通信的套接字(QTcpSocket)*/void TcpServer::new_client(){    qDebug()<<"新客户端链接";    msocket = mserver->nextPendingConnection();    //给客户端发送数据    msocket->write("hello");    //关联读数据信号    connect(msocket,SIGNAL(readyRead()),this, SLOT(read_data()));    //客户端掉线会发送disconnected信号    connect(msocket,SIGNAL(disconnected()),this,SLOT(client_dis()));    //获取客户端IP地址    QString ip = msocket->peerAddress().toString();    ui->listWidget->addItem(ip);    //把客户端套接字添加到列表sockets中    sockets.append(msocket);    //启用发送按钮    ui->sendBt->setEnabled(true);    ui->listWidget->setCurrentRow(0);}/*发送数据*/void TcpServer::on_sendBt_clicked(){    //获取选择的客户端    int row = ui->listWidget->currentRow();    QString msg = ui->sendEdit->toPlainText();    sockets.at(row)->write(msg.toLatin1());}/*读取数据*/void TcpServer::read_data(){    //信号发送者--掉线客户端套接字    QTcpSocket *sock = (QTcpSocket*)sender();    QString msg = sock->readAll();    QString ip = sock->peerAddress().toString();    ui->recvList->addItem(ip+":\n\t"+msg);}/*当客户端掉线的时候会调用此函数*/void TcpServer::client_dis(){    //信号发送者--掉线客户端套接字    QTcpSocket *sock = (QTcpSocket*)sender();    //从sockets列表中找到套接字所在的位置    int row = sockets.indexOf(sock);    //根据行从ip列表中删除Ip    QListWidgetItem *item  = ui->listWidget->takeItem(row);    delete item;    //把掉线套接字从列表sockets中删除    sockets.removeOne(sock);    if(ui->listWidget->count() == 0)        ui->sendBt->setEnabled(false);}


三、客户端

1、UI界面



2、头文件

#ifndef TCPCLIENT_H#define TCPCLIENT_H#include <QWidget>#include <QTcpSocket>namespace Ui {class TcpClient;}class TcpClient : public QWidget{    Q_OBJECTpublic:    explicit TcpClient(QWidget *parent = 0);    ~TcpClient();private slots:    void on_connectBt_clicked();    void on_sendBt_clicked();    void read_data();    void on_clearBt_clicked();    void connect_to_server();    void disconnect_from_server();private:    Ui::TcpClient *ui;    QTcpSocket *msocket;};#endif // TCPCLIENT_H

3、main.cpp

#include "tcpclient.h"#include <QApplication>int main(int argc, char *argv[]){    QApplication a(argc, argv);    TcpClient w;    w.show();    return a.exec();}

4、Tcpclient.cpp

#include "tcpclient.h"#include "ui_tcpclient.h"TcpClient::TcpClient(QWidget *parent) :    QWidget(parent),    ui(new Ui::TcpClient){    ui->setupUi(this);    //初始化QTcpSocket对象    msocket = new QTcpSocket();    //关联接收数据信号    connect(msocket,SIGNAL(readyRead()),this, SLOT(read_data()));    //如果链接成功会发送connected信号    connect(msocket,SIGNAL(connected()),this, SLOT(connect_to_server()));    //如果掉线会发送disconnected信号    connect(msocket,SIGNAL(disconnected()),this,SLOT(disconnect_from_server()));    //发送按钮禁用    ui->sendBt->setEnabled(false);}TcpClient::~TcpClient(){    delete ui;}/*链接服务器*/void TcpClient::on_connectBt_clicked(){    if(ui->connectBt->text() == "关闭")    {        msocket->disconnectFromHost();        return ;    }    QString ip = ui->ipEdit->text();    int port = ui->portEdit->text().toInt();    //链接服务器    msocket->connectToHost(ip, port);//如果链接成功会发送connected信号}void TcpClient::on_sendBt_clicked(){    //获取输入的内容    QString msg = ui->textEdit->toPlainText();    msocket->write(msg.toLatin1());    ui->textEdit->clear();}/*读取数据*/void TcpClient::read_data(){    QString msg=msocket->readAll();    ui->listWidget->addItem(msg);}void TcpClient::on_clearBt_clicked(){    ui->textEdit->clear();}/*链接服务器成功*/void TcpClient::connect_to_server(){    //禁用ip,port修改    ui->ipEdit->setEnabled(false);    ui->portEdit->setEnabled(false);    ui->connectBt->setText("关闭");    //启用发送按钮    ui->sendBt->setEnabled(true);}/*断开服务器*/void TcpClient::disconnect_from_server(){    ui->ipEdit->setEnabled(true);    ui->portEdit->setEnabled(true);    ui->connectBt->setText("链接");    ui->sendBt->setEnabled(false);}


四、运行测试:



原创粉丝点击