当前位置: 首页 > news >正文

QT使用Socket与安卓Socket互发消息

背景:安卓设备通过usb网络共享给Linux,此时安卓设备与linux处于同一网络环境,符合使用socket的条件,linux做客户端,安卓做服务端

1.QT使用Socket

(1).在工程文件中加入

QT += network

(2).导包以及写一些槽函数用做数据传输与状态接收

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtNetwork/QTcpSocket>
#include <QMainWindow>
#include <QTcpServer>
#include "QTimer"namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();public slots://用做读取服务端发送的数据void readData();//获取当前socket的连接状态void displayError(QAbstractSocket::SocketError);private:Ui::MainWindow *ui;QTcpSocket *socket;
};#endif // MAINWINDOW_H

(3).实现Socket的数据互发与接收

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QFile"
#include "QTextCodec"
#include "QDebug"
#include "QFontDatabase"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);socket = new QTcpSocket(this);socket->abort();//这个地方是重点,因为安卓端我没有设置ip,那么这里的ip就是USB共享所分配的ip,可以进入安卓端使用ifconfig获取到ip地址//端口9999是我在安卓服务端设置的,等会安卓端代码会有写socket->connectToHost("192.168.XXX",9999);connect(socket, &QTcpSocket::readyRead, this, &MainWindow::readData);connect(socket, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(displayError(QAbstractSocket::SocketError)));
}void MainWindow::readData() {qDebug() << "******************************clein====********************************";QString data = socket->readAll();QTextCodec* codec = QTextCodec::codecForName("UTF-8");QString strData = codec->toUnicode(data.toUtf8());qDebug() << "readData message==="<<strData; // 输出 "11111"qDebug() << "******************************clein********************************\n";/*******************************读取到数据以后自动发送数据给服务端**********************************/// 用于暂存要发送的数据QString datas = "on_pushButton_2_clicked"; // 要发送的数据// 将数据转换为 UTF-8 编码QTextCodec* codecs = QTextCodec::codecForName("UTF-8");QByteArray utf8Data = codecs->fromUnicode(datas);// 发送数据socket->write(utf8Data);socket->flush();}void MainWindow::displayError(QAbstractSocket::SocketError){qDebug() << "displayError error===="<<socket->errorString();}MainWindow::~MainWindow()
{delete ui;
}

到这里QT代码就写完了,接下来我们看一下安卓端的发送与接收:

 2.安卓使用Socket,直接上服务端代码(Kotlin)

package com.jk.rtkimport android.content.Context
import android.net.ConnectivityManager
import android.net.wifi.WifiManager
import android.os.Build
import android.util.Log
import java.io.IOException
import java.io.InputStream
import java.io.OutputStreamWriter
import java.net.*
import java.util.*object SocketServer {private val TAG = SocketServer::class.java.simpleNamevar SOCKET_PORT = 9999private var socket: Socket? = nullprivate var serverSocket: ServerSocket? = nullprivate lateinit var mCallback: ServerCallbackvar result = true/*** 开启服务*/fun startServer(callback: ServerCallback): Boolean {Log.i(TAG, "startServer: ")mCallback = callbackThread {try {serverSocket = ServerSocket(SOCKET_PORT)while (result) {socket = serverSocket?.accept()mCallback.otherMsg("${socket?.inetAddress} to connected")ServerThread(socket!!, mCallback).start()}} catch (e: IOException) {e.printStackTrace()result = false}}.start()return result}/*** 关闭服务*/fun stopServer() {Log.i(TAG, "stopServer: ")socket?.apply {//shutdownInput()//shutdownOutput()close()}serverSocket?.close()}/*** 发送到客户端*/fun sendToClient(msg: String) {Thread {if (socket!!.isClosed) {Log.e(TAG, "sendToClient: Socket is closed")return@Thread}Log.e(TAG, "sendToClient: msg====$msg")try {val out = OutputStreamWriter(socket!!.getOutputStream(), "UTF-8")out.write(msg)out.flush()mCallback.otherMsg("toClient: $msg")Log.d(TAG, "发送到客户端成功")} catch (e: IOException) {e.printStackTrace()Log.e(TAG, "向客户端发送消息失败")}}.start()}/** 获取USB共享的ip地址* */fun getUsbTetheringIpAddress(): String? {try {val interfaces: Enumeration<NetworkInterface> = NetworkInterface.getNetworkInterfaces()while (interfaces.hasMoreElements()) {val intf: NetworkInterface = interfaces.nextElement()val addresses = intf.interfaceAddressesfor (addr in addresses) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {if (addr.networkPrefixLength >= 16 && !addr.address.isLinkLocalAddress) {return addr.address.hostAddress}} else {if (addr.address.isSiteLocalAddress && !addr.address.isLinkLocalAddress) {return addr.address.hostAddress}}}}} catch (e: Exception) {e.printStackTrace()}return null}class ServerThread(private val socket: Socket, private val callback: ServerCallback) :Thread() {override fun run() {val inputStream: InputStream?try {inputStream = socket.getInputStream()val buffer = ByteArray(1024)var len: Intvar receiveStr = ""if (inputStream.available() == 0) {Log.e(TAG, "inputStream.available() == 0")}while (inputStream.read(buffer).also { len = it } != -1) {receiveStr += String(buffer, 0, len, Charsets.UTF_8).trim()if (len < 1024) {Log.e(TAG, "inputStream.receiveStr == $receiveStr")callback.receiveClientMsg(true, receiveStr)receiveStr = ""}}} catch (e: IOException) {e.printStackTrace()e.message?.let { Log.e("socket error", it) }callback.receiveClientMsg(false, "")}}}
}

调用方式:这里用的java方式

(1).先启动服务 与回调函数boolean isSocket = SocketServer.INSTANCE.startServer(new ServerCallback() {@Overridepublic void receiveClientMsg(boolean success, @NonNull String msg) {Log.e("TAG", "SocketServer receiveClientMsg success=" + success + "   msg=" + msg);}@Overridepublic void otherMsg(@NonNull String msg) {Log.e("TAG", "SocketServer otherMsg  msg=" + msg);}});(2).发送数据: SocketServer.INSTANCE.sendToClient("json");

 linux运行截图

安卓端运行截图

 

相关文章:

QT使用Socket与安卓Socket互发消息

背景:安卓设备通过usb网络共享给Linux,此时安卓设备与linux处于同一网络环境,符合使用socket的条件,linux做客户端,安卓做服务端 1.QT使用Socket (1).在工程文件中加入 QT network (2).导包以及写一些槽函数用做数据传输与状态接收 #ifndef MAINWINDOW_H #define MAINWINDOW…...

Redis05-集群方案

目录 Redis集群方案 主从复制 主从复制的基本原理 主从复制的工作流程 乐观复制 主从复制的优势 哨兵机制 哨兵的关键作用 服务状态监控 哨兵选举Master规则 分片集群 分片集群中的数据读写 数据写入 数据读取 一致性哈希和客户端分片 Redis集群方案 微服务时代…...

故障演练的关键要素及重要性

故障演练是一种有计划的、模拟真实生产环境故障的活动。通过故意引入故障、模拟系统组件失效或模拟其他异常条件&#xff0c;团队可以观察并评估系统在这些情况下的反应。这有助于发现潜在的问题、改进应急响应和提高系统整体的可用性。 一、故障演练的关键要素 计划性&#xf…...

11月15日,每日信息差

今天是2023年11月15日&#xff0c;以下是为您准备的12条信息差 第一、去哪儿正式启动鸿蒙原生应用开发 第二、最高支持千亿向量规模&#xff0c;腾讯云向量数据库全面升级&#xff0c;同时和信通院一起联合50多家企业共同发布了国内首个向量数据库标准&#xff0c;推进向量数…...

java-关于alibaba的JSON.parseArray注意事项

String resultStr dataStrJosnObject.get("result").toString();JSONArray resultArray JSON.parseArray(resultStr);resultStr 格式是[{},{},{}] resultArray 的size是3 获取第一个{}字符串&#xff0c;使用resultArray.get(0) 获取第二哥个{}字符串&#xff0c;使…...

软文推广中媒体矩阵的优势在哪儿

咱们日常生活中是不是经常听到一句俗语&#xff0c;不要把鸡蛋放在同一个篮子里&#xff0c;其实在广告界这句话也同样适用&#xff0c;媒介矩阵是指企业在策划广告活动时&#xff0c;有目的、有计划的利用多种媒体进行广告传播&#xff0c;触达目标用户。今天媒介盒子就来和大…...

xss总结

xss注入总结 漏洞描述 XSS&#xff08;跨站脚本攻击&#xff09;是一种常见的网络安全漏洞&#xff0c;攻击者利用该漏洞在网页中插入恶意脚本&#xff0c;以获取用户的敏感信息或执行恶意操作。 XSS中文叫做跨站脚本攻击&#xff08;Cross-site scripting&#xff09;&…...

【MySQL学习】常见命令

数据库操作 &#xff08;1&#xff09;查询所有数据库名字 show databases;&#xff08;2&#xff09;常见数据库 create database db_name; //create if exist create database if exists databaseName;&#xff08;3&#xff09;删除数据库 drop database db_name;表格操…...

汽车ECU的虚拟化技术初探(二)

目录 1.概述 2.U2A虚拟化方案概述 3.U2A的虚拟化功能概述 4.虚拟化辅助功能的使能 5.留坑 1.概述 在汽车ECU的虚拟化技术初探(一)-CSDN博客里&#xff0c;我们聊到虚拟化技术比较关键的就是vECU的虚拟地址翻译问题&#xff0c;例如Cortex-A77就使用MMU来进行虚实地址的转换…...

vue3 el-menu初始化时选中没有高亮的问题(default-active和index的问题)

首先看官方文档的示例&#xff1a; 需要注意的是&#xff1a; 1、default-active的值是字符串&#xff0c;那么index绑定的值也要是字符串&#xff0c;且数字对应。不能default-avtive绑定的是1&#xff0c;而menu-item的index绑定的是45 2、default-active的值是当前选中me…...

Vue的class、style绑定

Vue中的样式也要回到原始的BOMDOMjs的前端组合去解读。 1、当模板直接引用style中定义的样式时&#xff0c;在HTML模板中按照正常的样式引用处理即可。 模板定义&#xff1a;<template> <div class"sizeclass">100</div> </template><st…...

day22_mysql

今日内容 零、 复习昨日 一、MySQL 一、约束 1.1 约束 是什么? 约束,即限制,就是通过设置约束,可以限制对数据表数据的插入,删除,更新 怎么做? 约束设置的语法,大部分是 create table 表名( 字段 数据类型(长度) 约束, 字段 数据类型(长度) 约束 );1.1 数据类型 其实数据类型…...

【VBA】基于EXCEL生成Insert语句工具

前言 基于Excel生成INSERT语句工具是为了解决在数据库中插入大量数据时手动编写INSERT语句繁琐和耗时的问题而开发的辅助工具。在软件开发和数据库管理等领域&#xff0c;测试数据是非常重要的&#xff0c;它可以用于测试和验证数据库的性能、功能和准确性。 手动编写INSERT语…...

算法与数据结构--前缀和

一维前缀和适用于计算某个一维数列某个数到某个数之间的累加和&#xff08;或者乘积&#xff0c;又或者异或和&#xff09;之类的。 比如计算某个一维度数列从i到j之间元素的和。最开始的想法就是从i遍历到j&#xff0c;将这之间的元素相加。但是当查询次数很多时候&#xff0…...

高频CSS面试题

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;web前端面试题库 BFC 块级格式上下文(block format context)是页面一块独立的渲染区域&#xff0c;具有一套独立的渲染规则 内部的…...

electron 内部api capturePage实现webview截图

官方文档 .capturePage([rect]) rect Rectangle (可选) - 要捕获的页面区域。 返回 Promise - 完成后返回一个NativeImage 在 rect内捕获页面的快照。 省略 rect 将捕获整个可见页面。 async function cap(){ let image await webviewRef.value.capturePage() console.log(im…...

sql9(Leetcode197上升的温度)

代码&#xff1a; inner join 至少存在一个 返回行 datediff 日期差 # Write your MySQL query statement below SELECT b.id FROM Weather a INNER JOIN Weather b WHERE DATEDIFF(b.recordDate,a.recordDate)1 AND b.Temperature>a.Temperature...

物联网AI MicroPython学习之语法 umqtt客户端

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; umqtt 介绍 模块功能: MQTT客户端功能 - 连线、断线、发布消息、订阅主题、KeepAlive等功能。 MQTT协议采用订阅者/发布者模式&#xff0c;协议中定义了消息服务质量&#xff08;Quality of Service&#x…...

SQLite3 数据库学习(二):SQLite 中的 SQL 语句详解

参考引用 SQLite 权威指南&#xff08;第二版&#xff09;SQLite3 入门 1. SQL 语句操作 SQLite 数据库 1.1 创建数据表格 create table 表名(字段名 数据类型&#xff0c; 字段名 数据类型&#xff0c; 字段名 数据类型&#xff0c; 字段名 数据类型); 命令行语句结束要加分…...

基础课4——客服中心管理者面临的挑战

客服管理者在当今的数字化时代也面临着许多挑战。以下是一些主要的挑战&#xff1a; 同行业竞争加剧&#xff1a;客服行业面临着来自同行业的竞争压力。为了获得竞争优势&#xff0c;企业需要不断提高自身的产品和服务质量&#xff0c;同时还需要不断降低成本、提高效率。然而…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中&#xff0c;用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例&#xff0c;介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单&#xff0c;执行相应操作&#xff0c;并提供平滑的滚动动画效果。 本文设计了一个…...

工厂方法模式和抽象工厂方法模式的battle

1.案例直接上手 在这个案例里面&#xff0c;我们会实现这个普通的工厂方法&#xff0c;并且对比这个普通工厂方法和我们直接创建对象的差别在哪里&#xff0c;为什么需要一个工厂&#xff1a; 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类&#xff1a; 两个发…...

mcts蒙特卡洛模拟树思想

您这个观察非常敏锐&#xff0c;而且在很大程度上是正确的&#xff01;您已经洞察到了MCTS算法在不同阶段的两种不同行为模式。我们来把这个关系理得更清楚一些&#xff0c;您的理解其实离真相只有一步之遥。 您说的“select是在二次选择的时候起作用”&#xff0c;这个观察非…...

SOC-ESP32S3部分:30-I2S音频-麦克风扬声器驱动

飞书文档https://x509p6c8to.feishu.cn/wiki/SKZzwIRH3i7lsckUOlzcuJsdnVf I2S简介 I2S&#xff08;Inter-Integrated Circuit Sound&#xff09;是一种用于传输数字音频数据的通信协议&#xff0c;广泛应用于音频设备中。 ESP32-S3 包含 2 个 I2S 外设&#xff0c;通过配置…...

安宝特案例丨寻医不再长途跋涉?Vuzix再次以AR技术智能驱动远程医疗

加拿大领先科技公司TeleVU基于Vuzix智能眼镜打造远程医疗生态系统&#xff0c;彻底革新患者护理模式。 安宝特合作伙伴TeleVU成立30余年&#xff0c;沉淀医疗技术、计算机科学与人工智能经验&#xff0c;聚焦医疗保健领域&#xff0c;提供AR、AI、IoT解决方案。 该方案使医疗…...