Chinaunix首页 | 论坛 | 博客
  • 博客访问: 293298
  • 博文数量: 155
  • 博客积分: 1688
  • 博客等级: 上尉
  • 技术积分: 1560
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-17 08:06
文章分类
文章存档

2011年(16)

2009年(137)

2008年(2)

分类: LINUX

2009-06-06 03:14:49

最近的课程设计让我重新开始使用QT,上次数据结构的也是用QT,虽然是做出来了,但是现在想想,那个时候对QT的理解,或者说得更广一点,对OO的理解,简直太差劲了,当然,人的知识是进步的,所以现在有这样的感受是很正常的。虽然整体的开发工作还没有完全结束,但是已经有了很多心得体会,所以特来记录分享一下。

我们的系统采用的是C/S结构,所以客户端与通信是最关键,不幸的是,虽然我们没有用过QT的类,我们也没有估计好的难度,等到意识到第一次使用的困难时,已经是第5天了,始终没有进展,我临危受命。现在是第6天,刚刚把通信模块封装好,算是对这两天的的一个回报。

我们遇到的问题socket已经,并且发送端已经将消息发送,但是接收端始终收不到消息。(我用的socket类型是TCP,也就是QTcpSocket类)

发送端(发送端一直不存在问题)代码如下:

  1. ... // 建立连接,客户端和服务器端有区别,在此省略
      
  2. QByteArray block;   
  3. QDataStream out(&block,QIODevice::WriteOnly);  // 写信息至block中,用到QDataStream类
      
  4. socket.write(block);// 信息写完毕,写入socket,由socket发送
      
  5. socket.disconnectFormHost();   
  6. socket.waitForDisconnected();  

有问题的接收端代码如下:

  1. ... // 建立连接
      
  2. QDataStream in(&socket);// 接收socket中的数据流
      
  3. ... // 从数据流 in 中读数据  

以上是最原始的接收和发送端工作过程,调试过程中,分别讲两端的socket的状态打印出来,结果是发送端为A connection is established. 而接收端为The socket has started establishing a connection. 也就是说发送端正确的建立了连接,并将数据写入,而接收端只是正在建立连接,而并没有建立好,所以是根本不会受到数据的。所以先要确保接收端的连接建立好。waitForConnected()方法就可以解决这个问题,它将一直等待直到连接已经建立。

改进后的接收端代码:

  1. ... // 建立连接
      
  2. socket.waitForConnected(5000) // 5000表示等待的时间,默认参数为3000,单位是百万分之一秒   
  3. QDataStream in(&socket);// 接收socket中的数据流
      
  4. ... // 从数据流 in 中读数据  

此时,接收端输出的socket状态为A connection is established,连接成功建立。
但是还是收不到信息,参考了一下别人的程序,再比对一下参考手册,原来QTcpSocket的爷爷类(其实是父类QAbstractSocket的父类)QIODevice有一个readyRead的信号(signal),当信息准备好并可以读的时候,这个信号就将发出,也就是说,只有当这个信号发出的时候,才可以读消息。所以要把读消息的动作read作为一个槽(slot),并将其与readyRead信号连接。

  1. connect(&socket,SIGNAL(readyRead()),this,SLOT(read()));  

但是直接触发socket信号,而不用图形界面的动作来触发一个动作并由这个动作来触发socket信号一直也触发不了read这个动作。但是我要封装成一个接口类提供给上层使用,用图形界面自然是不现实的,于是翻阅了手册,发现了一个QAbstractSocket类的一个方法——waitForReadyRead(),这个方法将一直等待到数据可以读时结束,此时就可以读数据了。方法也很简单:

  1. ... // 建立连接
      
  2. socket.waitForConnected(5000) // 5000表示等待的时间,默认参数为3000,单位是百万分之一秒
      
  3. if(!socket.waitForReadyRead(3000)){//3000为等待时间,没有默认的等待时间,单位是百万分之一秒   
  4. return ;   
  5. }
      
  6. QDataStream in(&socket);// 接收socket中的数据流
      
  7. ... // 从数据流 in 中读数据  

这样,数据成功读取出来,实现数据的通信。

单向的数据传输问题解决了,然后再利用单向的数据通信组装成双向的数据通信,这过程中也会遇到不少问题,将在另一篇日志介绍。

阅读(1863) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~