Android(客户端)通过socket与QT(服务端)通信

一、概述

在这里我想实现一个跨平台的socket通讯,Android手机作为客户端向Ubuntu的QT平台上的服务端发送一个字符命令,由于是只发送一个字符,这里我尽可能简化socket通讯的过程以供后人参考。
文中贴上主要代码,末尾会给出完整源代码的下载。

二、QT的服务端

QT上的服务端我使用了QTcpServer和QTcpSocket类,大体的流程是这样的:
1、主窗口进入UI
2、启动TcpServer开始监听一个端口
3、监听到有新的Connection信号则触发下一个函数获取该socket
4、获取到该socket后触发读函数槽
5、读取信息,并进行字符编码的转换(很重要)
上代码
mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <sys/socket.h>
#include <sys/types.h>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    startTcpserver();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::startTcpserver()
{
    m_tcpServer = new QTcpServer(this);
    m_tcpServer->listen(QHostAddress::Any,60000); //监听任何连上60000端口的ip
    connect(m_tcpServer,SIGNAL(newConnection()),this,SLOT(newConnect())); //新连接信号触发,调用newConnect()槽函数,这个跟信号函数一样,可以随便取。
}

void MainWindow::newConnect()
{
    m_tcpSocket = m_tcpServer->nextPendingConnection(); //得到每个连进来的socket
    connect(m_tcpSocket,SIGNAL(readyRead()),this,SLOT(readMessage())); //有可读的信息,触发读函数槽       
}

void MainWindow::readMessage() //读取信息
{
    qint64 len = m_tcpSocket->bytesAvailable();
    qDebug()<<"socket data len:"<< len;
    QByteArray alldata = m_tcpSocket->read(len);
    //开始转换编码
    QTextCodec *utf8codec = QTextCodec::codecForName("UTF-8");
    QString utf8str = utf8codec->toUnicode(alldata.mid(2));
    qDebug()<<"hex:["<<alldata.toHex().toUpper()<<"]";
    qDebug()<<"utf-8 ["<< (utf8str) << "]";
    //显示到控件上
    ui->label->setText(utf8str);

}

void MainWindow::sendMessage() //发送信息
{
    //QString strMesg= ui->lineEdit_sendmessage->text();
    QString strMesg="连接成功";
    qDebug()<<strMesg;
    m_tcpSocket->write(strMesg.toStdString().c_str(),strlen(strMesg.toStdString().c_str())); //发送
}

这是主窗口源代码,所有函数都在这里,函数调用过程是ui->startTcpserver()->newConnect()->readMessage()。
由于从java发过来的String类型字符串在socket传输过程中实际上被转换成UTF-8编码的字节数组,QT作为Server接收之后要对其进行转换,就是readMessage()函数里的过程

    qint64 len = m_tcpSocket->bytesAvailable();//获取长度
    qDebug()<<"socket data len:"<< len;
    QByteArray alldata = m_tcpSocket->read(len);
    /**开始转换编码**/
    QTextCodec *utf8codec = QTextCodec::codecForName("UTF-8"
  • 8
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值