Qt实现TCP客户端和服务器通讯程序

复习的心态过一遍之前基础的一些东西,Qt封装了QTcpServer和QTcpSocket两个类,其中QTcpServer继承自QObject,通过listen()函数监听传入的客户端连接,当Client连接上时,QTcpServer会发出newConnection的信号,在对应的槽函数中使用nextPendingConnection()拿到连接的客户端的句柄和信息。

而QTcpSocket则是读写数据的时候使用,过程很简单。

服务器流程:listen->newConnection->nextPendingConnection->readAll/write

客户端流程:connectToHost->waitForConnected->write/readAll

需要注意的是在使用网络相关的类前,需要在pro文件加上QT += network

通信时:

客户端掉线时:

QTcpServer服务器代码(包含.h和.cpp):

.h

#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
 
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
 
class Widget : public QWidget
{
    Q_OBJECT
 
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
 
protected slots:
    void onSendBtnClicked();
    void onNewClientConnected();
    void onRecvData();
    void onClientDisconnected();
 
private:
    void Init();
 
private:
    Ui::Widget *ui;
 
private:
    QTcpServer *_tcpServer;
    QTcpSocket *_tcpSocket;
};
#endif // WIDGET_H

.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QHostAddress>
#include <QDebug>
 
#define MyTcpPort 8886
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
    ,_tcpServer(nullptr)
    ,_tcpSocket(nullptr)
{
    ui->setupUi(this);
 
    connect(this->ui->btn_send,&QPushButton::clicked,this,&Widget::onSendBtnClicked);
 
    Init();
 
    setWindowTitle("服务端");
}
 
Widget::~Widget()
{
    delete ui;
 
    if(_tcpSocket)
    {
        _tcpSocket->disconnect();
        _tcpSocket->abort();
        _tcpSocket->close();
        _tcpSocket->deleteLater();
    }
    if(_tcpServer)
    {
        _tcpServer->close();
        delete _tcpServer;
    }
}
 
void Widget::Init()
{
    _tcpSocket = new QTcpSocket;
    _tcpServer = new QTcpServer;
 
    int ret = _tcpServer->listen(QHostAddress::AnyIPv4,MyTcpPort);
    if(ret==0)
    {
        qDebug()<<"_tcpServer->listen is failied";
        return;
    }
    connect(_tcpServer,&QTcpServer::newConnection,this,&Widget::onNewClientConnected);
}
 
void Widget::onSendBtnClicked()
{
    if(!_tcpSocket) return;
 
    QString inputText = ui->inputEdit->text();
    if(inputText.isEmpty())
        return;
    //发送数据
    int ret = _tcpSocket->write(inputText.toStdString().c_str());
    if(ret<0)
    {
        qDebug()<<"write to client is failed!";
    }
}
 
void Widget::onNewClientConnected()
{
    if(_tcpServer->hasPendingConnections())
    {
        _tcpSocket = _tcpServer->nextPendingConnection();
        if(!_tcpSocket->isValid()) return;
        connect(_tcpSocket,&QTcpSocket::readyRead,this,
                &Widget::onRecvData);
        connect(_tcpSocket,&QTcpSocket::disconnected,this,
                &Widget::onClientDisconnected);
    }
}
 
void Widget::onRecvData()
{
    if(!_tcpSocket) return;
    QString recvData=_tcpSocket->readAll();
    qDebug()<<"recvData:"<<recvData;
 
    this->ui->recvEdit->append(recvData);
}
 
void Widget::onClientDisconnected()
{
    QString clientIp = _tcpSocket->peerAddress().toString();
    this->ui->recvEdit->append(clientIp+" is Drop line!");
}

QTcpClient客户端代码(包含.h和.cpp):

/.h

#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
#include <QTcpSocket>
 
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
 
class Widget : public QWidget
{
    Q_OBJECT
 
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
 
private:
    void Init();
 
protected slots:
    void onSendBtnClicked();
    void onRecvData();
 
private:
    Ui::Widget *ui;
 
private:
    QTcpSocket *_tcpClient;
};
#endif // WIDGET_H
 
/.cpp
#include "widget.h"
#include "ui_widget.h"
 
#define MyTcpPort 8886
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget),_tcpClient(nullptr)
{
    ui->setupUi(this);
 
    connect(this->ui->btn_send,&QPushButton::clicked,this,&Widget::onSendBtnClicked);
 
    Init();
 
     setWindowTitle("客户端");
}
 
Widget::~Widget()
{
    delete ui;
 
    if(_tcpClient)
    {
        _tcpClient->close();
        _tcpClient->deleteLater();
    }
}
 
void Widget::Init()
{
    _tcpClient=new QTcpSocket;
    _tcpClient->abort();
    _tcpClient->connectToHost("127.0.0.1",MyTcpPort);
    if(!_tcpClient->waitForConnected(2000))
    {
        qDebug()<<"connect is failed!";
        return;
    }
    qDebug()<<"connect is successful";
    connect(_tcpClient,&QTcpSocket::readyRead,this,&Widget::onRecvData);
}
 
void Widget::onSendBtnClicked()
{
    if(!_tcpClient) return;
 
    QString wStr=ui->inputEdit->text();
 
    int ret = _tcpClient->write(wStr.toStdString().c_str());
    if(ret<0)
    {
        qDebug()<<"send data is failed";
    }
    qDebug()<<"send data is successful!";
}
 
void Widget::onRecvData()
{
    if(!_tcpClient) return;
 
    QString recvData= _tcpClient->readAll();
    ui->recvEdit->append(recvData);
    qDebug()<<"recvData:"<<recvData;
}

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

(0)

相关推荐

  • Qt基于TCP实现客户端与服务端的连接

    Qt TCP的客户端与服务端的连接,供大家参考,具体内容如下 可以实现局域网内简单的信息传递(文件传输,稍后更新) 界面是用ui设计师做的简单设计 客户端 (1).ClientWidget.h 头文件 #ifndef CLIENTWIDGET_H #define CLIENTWIDGET_H #include <QWidget> #include "ui_ClientWidget.h" #include <QTcpSocket> #include <QHo

  • Qt实现TCP客户端和服务器通讯程序

    复习的心态过一遍之前基础的一些东西,Qt封装了QTcpServer和QTcpSocket两个类,其中QTcpServer继承自QObject,通过listen()函数监听传入的客户端连接,当Client连接上时,QTcpServer会发出newConnection的信号,在对应的槽函数中使用nextPendingConnection()拿到连接的客户端的句柄和信息. 而QTcpSocket则是读写数据的时候使用,过程很简单. 服务器流程:listen->newConnection->nextP

  • QT基于TCP实现网络聊天室程序

    本文实例为大家分享了QT学习:基于TCP的网络聊天室程序,供大家参考,具体内容如下 TCP与UDP的差别如图: 一.TCP工作原理 如下图所示,TCP能够为应用程序提供可靠的通信连接,使一台计算机发出的字节流无差错 地送达网络上的其他计算机.因此,对可靠性要求高的数据通信系统往往使用TCP传输数据,但在正式收发数据前,通信双方必须首先建立连接. 二.TCP编程模型 下面介绍基于TCP的经典编程模型,TCP客户端与服务器间的交互时序如下图所示: 三.TCP服务器端编程实例 TCP服务器端的具体实现

  • C++实现TCP客户端及服务器Recv数据筛选处理详解

    目录 正文 代码解析 1:当Tcp缓冲区的数据小于3个字节时,不进行判断 2:判断包头是不是一致? 3:包头匹配后,判断是否达到了数据包的固定协议长度? 4:判断有效数据是否接收完整? 5:数据校验位判断 正文 对于一个简单的tcp通讯这里我就不再讲述了,今天主要为大家讲解下,如何从::recv中筛选出一个完整包逻辑. 就简单的以客户端为例(服务器接收方也是同样的逻辑),假设服务器一直在频繁发送数据,在recv函数中并不能保证每次接收的都是一个完整的包,当设置recv的缓冲区过大时,就会出现多个

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

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

  • 使用C语言编写基于TCP协议的Socket通讯程序实例分享

    tcp客户端示例 #include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <string.h> #include <netinet/in.h> #include <stdio.h> #include <unistd.h>

  • ActionScript 3.0中用XMLSocket与服务器通讯程序(源码)

    复制代码 代码如下: // // CXMLSocket.as // // // Written by Leezhm, 20th Oct, 2008 // Contact : Leezhm@luxoom.cn // package { import flash.events.DataEvent; import flash.events.Event; import flash.events.IEventDispatcher; import flash.events.IOErrorEvent; imp

  • Go语言服务器开发之简易TCP客户端与服务端实现方法

    本文实例讲述了Go语言服务器开发之简易TCP客户端与服务端实现方法.分享给大家供大家参考.具体实现方法如下: Go语言具备强大的服务器开发支持,这里示范了最基础的服务器开发:通过TCP协议实现客户端与服务器的通讯. 一 服务端,为每个客户端新开一个goroutine 复制代码 代码如下: func ServerBase() {      fmt.Println("Starting the server...")      //create listener      listener,

  • python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例

    本文在上文的基础上重新实现支持多线程的服务器. 以下为TCP客户端的程序代码: #!/usr/bin/env python3 import sys from PyQt5.QtCore import (QByteArray, QDataStream, QDate, QIODevice, QRegExp, Qt) from PyQt5.QtWidgets import (QApplication, QDateEdit, QFrame, QGridLayout, QHBoxLayout, QLabel

  • Java实现基于TCP的通讯程序实例解析

    Java中的TCP通信程序 TCP可以实现两台计算机之间的数据交互通信的两端,要严格区分客户端与服务端 两端通信时的步骤: 1.服务端程序,需要事先启动,等待客户端连接 2.客户端主动连接服务器端,才能成功通信,服务器端不可以主动链接客户端 在java中两个类用于实现TCP通信程序: 客户端: java.net.Socket 类表示.创建 Socket 对象,向服务端发出连接请求,服务端响应请求,两者建 立连接开始通信. 服务端: java.net.ServerSocket 类表示.创建 Ser

  • Java利用TCP协议实现客户端与服务器通信(附通信源码)

    进行TCP协议网络程序的编写,关键在于ServerSocket套接字的熟练使用,TCP通信中所有的信息传输都是依托ServerSocket类的输入输出流进行的. 上一篇博客和大家分享了在网络编程中要注意的基础知识,关于IP.TCP.UDP以及端口和套接字的一些概念,想了解的小伙伴可以看我的这篇文章"盘点那些进行网络编程必须要知道的基础知识",那么今天大灰狼就来和大家分享一下如何使用TCP/IP进行网络程序的开发. TCP协议概念 先来了解一下TCP协议的基本概念. 我们知道TCP是可靠

随机推荐