QT使用Socket通信

这篇具有很好参考价值的文章主要介绍了QT使用Socket通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • QTcpServer用于TCP/IP通信, 作为服务器端套接字使用。
  • QTcpSocket用于TCP/IP通信,作为客户端套接字使用。
  • QUdpSocket用于UDP通信,服务器,客户端均使用此套接字。
  • 创建套接字

  • 将套接字设置为监听模式

  • 等待并接受客户端请求
    可以通过QTcpServer提供的void newConnection()信号来检测是否有连接请求,如果有可以在对应的槽函数中调用nextPendingConnection函数获取到客户端的Socket信息(返回值为QTcpSocket*类型指针),通过此套接字与客户端之间进行通信。

  • 接收或者向客户端发送数据  接收数据:使用read()或者readAll()函数

  • 发送数据:使用write()函数

  • 客户端通信流程:

  • 1.创建套接字 ;

  • 2.连接服务器 可以使用QTcpSocket类的connectToHost()函数来连接服务器。

  • 3.向服务器发送或者接受数据 ;

通过Qt提供的QTcpServer类实现服务器端的socket通信:

class TCPServer : public QMainWindow
{
    Q_OBJECT

public:
    explicit TCPServer(QWidget *parent = 0);
    ~TCPServer();

public slots:
    void slotNewConnection();
    void slotReadyRead();

private:
    Ui::TCPServer *ui;
    // 负责监听的套接字
    QTcpServer* m_server;
    // 负责通信的套接字
    QTcpSocket* m_client;
};


//---------- tcpserver.cpp ------------
TCPServer::TCPServer(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::TCPServer),
    m_server(NULL),
    m_client(NULL)
{
    ui->setupUi(this);

    //创建套接字对象
    m_server = new QTcpServer(this);
    //将套接字设置为监听模式
    m_server->listen(QHostAddress::Any, 9999);

    //通过信号接收客户端请求
    connect(m_server, &QTcpServer::newConnection, 
this, &TCPServer::slotNewConnection);
}


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


void TCPServer::slotNewConnection()
{
    if(m_client == NULL)
    {
        //处理客户端的连接请求
        m_client = m_server->nextPendingConnection();
        //发送数据
        m_client->write("服务器连接成功!!!");
        //连接信号, 接收客户端数据
        connect(m_client, &QTcpSocket::readyRead, 
this, &TCPServer::slotReadyRead);
    }
}


void TCPServer::slotReadyRead()
{
    //接收数据
    QByteArray array = m_client->readAll();
    QMessageBox::information(this, "Client Message", array);
}

//------------- tcpclient.h ------------
class TCPClient : public QMainWindow
{
    Q_OBJECT

public:
    explicit TCPClient(QWidget *parent = 0);
    ~TCPClient();
public slots:
    void slotReadyRead();
    void slotSendMsg();

private:
    Ui::TCPClient *ui;
    QTcpSocket* m_client;
};

//------------- tcpclient.cpp --------------
TCPClient::TCPClient(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::TCPClient)
{
    ui->setupUi(this);
    //创建套接字
    m_client = new QTcpSocket(this);
    //连接服务器
    m_client->connectToHost(QHostAddress("127.0.0.1"), 9999);

    //通过信号接收服务器数据
    connect(m_client, &QTcpSocket::readyRead, 
this, &TCPClient::slotReadyRead);
    //发送按钮
    connect(ui->btnSend, &QPushButton::clicked, 
this, &TCPClient::slotSendMsg);
}

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


void TCPClient::slotReadyRead()
{
	 //接收数据
    QByteArray array = m_client->readAll();
    QMessageBox::information(this, "Server Message", array);
}


void TCPClient::slotSendMsg()
{
    QString text = ui->textEdit->toPlainText();
	 //发送数据
    m_client->write(text.toUtf8());
    ui->textEdit->clear();
}

  • 创建套接字
  • 绑定套接字
    在UDP中如果需要接收数据则需要对套接字进行绑定,只发送数据则不需要对套接字进行绑定。
    通过调用bind()函数将套接字绑定到指定端口上。
  • 接收或者发送数据
    - 接收数据:使用readDatagram()接收数据,函数声明如下:
 		qint64	readDatagram(char * data, qint64 maxSize, 
					QHostAddress * address = 0, quint16 * port = 0)

//data: 接收数据的缓存地址
//maxSize: 缓存接收的最大字节数
//address: 数据发送方的地址(一般使用提供的默认值)
//port: 数据发送方的端口号(一般使用提供的默认值)

使用pendingDatagramSize()可以获取到将要接收的数据的大小,根据该函数返回值来准备对应大小的内存空间存放将要接收的数据。文章来源地址https://www.toymoban.com/news/detail-446680.html

  • 发送数据: 使用writeDatagram()函数发送数据,函数声明如下:
qint64	writeDatagram(const QByteArray & datagram, 
					const QHostAddress & host, quint16 port)
	//datagram:要发送的字符串
    //host:数据接收方的地址
    //port:数据接收方的端口号


  • 在使用QUdpSocket类的writeDatagram()函数发送数据的时候,其中第二个参数host应该指定为广播地址:QHostAddress::Broadcast此设置相当于QHostAddress(“255.255.255.255”)
    使用UDP广播的的特点:
  • 使用UDP进行广播,局域网内的其他的UDP用户全部可以收到广播的消息
  • UDP广播只能在局域网范围内使用
  • 224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用;
  • 224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet;
  • 224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效;
  • 239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内;
    注册加入到组播地址需要使用QUdpSocket类的成员函数:
bool	joinMulticastGroup(const QHostAddress & groupAddress)
						TCP/IP				UDP
	是否连接				面向连接			无连接
	传输方式				基于流			基于数据报
	传输可靠性			可靠			不可靠
	传输效率				效率低			效率高
	能否广播				不能			能

到了这里,关于QT使用Socket通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用QTcpSocket及QTcpServer传输大文件

    客户端代码如下 服务端代码如下: 动态显示效果如下:

    2024年02月09日
    浏览(30)
  • Linux网络编程:socket、客户端服务器端使用socket通信(TCP)

    socket(套接字),用于网络中不同主机间进程的通信。 socket是一个伪文件,包含读缓冲区、写缓冲区。 socket必须成对出现。 socket可以建立主机进程间的通信,但需要协议(IPV4、IPV6等)、port端口、IP地址。          (1)创建流式socket套接字。                 a)此s

    2024年02月11日
    浏览(45)
  • 使用 python socket 实现UDP/TCP网络通信

    目录 目录 1.socket简介 2.创建socket 2.1创建UDPSocket 2.2创建TCPSocket 3.使用UDPSocket发送数据并接收 4.使用UDPSocket发送广播 5.UDPSocket聊天器 (多线程实现消息的收发功能) 6.使用TCPSocket建立客户端 7.使用TCPSocket建立服务端        socket(简称:套接字),是支持TCP和UDP(网络传输方式

    2023年04月10日
    浏览(50)
  • MacOS使用USB接口与IPhone进行Socket通信

    演示效果如下:   开源地址: GitHub - rsms/peertalk: iOS and Mac Cocoa library for communicating over USB   克隆源码: 克隆后打开peertalk然后启动xcode工程  先启动MacOS服务端工程,再启动iOS客户端工程    客户端 服务端          

    2024年02月17日
    浏览(33)
  • 超详细--vue3中使用socket.io-client + nodejs使用socket.io 实现实时通信

    第一步:安装插件 第二步:组件中引入使用 第一步:安装插件 第二步:在文件中引入使用

    2024年02月13日
    浏览(30)
  • 在Qt中使用Socket进行网络编程

    Socket编程是一种常见的网络编程方式,允许不同计算机之间通过网络进行通信。Qt提供了丰富的网络编程工具,使得在Qt应用程序中实现网络通信变得相对简单。本篇博文将介绍如何在Qt中使用Socket进行网络编程,包括常用的接口函数原型、使用方法以及应用场景。 首先,我们

    2024年02月13日
    浏览(26)
  • socket概述 python中如何使用TCP/UDP协议实现通信-教程

    很多编程语言中,都 使用scoket套接字实现网络通信。 Socket是对TCP/IP协议的封装,Socket本身就是一个调用接口(API),方便程序员用Socket使用TCP/IP协议簇,实现网络通信。 不同编程语言,shiyongSocket通信的语法有所区别,但基本原理类型相似。 它的两种方式,分别是TCP和UDP协

    2024年02月13日
    浏览(32)
  • Unity的Socket通讯,Unity作为服务端

     最近在研究Socket通讯,发现对Unity来说,作为客户端的情况比较多,于是突发奇想搞一个服务器端,废话不多说直接上代码 using System; using System.Collections; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using UnityEngine; public class Tes

    2024年02月05日
    浏览(25)
  • Qt使用星空图作为窗口背景,点击键盘的WASD控制小飞机在上面移动。

    事件函数的使用依托于Qt的事件机制,一个来自于外部事件的传递机制模型如下所示 信号槽虽然好用,但是无法包含所有的情况,事件函数可以起到对信号槽无法覆盖的一些时机进行补充,事件函数的使用无需连接。 常用的事件函数如下所示。 // 绘制事件 void QWidget :: pain

    2024年02月11日
    浏览(33)
  • C#知识点-13(进程、多线程、使用Socket实现服务器与客户端通信)

    进程 定义:每一个正在运行的应用程序,都是一个进程  进程不等于正在运行的应用程序。而是为应用程序的运行构建一个运行环境 多线程 这段代码在执行完成之前,程序会被卡死(不能操作程序,包括关闭窗口)。因为我们程序在做一些耗时操作的时候,如果主线程去执

    2024年02月22日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包