Qt下Client与Server之间的双向TCP通信。

Qt下Client与Server之间的双向TCP通信。


    由于需要,一个GPRS模块(与PC串口相连)要和一台PC进行远程通信,其实很简单,就是一个简单的C/S模型,但由于采用的是无线网络,所以发包总有丢失现象,所以要对其加以确认环节,即Server向Client发数据(Client向Server发数据已经成功)。由于刚开始对TCP连接不是很熟,所以感觉这个问题不是很好实现,因为一端是GPRS一端是PC。觉得就算PC向TCPSocket里写东西了也没有人会把数据发到GPRS模块上。但回来认真读了一下TCP连接的方式,豁然开朗。连接方式这里就不说了,即所谓的三次握手。这里要说的是什么时候TCP连接断开。理论上TCP连接如果连好在没有给指令的条件下是不自动断开的(实际有例外)。所以就想,如果连接还没有断开,直接往TCPsocket里写数据那边模块应该就能读出来了。

    用程序试了试,再每当收到数据后,判断数据大小,如果大小与规定大小相同,则发送OK,如果不同则发送NO,要求Client重新发送。结果调试通过。于是恍然大悟,原来用的GPRS模块在有数据时是不自动断开的,当没有数据后才断开。所以在Server的TCPsocket里直接写数据就可以传到GPRS模块了,问题解决。

    下面简单说一下代码(以两台PC间通信为例)。

Client:

 serverIP->setAddress ("127.0.0.1");
 port=8080;
 tcpsocket->connectToHost ( *serverIP, port);//建立连接

 QString str;
 str="Hello";

 std::string str2 = std::string(str.toAscii().data());
 const char * str3 = str2.c_str();

 tcpsocket->write (str3);//发送Hello
 qDebug()<<str3;
 QString str5;
 str5=tcpsocket->readAll();//读Server发过来的数据
 qDebug()<<str5;

Server:

 server.listen(QHostAddress::Any, 8080);//监听端口
 connect(&server, SIGNAL(newConnection()),this, SLOT(acceptConnection()));//连接槽,当有新连接时进入acceptConnection()槽

//以下为acceptConnection()槽

 tcpsocket=server.nextPendingConnection();//使TCPsocket=当前访问者
 connect(tcpsocket, SIGNAL(readyRead()),this, SLOT(readData()));//连接槽,当有数据时进入readData()槽

//以下为readData()槽

 qDebug()<<"readData()"<<"IP"<<tcpsocket->peerAddress ().toString ()<<tcpsocket->peerPort ();
 
 str=tcpsocket->readAll();//读数据
 edit->setText (str);
 if(str.length ()==5)//判断长度
 {
 qDebug()<<str;
 tcpsocket->write("OK");//返回OK
 }
 else
 {
  tcpsocket->write("NO");//返回NO
 }

这样双机间的互连通信就建立好了。与GPRS和PC通信是一样的道理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值