34575|15

2144

帖子

3

TA的资源

五彩晶圆(中级)

楼主
 

qt socket tcp通信_最精简示例 [复制链接]

1、用了大半天时间搭建环境,加上实现最基本的socket通讯。
2、一个服务一个客户端,目前是基于window下mingw的,虽然qt还不像java那样做到一次编译到处运行,但是基本上能够实现一次coding到处编译运行。
3、所以在window下面开发好拿到linxu下编译成其他的各种版本都是很easy的,主要是我的PC有点慢,vbox里面的ubuntu实在是有点慢,开发不爽。
4、基于qt5版本,目前已经在ubuntu下面编译了qt4.7.2的各种版本,x11和arm-2416版本,体会了下qt5和之前玩的qt4.8没什么大的区别,编译了一个之前写的qt4.8的串口调试助手,qextserialport第三方的类需要修改一些东西,不然不太好编译,这是我选择embedded下面用qt4的主要原因。
5、这里先分享一个socket的通讯例子,后面会分享串口调试助手的例子。当然这只是前奏,后面我会放到helper2416的板子上面,大家一起玩玩qt也不错。
6、建议不熟悉的同学先在windows下面跑跑qt在去折腾嵌入式的,qt开发蛮简单的,做出来的界面也蛮漂亮的。

先上个图吧,最精简的,大家可以参考网上的网络调试助手来完善功能,如服务器并发的通讯窗口,目前我只处理了一个连接的窗口






QT_TCP_SOCKET_TEST.zip

17.48 MB, 下载次数: 6796

最新回复

拜托楼主分享代码,这里要做一个课程设计,急需一个实例快速入门……  详情 回复 发表于 2017-11-1 20:59
点赞 关注
个人签名电工

回复
举报

2144

帖子

3

TA的资源

五彩晶圆(中级)

沙发
 
说说qt5需要注意的地方,pro中添加如下
  1. #if QT_VERSION >= 0x050000
  2. QT       += core gui widgets
  3. #else
  4. QT       += core gui
  5. #endif
复制代码
main.cpp中需要注意头包含如下格式
  1. #include <QtGlobal>
  2. #if QT_VERSION >= 0x050000
  3. #include <QApplication>
  4. #else
  5. #include <QtGui/QApplication>
  6. #endif
复制代码
main.cpp中相关字符编码转换如下
  1. #if QT_VERSION < 0x050000
  2.     // 设置字符编码
  3.     QTextCodec::setCodecForTr(QTextCodec::codecForName("System"));
  4.     QTextCodec::setCodecForCStrings(QTextCodec::codecForName("System"));
  5.     QTextCodec::setCodecForLocale(QTextCodec::codecForName("System"));

  6.     // 加载国际化文件
  7.     QTranslator *translator = new QTranslator(0);
  8.     translator->load(":/qm/qt_zh_CN.qm");
  9.     a.installTranslator(translator);

  10.     QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));
  11. #endif
复制代码
以上是为了兼容qt4和qt5,当然还有一些小细节,比如Qstring的类不支持toAscii了使用toLatin1替代,也需要做好相关版本宏用于区分

点评

对于qt的socekt通讯需要在pro中添加QT += network来支持网络,服务器的主要代码如下: 代码还是蛮简单的,后面也会分享一些helper2416的socket编程,不是qt的,毕竟qt有自己的网络库,不太底层。  详情 回复 发表于 2014-8-2 14:59
 
个人签名电工
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

板凳
 
lyzhangxiang 发表于 2014-8-2 14:56
说说qt5需要注意的地方,pro中添加如下
main.cpp中需要注意头包含如下格式
main.cpp中相关字符编码转换如 ...

对于qt的socekt通讯需要在pro中添加QT += network来支持网络,服务器的主要代码如下:
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QtCore>

  4. #include <QMessageBox>
  5. #include <QStatusBar>
  6. #include <QFileDialog>
  7. #include <QFile>
  8. #include <QtextStream>
  9. #include <QDebug>
  10. #include "comm.h"


  11. MainWindow::MainWindow(QWidget *parent) :
  12.     QMainWindow(parent),
  13.     ui(new Ui::MainWindow)
  14. {
  15.     ui->setupUi(this);
  16.     tcpServer = new QTcpServer(this);

  17.     QStatusBar* bar = ui->statusBar;          //获取状态栏
  18.     fstLabel = new QLabel;                    //新建标签
  19.     fstLabel->setMinimumSize(150,20);         //设置标签最小尺寸
  20.     fstLabel->setFrameShape(QFrame::Panel);   //设置标签形状
  21.     fstLabel->setFrameShadow(QFrame::Sunken); //设置标签阴影

  22.     secLabel = new QLabel;
  23.     secLabel->setFrameShape(QFrame::Panel);
  24.     secLabel->setFrameShadow(QFrame::Sunken);
  25.     secLabel->setText(tr("关于作者"));
  26.     secLabel->setToolTip(tr("作者邮箱"));
  27.     secLabel->setStatusTip(tr("Email:camel.shoko@gmail.com"));
  28.     secLabel->setOpenExternalLinks(true);
  29.     fstLabel->setText(tr("状态信息"));

  30.     bar->addPermanentWidget(fstLabel);
  31.     bar->addPermanentWidget(secLabel);

  32.     ui->pushButton_Start->setEnabled(true);
  33.     ui->pushButton_Stop->setEnabled(false);
  34. }

  35. MainWindow::~MainWindow()
  36. {
  37.     delete ui;
  38. }

  39. void MainWindow::on_pushButton_Start_clicked()
  40. {
  41.     ui->pushButton_Start->setEnabled(false);
  42.     ui->pushButton_Stop->setEnabled(true);

  43.     tcpServer->listen(QHostAddress::Any,5084);

  44.     connect(tcpServer, SIGNAL(newConnection()),this, SLOT(acceptConnection()));
  45.     fstLabel->setText(tr("监听端口:%1").arg("5084"));
  46. }

  47. void MainWindow::on_pushButton_Stop_clicked()
  48. {
  49.     tcpServer->close();
  50.     ui->pushButton_Start->setEnabled(true);
  51.     ui->pushButton_Stop->setEnabled(false);
  52.     fstLabel->setText(tr("停止监听"));
  53. }

  54. void MainWindow::acceptConnection()
  55. {
  56.     tcpSocket = new QTcpSocket;
  57.     tcpSocket = tcpServer->nextPendingConnection();                //使TCPsocket=当前访问者
  58.     connect(tcpSocket, SIGNAL(readyRead()),this, SLOT(recv_Msg()));//连接槽当有数据时进入
  59. }

  60. void MainWindow::recv_Msg()
  61. {
  62.     QString Recv;
  63.     Recv += tcpSocket->readAll();
  64.     ui->textEdit_Recv->moveCursor(QTextCursor::End);
  65.     ui->textEdit_Recv->insertHtml(Recv);
  66.     ui->textEdit_Recv->insertPlainText("\n");;
  67.     fstLabel->setText(tr("接收成功"));
  68. }
复制代码
代码还是蛮简单的,后面也会分享一些helper2416的socket编程,不是qt的,毕竟qt有自己的网络库,不太底层。


点评

客户端代码如下: 也没几行,看下就能懂的吧。主要看一个按钮的动作的solt就行了,恩 初学者需要去了解下solt机制。  详情 回复 发表于 2014-8-2 15:01
 
个人签名电工
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

4
 
lyzhangxiang 发表于 2014-8-2 14:59
对于qt的socekt通讯需要在pro中添加QT += network来支持网络,服务器的主要代码如下:
代码还是蛮简单的 ...

客户端代码如下:
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"

  3. #include <QtCore>

  4. #include <QMessageBox>
  5. #include <QStatusBar>
  6. #include <QFileDialog>
  7. #include <QFile>
  8. #include <QtextStream>
  9. #include <QDebug>
  10. #include "comm.h"



  11. MainWindow::MainWindow(QWidget *parent) :
  12.     QMainWindow(parent),
  13.     ui(new Ui::MainWindow)
  14. {
  15.     ui->setupUi(this);

  16.     /*
  17.     QFont font("Courier New [Cronyx]", 10);
  18.     ui->textEdit_Recv->setFont(font);
  19.     ui->textEdit_Send->setFont(font);
  20.     */

  21.     tcpSocket = new QTcpSocket( this );
  22.     ui->lineEdit_IP->setText("192.168.14.23");
  23.     ui->lineEdit_Port->setText("5084");
  24.     ui->textEdit_Send->setText("Hello World!");

  25.     connect( tcpSocket, SIGNAL(error(int)), this, SLOT(errMsg(int)) );
  26.     connect( ui->pushButton_Send, SIGNAL(clicked()), this, SLOT(on_pushButton_Send_clicked(bool)) );
  27.     connect( ui->pushButton_Connect, SIGNAL(clicked()), this, SLOT(on_pushButton_Connect_clicked(bool)) );
  28.     connect( tcpSocket, SIGNAL(readyRead()), this, SLOT(recvMsg()) );

  29.     QStatusBar* bar = ui->statusBar;          //获取状态栏
  30.     fstLabel = new QLabel;                    //新建标签
  31.     fstLabel->setMinimumSize(150,20);         //设置标签最小尺寸
  32.     fstLabel->setFrameShape(QFrame::Panel);   //设置标签形状
  33.     fstLabel->setFrameShadow(QFrame::Sunken); //设置标签阴影

  34.     secLabel = new QLabel;
  35.     secLabel->setFrameShape(QFrame::Panel);
  36.     secLabel->setFrameShadow(QFrame::Sunken);
  37.     secLabel->setText(tr("关于作者"));
  38.     secLabel->setToolTip(tr("作者邮箱"));
  39.     secLabel->setStatusTip(tr("Email:camel.shoko@gmail.com"));
  40.     secLabel->setOpenExternalLinks(true);
  41.     fstLabel->setText(tr("状态信息"));

  42.     bar->addPermanentWidget(fstLabel);
  43.     bar->addPermanentWidget(secLabel);

  44.     ui->pushButton_Connect->setEnabled(true);
  45.     ui->pushButton_Close->setEnabled(false);
  46.     ui->pushButton_Send->setEnabled(false);
  47. }

  48. MainWindow::~MainWindow()
  49. {
  50.     delete ui;
  51. }

  52. void MainWindow::recvMsg()
  53. {
  54.     QString new_data;
  55.     QByteArray old_data;

  56.     old_data += tcpSocket->readAll();
  57.     ui->textEdit_Recv->moveCursor(QTextCursor::End);

  58.     if(ui->checkBox_DHex->isChecked())
  59.     {
  60.         new_data = BgComm::ByteArrayToHexString(old_data);
  61.     }
  62.     else
  63.     {
  64.         new_data = QString(old_data);
  65.     }

  66.     ui->textEdit_Recv->insertHtml(new_data);

  67.     if(ui->checkBox_Newline->isChecked())
  68.     {
  69.         ui->textEdit_Recv->insertPlainText("\n");
  70.     }

  71.     fstLabel->setText(tr("接收成功"));
  72. }

  73. void MainWindow::errMsg( int errNo )
  74. {
  75.    qWarning( "this is err %d!", errNo );
  76.    fstLabel->setText(tr("连接错误"));
  77. }

  78. QByteArray MainWindow::Send_Check(QString tmp, bool hex)
  79. {
  80.     QByteArray ret;

  81.     if(hex)
  82.     {
  83.         bool ok;
  84.         ret = BgComm::HexStringToByteArray(tmp, &ok);
  85.         if(!ok)
  86.         {
  87.             ret = 0;
  88.             QMessageBox::critical(this, tr("错误"), tr("请输入合适的数据,各个数据之间用空格分开。"));
  89.         }
  90.     }
  91.     else
  92.     {
  93.         ret = tmp.toLatin1();
  94.     }
  95.     return ret;
  96. }

  97. void MainWindow::on_pushButton_Send_clicked()
  98. {
  99.     QTextStream out(tcpSocket);
  100.     QString context = ui->textEdit_Send->toPlainText();

  101.     if(!SocketStatus || context.isEmpty())
  102.     {
  103.         return;
  104.     }
  105.     QByteArray tmp = Send_Check(context,ui->checkBox_SHex->isChecked());
  106.     out << tmp << endl;
  107.     fstLabel->setText(tr("发送成功"));
  108. }

  109. void MainWindow::on_pushButton_Connect_clicked()
  110. {
  111.     QString port;
  112.     int port_Int;

  113.     port = ui->lineEdit_Port->text();
  114.     port_Int = port.toInt();

  115.     tcpSocket->connectToHost(QHostAddress(ui->lineEdit_IP->text()), port_Int);

  116.     if (!tcpSocket->waitForConnected(2))
  117.     {
  118.         tcpSocket->disconnectFromHost();
  119.         return;
  120.     }
  121.     SocketStatus = true;
  122.     ui->pushButton_Connect->setEnabled(false);
  123.     ui->pushButton_Close->setEnabled(true);
  124.     ui->pushButton_Send->setEnabled(true);
  125.     fstLabel->setText(tr("连接成功"));
  126. }


  127. void MainWindow::on_pushButton_Clear_clicked()
  128. {
  129.     ui->textEdit_Recv->clear();
  130.     fstLabel->setText(tr("清除接收区"));
  131. }

  132. void MainWindow::on_pushButton_Close_clicked()
  133. {
  134.     tcpSocket->disconnectFromHost();
  135.     SocketStatus = false;
  136.     ui->pushButton_Connect->setEnabled(true);
  137.     ui->pushButton_Close->setEnabled(false);
  138.     ui->pushButton_Send->setEnabled(false);
  139.     fstLabel->setText(tr("关闭连接"));
  140. }

  141. void MainWindow::on_checkBox_DHex_stateChanged(int state)
  142. {
  143.     QString text = ui->textEdit_Recv->toPlainText();
  144.     bool ok;

  145.     if(text.isEmpty())
  146.     {
  147.         return;
  148.     }
  149.     if(state == Qt::Checked)
  150.     {
  151.         ui->textEdit_Recv->setPlainText(BgComm::ByteArrayToHexString(text.toLatin1()));
  152.     }
  153.     else if(state == Qt::Unchecked)
  154.     {
  155.         ui->textEdit_Recv->setPlainText(BgComm::HexStringToByteArray(text, &ok));
  156.     }

  157.     changeTextEditTrans();
  158. }

  159. void MainWindow::changeTextEditTrans()
  160. {
  161.     QString tmp = ui->textEdit_Recv->toHtml();

  162.     if(tmp.isEmpty())
  163.     {
  164.         return;
  165.     }
  166.     ui->textEdit_Recv->setText(tmp);
  167. }
复制代码
也没几行,看下就能懂的吧。主要看一个按钮的动作的solt就行了,恩 初学者需要去了解下solt机制。

 
个人签名电工
 
 

回复

241

帖子

4

TA的资源

纯净的硅(初级)

5
 
楼主您好,请问,用QT开发,对于C++要怎样的基础啊,本人小白!请多指点

点评

基本上没啥特别的要求,懂一些oop的思想就差不多了,上手太easy了,我也是业余玩玩 https://bbs.eeworld.com.cn/thread-345738-1-1.html  详情 回复 发表于 2014-8-2 15:13
 
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

6
 
yuanlai2010 发表于 2014-8-2 15:04
楼主您好,请问,用QT开发,对于C++要怎样的基础啊,本人小白!请多指点

基本上没啥特别的要求,懂一些oop的思想就差不多了,上手太easy了,我也是业余玩玩
https://bbs.eeworld.com.cn/thread-345738-1-1.html





点评

多谢楼主,我也要尽快上手QT,不能一直都是字符终端,有界面的感觉就是要不一样些!  详情 回复 发表于 2014-8-2 15:19
 
个人签名电工
 
 

回复

241

帖子

4

TA的资源

纯净的硅(初级)

7
 
lyzhangxiang 发表于 2014-8-2 15:13
基本上没啥特别的要求,懂一些oop的思想就差不多了,上手太easy了,我也是业余玩玩
http://bbs.eeworld. ...

多谢楼主,我也要尽快上手QT,不能一直都是字符终端,有界面的感觉就是要不一样些!
 
 
 

回复

170

帖子

3

TA的资源

一粒金砂(中级)

8
 
哈哈,支持楼主。下下来学习学习
 
 
 

回复

554

帖子

0

TA的资源

版主

9
 
楼主算是比较早使用QT5了,我们还没用上,现在还主要在QT4下折腾。。。

点评

哈哈。embedded下面我也还是用的qt4哦,不深入玩感觉都差不多,高级功能用不上恩,已经折腾到helper2416上面去了,见另外一贴,重新整理了下  详情 回复 发表于 2014-8-2 17:37
 
个人签名My dreams will go on...
http://www.jyxtec.com
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

10
 
spacexplorer 发表于 2014-8-2 17:00
楼主算是比较早使用QT5了,我们还没用上,现在还主要在QT4下折腾。。。

哈哈。embedded下面我也还是用的qt4哦,不深入玩感觉都差不多,高级功能用不上恩,已经折腾到helper2416上面去了,见另外一贴,重新整理了下


 
个人签名电工
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

11
 
你好  请问comm.cpp里面是什么代码?谢谢
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

12
 
你好  请问comm.cpp里面是什么代码?谢谢
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

13
 
你好,我想问一下您,我按你文章中所述建立tcp连接,在编译的过程中总提示,connect无法识别标识符?还有就是我是把tcp连接作为线程写的,最终是要在MainWidow中调用
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

14
 
可以知道楼主的qq号吗,想问一下我遇到的具体细节问题
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

15
 
楼主能不能分享一下你的全部代码,
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

16
 
拜托楼主分享代码,这里要做一个课程设计,急需一个实例快速入门……
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表