实现Android和Linux之间的UDP通信

前提: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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaolin2016

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值