一、概述
在这里我想实现一个跨平台的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"