Qt下Client与Server之间的双向TCP通信。
2014-02-25 17:05
501 查看
由于需要,一个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通信是一样的道理。
用程序试了试,再每当收到数据后,判断数据大小,如果大小与规定大小相同,则发送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通信是一样的道理。
相关文章推荐
- inux的安装和启动流程(http://www.2cto.com/os/201208/145165.html)
- Operating system error 64(指定的网络名不再可用。)
- pxe网络引导安装linux_mint自定义镜像环境
- http://www.cnblogs.com/scy251147/p/3566638.html
- 从TPS,TCP/IP到 IP,CIDR,Socket等相关网络概念的梳理
- 阅读英语论文题目列表
- http错误码
- Android网络连接判断与处理
- 【模式识别】OpenCV中使用神经网络 CvANN_MLP
- 深入浅出TCP之send和recv
- 浅谈TCP/IP网络编程中socket的行为
- WinSock网络编程学习笔记(五):查询主机信息
- 基于网络的Linux自动化安装
- 深入理解Hadoop集群和网络
- TCP的三次握手/四次挥手以及状态变迁图
- Android_HttpClient
- 也谈一点web应用架构的看法——基于http api的web应用
- ubuntu设置系统时间与网络时间同步
- linux 进程管理,内存管理,文件系统,系统管理,网络操作概述
- HttpClient 教程 (一)