前提:Android设备和Linux设备必须在同一个局域网内。
Linux平台使用QT开发程序。
Android客户端:
请参考文章:《Android实现Udp socket通信且对数据进行分包和解析》
Linux平台服务端Qt程序:
QtUdpSocketServer.cpp
#include <QBuffer>
#include <QImageReader>
#include <QtUdpSocketServer.h>
QtUdpSocketServer::QtUdpSocketServer(){
// 服务端的ip地址,需要跟客户端ip ping通才能通信
mIpAddress = "192.168.20.113";
// UDP的服务端端口号,客户端连接时,需要对应上这个端口号
mPort = 6003;
// 创建UDP的服务端
mUdpSocket = new QUdpSocket(this);
// 注册服务端的信号槽和数据接收函数,当有缓冲区接收到数据时,执行dataReceived()
connect(mUdpSocket,SIGNAL(readyRead()),this,SLOT(dataReceived()));
// 绑定本地端口和ip地址
bool bResult = mUdpSocket->bind(QHostAddress(mIpAddress),mPort,QUdpSocket::ShareAddress);
}
QtUdpSocketServer::~QtUdpSocketServer()
{
}
//数据接收的回调
void QtUdpSocketServer::dataReceived()
{
//read data
while(mUdpSocket->hasPendingDatagrams())
{
QByteArray datagram;
//read data
datagram.resize(mUdpSocket->pendingDatagramSize());
mUdpSocket->readDatagram(datagram.data(),datagram.size());
int readSize = datagram.size();
int head;
QString msg = datagram.data();
if( readSize > 8 ){
head = ((datagram.data()[0] & 0xff) << 8) | datagram.data()[1];
if( head == 0xA66A ){
//Start
mFrameSize = ( (datagram.data()[3] & 0xff) << 24 | (datagram.data()[4] & 0xff) << 16 | (datagram.data()[5] & 0xff) << 8 | (datagram.data()[6] & 0xff) );
mFrameType = datagram.data()[2];
mFrameID = datagram.data()[7];
if(mFrameSize >= 0){
mReadBuffer.clear();
}
mTotalSize = 0;
}
if( mTotalSize < mFrameSize + 8 && (mTotalSize + readSize) <= mFrameSize + 8)
{
mTotalSize += readSize;
mReadBuffer += datagram;
if( mTotalSize == mFrameSize + 8){
//End
mReadBuffer.remove(0,8);
if( mFrameType == 0x01){
//do something
//ReadMapData(mFrameID,mReadBuffer);
}else if( mFrameType == 0x03){
//do something
//ReadMusicData(mFrameID,mReadBuffer);
}
mFrameSize = 0;
mFrameType = 0;
mFrameID = 0;
}
}
}
}
}
QtUdpSocketServer.h
#ifndef QTUDPSOCKETSERVER_H
#define QTUDPSOCKETSERVER_H
#include <QThread>
#include <QUdpSocket>
class QtUdpSocketServer: public QThread{
Q_OBJECT
public:
QtUdpSocketServer();
~QtUdpSocketServer();
void ReadMapData(int frameID,QByteArray array);
void ReadMusicData(int frameID,QByteArray array);
public slots:
void dataReceived();
signals:
void start_music_emit(int,QByteArray);
void start_map_emit(QByteArray);
private:
QString mIpAddress;
quint16 mPort;
QUdpSocket *mUdpSocket;
int mTotalSize = 0;
int mFrameSize = 0;
int mFrameType = 0;
int mFrameID = 0;
QByteArray mReadBuffer;
};
#endif // QTUDPSOCKETSERVER_H