QT编写tcp通信工具(Server端)

本文实例为大家分享了QT编写Server端的tcp通信工具的具体代码,供大家参考,具体内容如下

1.说明

使用qt写一个类似网上常见的网络调试工具。此篇为Server端。Client端在上一篇。

2.基本流程

新建QTcpServer对象,为其newConnection信号写槽函数。此为新的Client连接信号,在其对应槽函数里使用nextPendingConnection方法获取Client对象,并为Client添加readyRead(读数据),disconnected(断开连接)两个信号写槽函数。

开始监听使用Server的listen方法,停止监听使用Server的close方法。

主动断开某个连接可使用Client对象的disconnectFromHost方法。需要注意的是,这会触发disconnected信号。应小心处理,避免重复删除链表,导致程序崩溃。

3.代码

这是mainwindow.cpp文件

#include "mainwindow.h"
#include <QApplication>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->splitter->setStretchFactor(0,2);
    ui->splitter->setStretchFactor(1,1);
    tcpServer = new QTcpServer(this);
    //qWarning()<<QNetworkInterface().allAddresses();
    QString ip=getLocalip();
    if( ip.isEmpty() )
    {
        QMessageBox::about(this,tr("提示"),tr("无本地IP。") ) ;
    }
    else{
 
        ui->ledtIp->setText( ip );   //本地IP
    }
    ui->labHostName->setText(tr("HostName:")+ QHostInfo::localHostName() );
    ui->labHostName->adjustSize();
    ui->ledtPort->setText(tr("8080"));
    ui->btnOpen->setEnabled(true);
    ui->btnSend->setEnabled(false);
    iplistMenu = new  QMenu(  ui->lwdgClientsIp );
    iplistMenu->addAction(ui->actiondel);
    connect( ui->actiondel, SIGNAL(triggered()), this, SLOT(slot_delmenu()));
    connect(tcpServer, SIGNAL(newConnection()), this, SLOT(slot_newConnectionClient()));
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
//获取本地IP
/*
QString MainWindow::getLocalip()
{
    QHostInfo info = QHostInfo::fromName( QHostInfo::localHostName() );
    foreach(QHostAddress addr,info.addresses())
    {
        if(addr.protocol()==QAbstractSocket::IPv4Protocol)
        {
            return  addr.toString();
        }
    }
    return "";
}
*/
QString MainWindow::getLocalip()
{
    QList<QHostAddress> list = QNetworkInterface::allAddresses();
    foreach (QHostAddress address, list)
    {
        if( address.protocol() == QAbstractSocket::IPv4Protocol)
        {
            return address.toString();
        }
    }
        return "";
}
 
//处理来自新的client连接
void MainWindow::slot_newConnectionClient()
{
    while (tcpServer->hasPendingConnections())
    {
        QTcpSocket *client = tcpServer->nextPendingConnection();
        tcpClients.append(client);
 
        ui->lwdgClientsIp->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 MainWindow::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->teRecive->appendPlainText(ipc);
    ui->teRecive->appendPlainText(buf);
}
 
//断开连接处理
void  MainWindow::slot_disconnectedClient()
{
    if( !tcpClients.isEmpty() ){
        QTcpSocket *obj = (QTcpSocket*)sender();
        QListWidgetItem *item =  ui->lwdgClientsIp->findItems(
            tr("%1:%2")\
            .arg( obj->peerAddress().toString())\
            .arg( obj->peerPort()),Qt::MatchContains|Qt::MatchEndsWith
            ).at(0);
 
        ui->lwdgClientsIp->removeItemWidget( item );
        delete item;
        obj->close();
        tcpClients.removeOne(obj);
    }
}
 
//打开监听与停止
void MainWindow::on_btnOpen_clicked()
{
    if(ui->btnOpen->text() == "停止")//主动停止监听
    {
 
        if( !tcpClients.isEmpty() )
        for(int i=0; i<tcpClients.length(); i++)//断开所有连接
        {
            tcpClients[i]->disconnectFromHost(); //会触发disconnected信号
        }
        tcpClients.clear();
        tcpServer->close();
        ui->lwdgClientsIp->clear();
        ui->btnOpen->setText("监听");
        ui->btnSend->setEnabled(false);
    }else{ //打开监听
        if(  ui->ledtPort->text().toInt() == 0 )
        {
            QMessageBox::about(this,tr("提示"),tr("请输入端口号。") ) ;
        }
        else
        if( tcpServer->listen( QHostAddress::AnyIPv4  , ui->ledtPort->text().toInt() ) )
        {
            ui->btnOpen->setText("停止");
            ui->btnSend->setEnabled(true);
        }
    }
}
 
//发送数据,UTF8模式
void MainWindow::on_btnSend_clicked()
{
    if( ui->lwdgClientsIp->selectedItems().length() >0 ){
        foreach( QListWidgetItem* item ,ui->lwdgClientsIp->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->teSend->toPlainText().toUtf8() );
                    break;
                }
            }
        }
    }
}
//“删除”菜单,停止某个Client
void MainWindow:: 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 MainWindow::on_lwdgClientsIp_customContextMenuRequested(const QPoint &pos)
{
    lwdgitem=ui->lwdgClientsIp->itemAt(pos ) ;//判断是否在项目上
    if(  lwdgitem != NULL )
    {
        iplistMenu->exec(QCursor::pos());
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • QT网络编程Tcp下C/S架构的即时通信实例

    先写一个客户端,实现简单的,能加入聊天,以及加入服务器的界面. #ifndef TCPCLIENT_H #define TCPCLIENT_H #include <QDialog> #include <QListWidget> #include <QLineEdit> #include <QPushButton> #include <QLabel> #include <QGridLayout> #include <QtNetWo

  • QT网络通信TCP客户端实现详解

    本文实例为大家分享了QT网络通信TCP客户端实现的具体代码,供大家参考,具体内容如下 QT中基于TCP套接字的网络通信需要用到两个类 QTcpServer:服务器类,用于监听客户端连接和客户端建立连接 QTcpSocket:通信套接字类,客户端和服务端都需要使用* 这两个类都属于网络通信的network需要在工程路径下添加network QT += core gui network 服务器 mainwindow.cpp #include "mainwindow.h" #include

  • QT编写tcp通信工具(Client篇)

    本文实例为大家分享了QT编写tcp通信工具的具体实现代码,Client篇,供大家参考,具体内容如下 1.说明 使用qt写一个类似网上常见的网络调试工具.此篇为Client端.下一遍再写Server端. 2.基本流程 Client端相对简单:创建QTcpSocket对象,为对象的readyRead,error,connected(可选)分别写槽函数,以处理读数据,错误,连接成功三个事件. 连接使用对象的connectToHost方法,断开使用disconnectFromHost方法. 程序不做编码

  • 基于QT的TCP通信服务的实现

    目录 一.结构 1.1 套接字 1.2 socket通信流程 1.3 QTcpsocket 1.4 QTcpServer 二.设计UI 2.1 客户端UI 2.2 服务器端UI 三.核心代码 四.效果图 一.结构 1.1 套接字 应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进程可能需要 通过同一个TCP协议端口传输数据.为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字

  • Qt网络编程实现TCP通信

    Qt网络编程实现TCP通信,供大家参考,具体内容如下 标签(空格分隔): Tcp通信 一.Tcp简介 (1)TCP(Transmission Control Protocol,传输控制协议)TCP是一个用于数据传输的传输层网络协议,多个网络协议包括(HTTP和FTP都是基于TCP协议),TCP是面向数据流和连接的可靠的传输协议,它区别于传输层的另外一个协议UDP(具体可看—Qt简单实现UDP通信) . (2)QTcpSocket继承自QAbstractSocket,与QUdpSocket传输的数

  • QT5实现简单的TCP通信的实现

    目录 一.客户端 二.服务器 三.运行结果 这段时间用到了QT的TCP通信,做了初步的学习与尝试,编写了一个客户端和服务器基于窗口通信的小例程. 使用QT的网络套接字需要.pro文件中加入一句: QT += network 一.客户端 1.客户端的代码比服务器稍简单,总的来说,使用QT中的QTcpSocket类与服务器进行通信只需要以下5步: (1)创建QTcpSocket套接字对象 socket = new QTcpSocket(); (2)使用这个对象连接服务器 socket->connec

  • Qt TCP网络通信学习

    TCP简介: Transmission Control Protocol,传输控制协议 .用于数据传输的低层网络协议,多个物联网协议都是基于TCP协议的.它是一个面向数据流和连接的可靠传输协议. TCP头部格式: QTcpSocket类为TCP提供了一个接口,继承自QAbstractSocket.可实现POP3.SMTP.NNTP等标准的网络协议,也可以实现自定义的网络协议.异步工作,依靠事件循环来检测到来的数据,并且自动刷新输出的数据.而QAbstractSocket继承自QIODevice,

  • QT编写tcp通信工具(Server端)

    本文实例为大家分享了QT编写Server端的tcp通信工具的具体代码,供大家参考,具体内容如下 1.说明 使用qt写一个类似网上常见的网络调试工具.此篇为Server端.Client端在上一篇. 2.基本流程 新建QTcpServer对象,为其newConnection信号写槽函数.此为新的Client连接信号,在其对应槽函数里使用nextPendingConnection方法获取Client对象,并为Client添加readyRead(读数据),disconnected(断开连接)两个信号写槽

  • 基于Java编写串口通信工具

    最近一门课要求编写一个上位机串口通信工具,我基于Java编写了一个带有图形界面的简单串口通信工具,下面详述一下过程,供大家参考 ^_^ 一: 首先,你需要下载一个额外的支持Java串口通信操作的jar包,由于java.comm比较老了,而且不支持64位系统,这里推荐Rxtx这个jar包(32位/64位均支持). 官方下载地址:http://fizzed.com/oss/rxtx-for-java (注:可能需要FQ才能下载) 不能FQ的童鞋,可以在这里下载: http://xiazai.jb51

  • Qt实现简单的TCP通信

    这段时间用到了QT的TCP通信,做了初步的学习与尝试,编写了一个客户端和服务器基于窗口通信的小例程. 使用QT的网络套接字需要.pro文件中加入一句: QT += network 一.客户端 1.客户端的代码比服务器稍简单,总的来说,使用QT中的QTcpSocket类与服务器进行通信只需要以下5步: (1)创建QTcpSocket套接字对象 socket = new QTcpSocket(); (2)使用这个对象连接服务器 socket->connectToHost(IP, port); (3)

  • Qt网络编程之TCP通信及常见问题

    本文为作者在开发项目时对Qt的TCP通信部分的总结,主要包含TCP服务器收发数据的demo,解决TCP拆包和黏包问题的解决方案,以及对接收到的QByteArray数据的转换. 简介 TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接,也就是我们常听到的三次握手.TCP的目的是实现快速.安全的信息传递,因此在协议中针对针对数据安全做了很多处理,很适合应用在一些对安全性要求高的场合.而UDP是非连接的协

  • 基于Qt的TCP实现通信

    本文实例为大家分享了基于Qt的TCP实现通信的具体代码,供大家参考,具体内容如下 一.tcp介绍 TCP是面向连接的可靠传输的协议,协议规定通信的双方是服务端和客户端的两个角色:服务端:负责监听网络端口,等待客户端的连接,用连接的socket完成信息的交互:客户端:负责每次连接的发起,建立连接后才可以进行通信: 二.界面设计 服务器端 客户端 三.具体程序设计 (1)服务器端设计 1.建立一个工程,工程名为tcpserver,类名为server.在.pro文件中加入如下代码并保存. QT    

  • 基于node的tcp客户端和服务端的简单通信

    目录 1.简单介绍下TCP/IP 2.服务端编程 监听客户端连接 接收数据和发送数据 3.客户端编程 4.一个小的登录系统 1.简单介绍下TCP/IP TCP/IP是互联网相关协议的集合,分为以下四层:应用层.传输层.网络层.数据链路层. 分成四层的好处是,假如只有一层,某个地方需要改变设计时,就必须把所有整体替换掉,而分层之后只需把变动的层替换掉即可. 2. 服务端编程 node提供了net模块来实现tcp编程.主要分为服务端编程和客户端编程两部分,先来写服务端的: 监听客户端连接 先引入ne

随机推荐