Chinaunix首页 | 论坛 | 博客
  • 博客访问: 38718
  • 博文数量: 20
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 145
  • 用 户 组: 普通用户
  • 注册时间: 2016-03-25 09:44
个人简介

unix

文章分类

全部博文(20)

文章存档

2016年(20)

我的朋友

分类: 嵌入式

2016-05-09 12:56:50

1.  连接服务器
m_tcpSocket->connectToHost("127.0.0.1", 9877);
connected = m_tcpSocket->waitForConnected();
只有使用waitForConnected()后,QTcpSocket才真正尝试连接服务器,并返回是否连接的结果。

2. 写数据
m_tcpSocket->write(str.toStdString().c_str(), strlen(str.toStdString().c_str()));
m_tcpSocket->waitForBytesWritten();
当使用waitForBytesWritten()后,QTcpSocket才真正发送数据。
m_tcpSocket->write(str1.toStdString().c_str(), strlen(str1.toStdString().c_str()));
m_tcpSocket->write(str2.toStdString().c_str(), strlen(str2.toStdString().c_str()));
的结果是发送了str1str2

3. 断开与服务器的连接
m_tcpSocket->disconnectFromHost()
m_tcpSocket->waitForDisconnected()

4. 善于使用QTcpSocket的SIGNAL:connected(), disconnected(), error(QAbstractSocket::SocketError)
    配合自定义私有开关变量bool connected, QTimer
   可以实现自动重连接等逻辑。

这久在写一个基于TCP的通信程序,Server端用WinCE实现,而Client端用Qt实现,之前已写了一个VC的Client端,能正确向Server发送数据。

将Client端改用Qt实现后connectToHost()后,server端已能正确accept(),但就是write()后server的read函数无法响应。调试了半天没有成功,火大呀!今天试着输出socket的状态后得到如下:

  1. bool TcpClient::newConnect(const QString &iAddr, quint16 iPort)
  2. {
  3.     mSocket = newQTcpSocket(this);
  4.     mSocket->connectToHost(iAddr,iPort);
  5.     qDebug("State:%dn",mSocket->state());   // State: 2; 2代表ConnectingState,正确的应该为3(ConnectedState)

  6.     connect(mSocket,SIGNAL(readyRead()),this,SLOT(read()));
  7.     connect(mSocket,SIGNAL(disconnected()),this,SLOT(disConnect()));return(true);
  8. }

  9. qint64 TcpClient::write(const QByteArray &iData)
  10. {
  11.     qint64len = mSocket->write(iData);
  12.     qDebug("State:%dn",mSocket->state()); // State: 2; 2代表ConnectingState,正确的应该为3(ConnectedState)

  13.     msleep(200);
  14.     return(len);
  15. }
复制代码
通过输出状态,已经找到问题的所在,哎!都是业务不熟害的呀!
socket的连接是异步的,所以必须等连接建立完成才能使用,所以分别加入waitForConnected()和waitForBytesWritten()后调试通过。
  1. bool TcpClient::newConnect(const QString &iAddr, quint16 iPort)
  2. {
  3.     mSocket = newQTcpSocket(this);
  4.     mSocket->connectToHost(iAddr, iPort);
  5.     qDebug("State:%dn",mSocket->state());   // State: 2; 2代表ConnectingState,正确的应该为3(ConnectedState)

  6.     constintTimeout=5*1000;
  7.     if(!mSocket->waitForConnected(Timeout))
  8.     {
  9.         return(false);
  10.     }
  11.     qDebug("State:%dn",mSocket>state()); // State: 3(ConnectedState)正确

  12.     connect(mSocket,SIGNAL(readyRead()),this,SLOT(read()));
  13.     connect(mSocket,SIGNAL(disconnected()),this,SLOT(disConnect()));return(true);
  14. }

  15. qint64 TcpClient::write(const QByteArray &iData)
  16. {
  17.     qint64len = mSocket->write(iData);
  18.     mSocket->waitForBytesWritten(300);
  19.     qDebug("State:%dn",mSocket->state());  // State: 3(ConnectedState)正确

  20.     msleep(200);
  21.     return(len);
  22. }
阅读(484) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~