TCP通信总结 ZY_tcp通信总结zy
TCP通信总结 ZY由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“tcp通信总结zy”。
Qt 中利用 TCP 实现多个客户端之间相互发送消息系以及服务器的群发信息
思路如下:首先每个客户端与服务器相连是会有一个对应的 Tcpsocket,把这些sockt 全部放入一个 list 容器中,当客户端有数据发送时,读取是哪个 socket 中的消息,读取完后,再把消息发送到 list 中的所有 socket 中,在客户端判断这个消息是不是发送给自己的,如果是,则接受,否则不接受(在读到是哪个 socket 中有数据时,也可直接写入到这个 socket 中),要注意的是对数据进行打包和解包。对数据进行分析,我这个只是一个简单的参考。创建一个存放 socket 的 list 容器:
socket_list= newQList;把客户端的 socket 放入 list 容器中:
m_tcpsocket = m_tcpserver->nextPendingConnection();socket_list->append(m_tcpsocket);
connect(m_tcpsocket,SIGNAL(readyRead()), this,SLOT(readMeage()));服务器读取客户端的消息: void Widget::readMeage(){
for(int i = 0;i length();i ++){ array_str = QString(socket_list->at(i)->readAll());if(!(array_str.isEmpty())){ qDebug()
}
void Widget::sendMeage(QString infomation){
for(int i = 0;i length();i ++){ socket_list->at(i)->write(cmd.toUtf8().data());//m_tcpsocket->write(infomation.toUtf8().data());
}
}
实例程序:
pro 文件里要加一句:QT += network
服务器端:
1、声明QTcpServer、QTcpSocket QTcpServer *tcpServer;//监听套接字 QTcpSocket *tcpSocket;//通信套接字
2、定义、实例化
tcpServer = NULL;tcpSocket = NULL;tcpServer = new QTcpServer(this);tcpServer->listen(QHostAddre::Any,8888);//监听所有
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(getSocket()));socket_list = new QList;//zy服务器一对多客户端用到
3、作为服务器通过TCP协议接收数据 void MainWidget::getSocket(){ tcpSocket = tcpServer->nextPendingConnection();//获取已经建立的连接的子套接字
socket_list->append(tcpSocket);//添加到socket_list中
QString ip = tcpSocket->peerAddre().toString();//此处是通过通信的套接字进行获取,也可以获取对方的IPv6和IPv4,但是此处转换为QString型
qint16 port = tcpSocket->peerPort();//直接获取端口,不需要进行转换
QString temp = QString::fromLocal8Bit(“[%1:%2]:成功连接”).arg(ip).arg(port);qDebug()
[=](){ //这种只能1对1
//从通信套接字中取出内容//array = @i00009装备9请求帮助$
//array = tcpSocket->readAll();//readAll()函数是比较方便的取出tcpSocket中的所有的内容
// array_str = QString(array);
// qDebug()
for(int i = 0;i length();i ++){ array_str = QString(socket_list->at(i)->readAll());//依次 //注意接收和发送的编码要一致 读取
if(!(array_str.isEmpty()))
{ qDebug()
//解析数据
if(array_str.mid(0,1)== “@” &&
array_str.mid(array_str.size()-1,1)== “$”)//帧头帧尾
{ if(array_str.mid(1,1)== “i”)//功能码
{
ui->information->setText(array_str.mid(7,array_str.size()-8));} if(array_str.mid(1,1)== “j”)//功能码
{
ui->information->setText(array_str.mid(7,array_str.size()-8));} }
//将读到的数据插入到数据库中
QString insert_tcp_text = “insert into meage_tcp_receive values(null,?,?,now())”;QSqlQuery sql_insert_tcp_text;sql_insert_tcp_text.prepare(insert_tcp_text);sql_insert_tcp_text.bindValue(0, array_str.mid(0,5));sql_insert_tcp_text.bindValue(0, array_str);sql_insert_tcp_text.exec();
if(array_str.mid(0,1)== “0”)//功能码
{ QString select_data = “select car_id from realtime_data limit 1”;QSqlQuery sql_select_data;sql_select_data.prepare(select_data);sql_select_data.exec();QString
id=QString::number(sql_select_data.value(0).toInt()+1);
QString insert_data = “insert into realtime_data values(null,?,?,?,?,?,0,0,0,0,0,0,0,0,0,0,0,0,now(),now())”;QSqlQuery sql_insert_data;sql_insert_data.prepare(insert_data);sql_insert_data.bindValue(0, id);sql_insert_data.bindValue(1, “401158”);sql_insert_data.bindValue(2, array_str.mid(2,5));sql_insert_data.bindValue(3, “192.168.1.4”);sql_insert_data.bindValue(4, “192.168.1.108”);sql_insert_data.exec();
QString back_id=id.sprintf(“%05d”,id);;writeCmd(“@0”+back_id+“$”);
}
}
4、作为服务器发送数据信息
void MainWidget::writeCmd(QString cmd){ //这种只能1对1
// //qDebug()
// return;
// }//如果最开始没有建立连接,那么tcpSocket就为一个空的值,这时不能进行发送数据的操作
// //发送数据给对方,使用套接字tcpSocket // tcpSocket->write(cmd.toUtf8().data());
//这种能1对多
for(int i = 0;i length();i ++){ socket_list->at(i)->write(cmd.toUtf8().data());//注意接收和发送的编码要一致
//m_tcpsocket->write(infomation.toUtf8().data());
} }
客户器端:
1、声明,定义QTcpSocket QTcpSocket *socket;
2、实例化,建立TCP连接
//TCP连接
socket = new QTcpSocket();connect(socket, SIGNAL(connected()), this, SLOT(OnConnected()));connect(socket, SIGNAL(disconnected()), this, SLOT(OnDisconnected()));connect(socket, SIGNAL(readyRead()), this, SLOT(socket_Read_Data()));int port = 8888;//获取端口号,与服务器端口一致
socket->abort();//取消已有的连接
socket->connectToHost(IP, port);//连接服务器
if(!socket->waitForConnected(1000))//等待连接成功
{ qDebug()
{ qDebug()
3、作为客户端通过TCP协议接收数据 //从服务器端获取控制信号
void MainWindow::socket_Read_Data(){ QByteArray signal;//读取缓冲区数据
signal = socket->readAll();QString signaldata;signaldata = QString(signal);}
4、作为客户端发送数据信息
void MainWidget::writeCmd(QString cmd){ //这种只能1对1
//qDebug()
if(NULL == tcpSocket){ return;}//如果最开始没有建立连接,那么tcpSocket就为一个空的值,这时不能进行发送数据的操作
//发送数据给对方,使用套接字tcpSocket
tcpSocket->write(cmd.toUtf8().data());
}
如皋市中央大道(益寿南路~海阳南路)工 程竣工总结 南通市港闸市政工程有限公司如皋市中央大道(益寿南路~海阳南路)工程项目经理部二0一二年十一月如皋市中央大道(益寿南路~海阳南路)......
自我剖析材料这段时间通过《保持共产党先进性教育读本》的学习和学校组织的一些学习活动,以及回顾入党志愿,对照党员的八条义务,我才发现自己是那么的渺小,有好多的不足:一、在思......
轮岗心得入职一月,公司安排了为期5周的轮岗学习,已至金秋。此次轮岗,本着深入了解部门运作与联系情况,先后参与到安检部,调度室,运检部,营销部和城北供电所5个岗位,对各个部门工作情......
轮岗心得入职一月,公司安排了为期5周的轮岗学习,已至金秋。此次轮岗,本着深入了解部门运作与联系情况,先后参与到安检部,调度室,运检部,营销部和城北供电所5个岗位,对各个部门工作情......
2013--2014第一学期2012级(秋季)形式与政策期末论文试题1、联系实际,谈谈你对“中国梦”的理解。2、深入开展党的群众路线教育实践活动的内容是什么?有什么重要意义?3、云南是美......
