zoukankan      html  css  js  c++  java
  • QT之TCP通信

    QT中可以通过TCP协议让服务器和客户端之间行通信。所以下面我就围绕服务器和客户端来写。

    这是我们写服务器和客户端的具体流程:

    A、服务器:      

             1.创建QTcpServer对象
             2.启动服务器(监听)调用成员方法listen(QHostAddress::Any,端口号)
             3.当有客户端链接时候会发送newConnection信号,触发槽函数接受链接(得到一个与客户端通信的套接字QTcpSocket)
             4.QTcpsocket发送数据用成员方法write,
             5.读数据当客户端有数据来,QTcpSocket对象就会发送readyRead信号,关联槽函数读取数据

    B、客户端  :  

            1.创建QTcpSocket对象
            2.链接服务器connectToHost(QHostAddress("ip"),端口号)
            3.QTcpsocket发送数据用成员方法write,
            4.读数据当对方有数据来,QTcpSocket对象就会发送readyRead信号,关联槽函数读取数据

    我们需要调用到的头文件有两个:

    #include <QTcpServer>  
    #include <QTcpSocket>

    我们先要在工程文件中加入network

    QT       += core gui network

    下面我们来看看服务器程序步骤:

    1、初始化服务器server对象

    mServer = new QTcpServer();

    2、启动监听服务器

      mServer->listen(QHostAddress::Any,9988);//9988为端口号

    3、当有客户端链接时候会发送newConnection信号,触发槽函数接受链接(得到一个与客户端通信的套接字QTcpSocket)

     connect(mServer,SIGNAL(newConnection()),this,SLOT(new_client()));
     mSocket = mServer->nextPendingConnection();//与客户端通信的套接字

    4、发送数据

     mSocket->write(msg.toUtf8());

    5、读数据当客户端有数据来,QTcpSocket对象就会发送readyRead信号,关联槽函数读取数据

     connect(mSocket,SIGNAL(readyRead()),this,SLOT(read_client_data()));

    6、连接多个客户端

     //可以实现同时读取多个客户端发送过来的消息
     QTcpSocket *obj = (QTcpSocket*)sender();

    7、检测掉线

     connect(mSocket,SIGNAL(disconnected()),this,SLOT(client_dis())); //检测掉线信号

    下面是服务器的实现的具体代码:

    复制代码
     1 #include "tcpserver.h"
     2 #include "ui_tcpserver.h"
     3 #include <QDebug>
     4 TcpServer::TcpServer(QWidget *parent) :
     5     QMainWindow(parent),
     6     ui(new Ui::TcpServer)
     7 {
     8     ui->setupUi(this);
     9     //初始化服务器server对象
    10     mServer = new QTcpServer();
    11     //关联客户端连接信号newConnection
    12     connect(mServer,SIGNAL(newConnection()),this,SLOT(new_client())); //连接客户端
    13     //启动服务器监听
    14     mServer->listen(QHostAddress::Any,9988);
    15 
    16 }
    17 
    18 TcpServer::~TcpServer()
    19 {
    20     delete ui;
    21 }
    22 
    23 void TcpServer::new_client()
    24 {
    25     qDebug()<<"新客户段连接";
    26     mSocket = mServer->nextPendingConnection();//与客户端通信的套接字
    27     //关联接收客户端数据信号readyRead信号(客户端有数据就会发readyRead信号)
    28     connect(mSocket,SIGNAL(readyRead()),this,SLOT(read_client_data()));
    29     //检测掉线信号
    30     connect(mSocket,SIGNAL(disconnected()),this,SLOT(client_dis()));
    31 
    32 }
    33 
    34 void TcpServer::read_client_data()
    35 {
    36     //可以实现同时读取多个客户端发送过来的消息
    37     QTcpSocket *obj = (QTcpSocket*)sender();
    38     QString msg = obj->readAll();
    39     qDebug()<<msg;
    40 }
    41 
    42 void TcpServer::client_dis()
    43 {
    44      QTcpSocket *obj = (QTcpSocket*)sender();//掉线对象
    45      qDebug()<<obj->peerAddress().toString();//打印出掉线对象的ip
    46 }
    复制代码

    说完服务器那我们继续来看看客户端是怎么实现的:

    1、创建QTcpSocket对象

     mSocket = new QTcpSocket();

    2、链接服务器connectToHost(QHostAddress("ip"),端口号),连接服务器ip和端口号

     mSocket->connectToHost(ui->ipEdit->text(),ui->portEdit->text().toInt()); //ui->ipEdit->text():ip,ui->portEdit->text().toInt():端口号

    3、发送数据

    //取发送信息编辑框内容
    QString msg = ui->sendEdit->toPlainText();
    mSocket->write(msg.toUtf8());//转编码

    4、检测链接成功信号关联槽函数

     connect(mSocket,SIGNAL(connected()),this,SLOT(connect_suc()));

    5、检测掉线信号

     connect(mSocket,SIGNAL(disconnected()),this,SLOT(client_dis()));

    6、服务器和客户端关闭都可以使用close

     mSocket->close();

    这是客户端实现的具体代码

    复制代码
     1 #include "tcpclient.h"
     2 #include "ui_tcpclient.h"
     3 #include <QDebug>
     4 TcpClient::TcpClient(QWidget *parent) :
     5     QMainWindow(parent),
     6     ui(new Ui::TcpClient)
     7 {
     8     ui->setupUi(this);
     9     //初始化套接字对象
    10     mSocket = new QTcpSocket();
    11     //关联数据信号
    12     connect(mSocket,SIGNAL(readyRead()),this,SLOT(read_data()));
    13 
    14 }
    15 
    16 TcpClient::~TcpClient()
    17 {
    18     delete ui;
    19 }
    20 
    21 void TcpClient::read_data()
    22 {
    23     QString msg = mSocket->readAll();
    24     qDebug()<<msg;
    25 }
    26 
    27 void TcpClient::on_btn_connectServer_clicked()
    28 {
    29     //检测链接成功信号关联槽函数
    30     connect(mSocket,SIGNAL(connected()),this,SLOT(connect_suc()));
    31     //检测掉线信号
    32     connect(mSocket,SIGNAL(disconnected()),this,SLOT(client_dis()));
    33     //连接服务器,设置ip和端口号
    34     mSocket->connectToHost(ui->ipEdit->text(),ui->portEdit->text().toInt());
    35 
    36 }
    37 
    38 void TcpClient::on_btn_send_clicked()
    39 {
    40     //取发送信息编辑框内容
    41     QString msg = ui->sendEdit->toPlainText();
    42     mSocket->write(msg.toUtf8());//转编码
    43 }
    44 
    45 void TcpClient::connect_suc()
    46 {
    47     ui->btn_connectServer->setEnabled(false);//如果连接成功则连接按钮不能按下
    48 }
    49 void TcpClient::client_dis()
    50 {
    51     ui->btn_connectServer->setEnabled(true);//如果连接没有成功则连接按钮还可以按下
    52 }
    复制代码

    这是服务器和客户端分开两个文件夹写的程序,在这里我也实现了服务器和客户端写在同一个文件中

    具体代码如下:

    头文件:tcpapp.h

     View Code

    源文件:tcpapp.cpp

     View Code

    界面文件tcpapp.ui如下图

    此外这里还使用到了容器,在这里讲讲容器的使用

    1、定义容器对象

    QVector<QTcpSocket*> clients; //存储所有在线客户端(容器)
      解释:QTcpSocke*  容器的类型
           clients  容器名

    2、往容器中添加成员

    //上线用户添加到客户列表容器
     clients.append(mSocket); 

    3、寻找某个成员在容器中位置

     int row = clients.indexOf(obj);//找到掉线对象的内容所在的行

    4、从容器中删除成员

      clients.remove(row);//从容器中删除成员
    鉴于本人才疏学浅,所以其中不免有遗漏或者错误,恳请各位博友批评指正。
  • 相关阅读:
    在集群环境中使用 EhCache 缓存系统|RMI 集群模式
    oracle中的针对该库的表
    oracle:触发器,自治事务 trigger
    PL/SQL中查询某的时间段内所有执行的sql
    金额input框控制只能小数点后有两位的有效数字
    JS判断键盘上的上下左右键
    MySQL按照汉字的拼音排序
    JAVA经典总结
    普通for循环遍历LinkedList弊端
    EASYUI 1.4版 combobox firefox 下不支持中文检索的问题
  • 原文地址:https://www.cnblogs.com/h2zZhou/p/10250333.html
Copyright © 2011-2022 走看看