QT实现tcp通信(Server服务器端)

QT实现tcp通信(Server服务器端)

右键点击列表连接的IP可以弹出删除按钮。

客户端参考https://txwtech.blog.csdn.net/article/details/125388830?spm=1001.2014.3001.5502

 QT_TCP_server_full服务器端.rar-QT文档类资源-CSDN下载QT_TCP_server_full服务器端.rarhttps://blog.csdn.net/t更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/txwtech/86269840

头文件:

#ifndef SERVER_H
#define SERVER_H

#include <QMainWindow>
#include <QTcpSocket>
#include <QTcpServer>
#include <QListWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Server;


             }
QT_END_NAMESPACE
class QTcpServer;

class Server : public QMainWindow
{
    Q_OBJECT

public:
    Server(QWidget *parent = nullptr);
    ~Server();

private:
    Ui::Server *ui;

    QTcpServer *tcpServer;
    QTcpSocket *client;
    QList<QTcpSocket *> tcpClients;
    QListWidgetItem *lwdgitem;
    QMenu *iplistMenu;
     QAction* actiondel = NULL;

private slots:
    QString GetLocalIP();
    void on_pushButton_StartToListen_clicked();
    //void on_listView_IP_List_customContextMenuRequested(const QPoint &pos);
    void on_listWidget_IP_customContextMenuRequested(const QPoint &pos);
    void slot_newConnectionClient();
    void slot_readData();
    void slot_disconnectedClient();

    void on_pushButton_Send_clicked();
    void slot_delmenu();
};
#endif // SERVER_H

源文件:

#include "server.h"
#include "ui_server.h"

#include <QtNetwork> //在pro文件里面添加QT+=network
#include <QMessageBox>

Server::Server(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::Server)
{
    ui->setupUi(this);
    tcpServer=new QTcpServer(this);
    QString ip = GetLocalIP();
    if(ip.isEmpty())
    {
        QMessageBox::about(this,tr("提示"),tr("没有获取到本机的IP"));
    }
    else
    {
        ui->lineEdit_Local_IP->setText(ip);
    }
   // QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));


    ui->listWidget_IP->setContextMenuPolicy(Qt::CustomContextMenu);//右键点击,弹出菜单
    ui->label_hostName->setText(tr("HostName:")+QHostInfo::localHostName());
    ui->label_hostName->adjustSize();
    ui->lineEdit_Local_Port->setText(tr("6666"));
    ui->plainTextEdit_Send_Msg->setPlainText("I am Server您好");
    ui->pushButton_StartToListen->setEnabled(true);
    ui->pushButton_Send->setEnabled(false);
    iplistMenu=new QMenu(ui->listWidget_IP);//菜单绑定到列表控件,by txwtech
   // QAction *pnew0 = new QAction(QString::fromLocal8Bit("Delete"),ui->listWidget_IP);
    QAction *pnew0 = new QAction("删除",ui->listWidget_IP);
    iplistMenu->addAction(pnew0);
   // connect( ui->actiondel, SIGNAL(triggered()), this, SLOT(slot_delmenu()));
    connect( pnew0, SIGNAL(triggered()), this, SLOT(slot_delmenu()));
    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(slot_newConnectionClient()));





}
//“删除”菜单,断开指定Client
void Server:: slot_delmenu()
{
    if(  lwdgitem != NULL )
    {
        if( !tcpClients.isEmpty() ){
            QString clientIP = lwdgitem->text().split(":")[0];
            int clientPort = lwdgitem->text().split(":")[1].toInt();
            for(int i=0; i<tcpClients.length(); i++)
            {
                if(tcpClients[i]->peerAddress().toString()==clientIP && tcpClients[i]->peerPort()==clientPort)
                {
                    tcpClients[i]->disconnectFromHost();
                    break;
                }
            }
        }
    }
}

void Server::slot_newConnectionClient()
{
    while(tcpServer->hasPendingConnections())
    {
        QTcpSocket *client=tcpServer->nextPendingConnection();
        tcpClients.append(client);
        ui->listWidget_IP->addItem(tr("%1:%2").arg(client->peerAddress().toString()).arg(client->peerPort()));
        connect(client,SIGNAL(readyRead()),this,SLOT(slot_readData()));
        connect(client,SIGNAL(disconnected()),this,SLOT(slot_disconnectedClient()));

    }
}
void Server::slot_readData()
{
    QTcpSocket *obj=(QTcpSocket*)sender();
    QByteArray buf=obj->readAll();
    if(buf.isEmpty())
        return;
    QString ipc;
    ipc=tr("[%1:%2]").arg(obj->peerAddress().toString()).arg(obj->peerPort());
    ui->textEdit_Recv_Msg->append(ipc);
  //  ui->textEdit_Recv_Msg->append(QString::fromLocal8Bit(buf));
   // toUtf8
    ui->plainTextEdit_Recv_Msg->appendPlainText(ipc);
    ui->plainTextEdit_Recv_Msg->appendPlainText(QString::fromLocal8Bit(buf)); //fromLocal8Bit显示中文,解决乱码



}
void Server::slot_disconnectedClient()
{
  if(!tcpClients.isEmpty())
  {
      QTcpSocket *obj=(QTcpSocket*) sender();

      QListWidgetItem *item=ui->listWidget_IP->findItems(
                  tr("%1:%2")\
                  .arg( obj->peerAddress().toString())\
                  .arg( obj->peerPort()),Qt::MatchContains|Qt::MatchEndsWith
                  ).at(0);
      ui->listWidget_IP->removeItemWidget(item);
      delete item;
      obj->close();
      tcpClients.removeOne(obj);


  }
}


QString Server::GetLocalIP()
{
    QList<QHostAddress> list=QNetworkInterface::allAddresses();
    foreach(QHostAddress address,list)
    {
        if(address.protocol()==QAbstractSocket::IPv4Protocol)
        {
            return address.toString();
        }
    }
    return "";
}

Server::~Server()
{
    delete ui;
}


void Server::on_pushButton_StartToListen_clicked()
{
    if(ui->pushButton_StartToListen->text()=="停止")
    {
        if(!tcpClients.isEmpty())
            for(int i=0;i<tcpClients.length();i++)
            {
                tcpClients[i]->disconnectFromHost();
            }
        tcpClients.clear();
        tcpServer->close();
        ui->listWidget_IP->clear();
        ui->pushButton_StartToListen->setText("监听");
       ui->pushButton_Send->setEnabled(false);





    }
    else
    {
        if(ui->lineEdit_Local_Port->text().toInt()==0)
        {
            QMessageBox::about(this,tr("提示"),tr("请输入端口号"));
        }
        else if(tcpServer->listen(QHostAddress::AnyIPv4,ui->lineEdit_Local_Port->text().toInt()))
        {
            ui->pushButton_StartToListen->setText("停止");
            ui->pushButton_Send->setEnabled(true);
        }




    }

}


void Server::on_listWidget_IP_customContextMenuRequested(const QPoint &pos)
{
    lwdgitem = ui->listWidget_IP->itemAt(pos);
    if(lwdgitem!=NULL)
    {
        iplistMenu->exec(QCursor::pos());
    }



}

void Server::on_pushButton_Send_clicked()
{
    if(ui->listWidget_IP->selectedItems().length()>0)
    {
        foreach(QListWidgetItem* item, ui->listWidget_IP->selectedItems())
        {
            QString clientIP=item->text().split(":")[0];
            int clientPort=item->text().split(":")[1].toInt();
            for(int i=0;i<tcpClients.length();i++)
            {
                if(tcpClients[i]->peerAddress().toString()==clientIP &&tcpClients[i]->peerPort()==clientPort)
                {
                   // tcpClients[i]->write(ui->plainTextEdit_Send_Msg->toPlainText().toUtf8());
                     tcpClients[i]->write(ui->plainTextEdit_Send_Msg->toPlainText().toLocal8Bit());fromLocal8Bit显示中文,解决乱码
                }
            }

        }
    }
    else
    {
        QMessageBox::information(this,"提示","IP列表未选择");
    }



}

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
QT中,可以使用QTcpSocket和QTcpServer类来实现基于TCP的网络通信,其中QTcpSocket用于客户端,QTcpServer用于服务器端服务器端实现步骤: 1. 创建一个QTcpServer对象,并监听指定的IP地址和端口号。 2. 监听到新的连接时,创建一个QTcpSocket对象,并将其与客户端进行连接。 3. 通过QTcpSocket对象进行数据的发送和接收。 客户端实现步骤: 1. 创建一个QTcpSocket对象。 2. 使用QTcpSocket对象与服务器端进行连接。 3. 通过QTcpSocket对象进行数据的发送和接收。 下面是一个简单的示例代码,展示了服务器端和客户端的实现服务器端代码: ```cpp QTcpServer server; server.listen(QHostAddress::Any, 1234); // 监听IP地址和端口号 connect(&server, &QTcpServer::newConnection, [&server]() { QTcpSocket* clientSocket = server.nextPendingConnection(); connect(clientSocket, &QTcpSocket::readyRead, [clientSocket]() { QByteArray data = clientSocket->readAll(); // 处理接收到的数据 qDebug() << "Received data from client: " << data; }); }); ``` 客户端代码: ```cpp QTcpSocket socket; socket.connectToHost("127.0.0.1", 1234); // 连接到服务器的IP地址和端口号 if (socket.waitForConnected()) { socket.write("Hello server"); // 发送数据到服务器 socket.waitForBytesWritten(); } ``` 以上代码只是一个简单的示例,实际应用中可能需要处理更复杂的数据交互和错误处理。需要注意的是,QTcpSocket和QTcpServer类都继承自QObject类,因此可以使用信号与槽机制来处理连接、数据接收等事件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

txwtech笛克特科

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值