QT-TCP通信一对多实例

pro 文件里要加一句: QT += network
服务器端:

1、 声明 QTcpServer、 QTcpSocket
QTcpServer *tcpServer; //监听套接字
QTcpSocket *tcpSocket; //通信套接字

2、 定义、 实例化
tcpServer = NULL;
tcpSocket = NULL;
tcpServer = new QTcpServer(this);
tcpServer->listen(QHostAddress::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->peerAddress().toString();//此处是通过通信
的套接字进行获取,也可以获取对方的 IPv6 和 IPv4,但是此处转换为 QString

qint16 port = tcpSocket->peerPort();//直接获取端口,不需要进行转换
QString temp = QString::fromLocal8Bit("[%1:%2]:成功连接
“).arg(ip).arg(port);
qDebug() << temp;//打印 ip,port
connect(tcpSocket,&QTcpSocket::readyRead, //先取出了tcpSocket 之后才能有调取 readyRead
=
{
//这种只能 1 对 1
//从通信套接字中取出内容//array = @i00009 装备 9 请求帮助$
//array = tcpSocket->readAll();//readAll()函数是比较方便的取出
tcpSocket 中的所有的内容
// array_str = QString(array);
// qDebug() << QString(array)<< array_str.size();
// //array_str = QString::fromLocal8Bit(”@i00009 装备 9
请求帮助KaTeX parse error: Expected 'EOF', got '&' at position 276: …id(0,1) == "@" &̲& array_str.mi…")//帧头帧尾
{
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 message_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() << “writeCmd” << cmd;
// if(NULL == tcpSocket)
// {
// return;
// }//如果最开始没有建立连接,那么 tcpSocket 就为一个空的值,这时不
能进行发送数据的操作
// //发送数据给对方,使用套接字 tcpSocket
// tcpSocket->write(cmd.toUtf8().data());
//这种能 1 对多
for (int i = 0;i < socket_list->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() << QString::fromLocal8Bit("指挥中心连接失败! "));
}else
{
qDebug() << QString::fromLocal8Bit(“指挥中心连接成功!”));
}

3、 作为客户端通过 TCP 协议接收数据
//从服务器端获取控制信号
void MainWindow::socket_Read_Data()
{
QByteArray signal;
//读取缓冲区数据
signal = socket->readAll();
QString signaldata;
signaldata = QString(signal);
}

4、 作为客户端发送数据信息
void MainWidget::writeCmd(QString cmd)
{
//qDebug() << “writeCmd” << cmd;
if(NULL == tcpSocket)
{
return;
}//如果最开始没有建立连接,那么 tcpSocket 就为一个空的值,这时不能
进行发送数据的操作
//发送数据给对方,使用套接字 tcpSocket
tcpSocket->write(cmd.toUtf8().data());
}

你可能感兴趣的:(QT)