Qt客户服务端传输数据总结

第一个小项目是关于Qt多线程与网络传输的。
环境:VS2015+QT5.3(或者任意的其他版本的VS+QT组合)
要求:分别编写一个客户端和服务器端的程序,程序A作为客户端,程序B作为服务器端,具体要求如下(期限3到5天时间):
a)程序B需要每隔1秒向程序A不停的传送报文1,报文2和报文3三种报文,用多线程的方式实现三种报文的发送。报文采用结构体进行定义(包括报文头,报文数据,报文尾三部分),报文数据也用结构体的形式进行定义。
b)程序A的界面需要三个元素:
1)可以进行服务器端IP和端口号配置的输入框;
2)需要对程序B发过来的报文内容进行显示(只需要显示报文数据内容,不需要显示报文头和尾);
3)需要一个列表用来对不同类型的报文的个数进行统计,列表列名包括报文名字和报文个数(报文个数需要实时统计)。
c)通迅部分采用的通讯机制,不做强制要求,以实现为目的;其他部分需要采用QT实现。
这个题目我的思路是:
首先解决服务端的数据发送问题:
初始化网络环境–>初始化套接字–>等待客户端连接–>接入套接–>初始化三个线程并把套接字传入–>发送数据
客户端接收数据:
初始化网络环境–>初始化套接字–>连接服务器–>获取套接字数据存入缓存池–>刷新界面数据

期间遇到的疑惑:

线程间共享数据?
线程间贡献一个数据,好像只要不是new出来的,可以共享。几个共享线程间发送数据,共享一个套接字,把数据作为线程类初始化参数传过去。

Qt的自定义信号是怎么做的?
写一个函数,定义触发条件,满足触发条件了就emit发送信号。

如何通过套接字传输结构体?
内存打包。把内存中的内容通过memcpy拷贝到一个字符数组当中。接收之后用一个通用结构体存起来,再通过数据报头解析数据报。我发送的三种报文的大小是一样的,如果大小不一样呢?关于内存对其的规律。

Qt中的多线程开启方式?
线程类继承QThread,重写Run函数。
据说还有一种办法,尚未验证,线程类继承自QObject类,利用movetoThread方法改变线程所属到一个继承自QThread类的类的对象中。

盲点:
关于Qt的网络套接字用法?规避了这个问题,采用了Windows系统提供的套接字
关于QByteArray
关于Qt的流

改进的地方:
把通讯模块独立设计出来

猜你喜欢

转载自blog.csdn.net/naughfy/article/details/73137266