Android studio—socketIO库return与emit的使用

文章目录

      • 一、Socket.IO库简单使用说明
        • 1. 后端 Flask + Flask-SocketIO
        • 2. Android 客户端集成 Socket.IO
        • 3. 布局文件
        • 注意事项
      • 二、接受服务器消息的二种方法
        • 1. 客户端接收通过 `emit` 发送的消息
          • 功能
          • 使用场景
          • 后端代码(Flask-SocketIO)
          • 客户端代码(Android Studio,Java)
        • 2. 客户端接收通过 `return` 发送的响应
          • 功能
          • 使用场景
          • 后端代码(Flask-SocketIO)
          • 客户端代码(Android Studio,Java)
        • 4. 二者的区别
      • 拓展:room与namespace
        • 命名空间(Namespace)
          • 功能示例
        • 房间(Rooms)
          • 功能示例
        • 总结
        • 拓展:


Socket.IO 是一个流行的实时通信库,支持 WebSocket 和其他回退机制(如长轮询),能够在客户端和服务器之间实现低延迟的双向通信。

一、Socket.IO库简单使用说明

1. 后端 Flask + Flask-SocketIO

首先,确保你的 Flask 后端已经安装了 Flask-SocketIO。你可以通过以下命令安装:

pip install Flask Flask-SocketIO

以下是一个简单的 Flask 后端示例代码:

from flask import Flask
from flask_socketio import SocketIO, emitapp = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
socketio = SocketIO(app)@app.route('/')
def index():return "Hello, World!"@socketio.on('message')
def handle_message(msg):print('Received message: ' + msg)emit('response', 'Echo: ' + msg, broadcast=True)if __name__ == '__main__':socketio.run(app, debug=True)
2. Android 客户端集成 Socket.IO

在 Android Studio 中,你需要添加 Socket.IO 的依赖。在 build.gradle 文件中添加以下内容:

dependencies {implementation 'io.socket:socket.io-client:1.4.0'
}

确保你的应用有网络权限。在 AndroidManifest.xml 文件中添加以下内容:

<uses-permission android:name="android.permission.INTERNET" />

以下是一个简单的 Android 客户端示例:

import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;public class MainActivity extends AppCompatActivity {private Socket socket;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);try {socket = IO.socket("http://yourserver.com/socket.io");socket.connect();socket.on("response", new Emitter.Listener() {@Overridepublic void call(Object... args) {runOnUiThread(new Runnable() {@Overridepublic void run() {TextView messagesView = findViewById(R.id.messagesView);messagesView.append((String) args[0] + "\n");}});}});Button sendButton = findViewById(R.id.sendButton);sendButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {EditText messageInput = findViewById(R.id.messageInput);String message = messageInput.getText().toString();if (!message.isEmpty()) {socket.emit("message", message);messageInput.setText("");}}});} catch (Exception e) {e.printStackTrace();}}@Overrideprotected void onDestroy() {super.onDestroy();socket.disconnect();}
}
3. 布局文件

res/layout/activity_main.xml 中定义一个简单的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="16dp"><EditTextandroid:id="@+id/messageInput"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="Type a message" /><Buttonandroid:id="@+id/sendButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Send" /><TextViewandroid:id="@+id/messagesView"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Messages will appear here"android:textSize="16sp" /></LinearLayout>

socket.onsocket.emit

特性socket.onsocket.emit
功能监听来自服务器的事件向服务器发送事件
方向从服务器到客户端从客户端到服务器
回调注册回调函数以处理接收到的事件可选地注册回调函数以接收服务器的响应
使用场景接收服务器推送的消息,如通知、广播等发送请求到服务器,如提交数据、请求信息等
注意事项
  1. 服务器地址:确保在 Android 客户端中使用的服务器地址与 Flask 后端的地址一致。
  2. 网络权限:确保在 AndroidManifest.xml 中添加了网络权限。
  3. 线程安全:在回调函数中更新 UI 时,确保使用 runOnUiThread

二、接受服务器消息的二种方法

  • emit
    • 后端:使用 emit 发送事件和数据。
    • 客户端:通过 socket.on 监听事件并接收数据。
  • return
    • 后端:在事件处理函数中使用 return 发送响应。
    • 客户端:通过 emit 方法的回调函数接收响应。
1. 客户端接收通过 emit 发送的消息

当后端使用 emit 发送消息时,客户端可以通过 socket.on 监听对应的事件来接收消息。

功能
  • 显式发送事件emit 可以发送自定义事件,并携带数据。
  • 广播或单播:可以指定发送给所有客户端,或者特定的客户端。
使用场景
  • 广播消息:向所有连接的客户端发送消息。
  • 单播消息:向特定的客户端发送消息。
  • 复杂交互:需要发送多个事件或不同类型的数据时。
后端代码(Flask-SocketIO)
from flask import Flask
from flask_socketio import SocketIO, emitapp = Flask(__name__)
socketio = SocketIO(app)@socketio.on('client_message')
def handle_client_message(data):print("Received message:", data)emit('server_message', 'Hello from Server!')  # 使用 emit 发送消息if __name__ == '__main__':socketio.run(app, host='0.0.0.0', port=5000)
客户端代码(Android Studio,Java)
import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;public class MainActivity extends AppCompatActivity {private Socket mSocket;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);try {mSocket = IO.socket("http://your-server-address:5000");mSocket.connect();// 监听服务器通过 emit 发送的消息mSocket.on("server_message", new Emitter.Listener() {@Overridepublic void call(Object... args) {String message = (String) args[0];runOnUiThread(() -> {Toast.makeText(MainActivity.this, "Received via emit: " + message, Toast.LENGTH_SHORT).show();});}});} catch (Exception e) {e.printStackTrace();}}@Overrideprotected void onDestroy() {super.onDestroy();mSocket.disconnect();mSocket.off("server_message");}
}
2. 客户端接收通过 return 发送的响应

当后端使用 return 发送响应时,客户端可以通过 emit 方法的回调函数接收响应。

功能
  • 返回响应:直接返回一个值或字符串。
  • 简单交互:适用于简单的场景,客户端不需要复杂的消息交互。
使用场景
  • 简单响应:客户端只需要一个简单的响应,例如确认消息已接收。
  • 快速反馈:快速返回一个结果,不需要额外的事件处理。
后端代码(Flask-SocketIO)
from flask import Flask
from flask_socketio import SocketIOapp = Flask(__name__)
socketio = SocketIO(app)@socketio.on('client_message')
def handle_client_message(data):print("Received message:", data)return 'Server received your message!'  # 使用 return 发送响应if __name__ == '__main__':socketio.run(app, host='0.0.0.0', port=5000)
客户端代码(Android Studio,Java)
import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;public class MainActivity extends AppCompatActivity {private Socket mSocket;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);try {mSocket = IO.socket("http://your-server-address:5000");mSocket.connect();// 发送消息并接收通过 return 发送的响应mSocket.emit("client_message", "Hello from Android!", new Emitter.Ack() {@Overridepublic void call(Object... args) {if (args.length > 0) {String response = (String) args[0];runOnUiThread(() -> {Toast.makeText(MainActivity.this, "Received via return: " + response, Toast.LENGTH_SHORT).show();});}}});} catch (Exception e) {e.printStackTrace();}}@Overrideprotected void onDestroy() {super.onDestroy();mSocket.disconnect();}
}
4. 二者的区别
特性emitreturn
功能显式发送事件,携带数据直接返回响应
方向从服务器到客户端从服务器到客户端
使用场景广播或单播消息,复杂交互简单响应,快速反馈
示例emit('server_message', 'Hello from Server!')return 'Server received your message!'
  • 如果你需要向客户端发送复杂的事件或广播消息,使用 emit
  • 如果客户端只需要一个简单的响应,使用 return

拓展:room与namespace

在 Flask-SocketIO 中,命名空间(Namespace)和房间(Rooms)是两个非常重要的功能,它们可以更好地组织和管理实时通信。

命名空间(Namespace)

命名空间允许在同一个 Socket.IO 服务器上创建多个独立的通信通道。每个命名空间都可以有自己的事件和逻辑,互不干扰。这在大型应用中非常有用,可以将不同的功能模块分开,例如聊天功能和通知功能。

功能示例
from flask_socketio import emit@socketio.on('message', namespace='/chat')
def handle_chat_message(msg):emit('message', msg, broadcast=True, namespace='/chat')@socketio.on('notification', namespace='/notifications')
def handle_notification(msg):emit('notification', msg, broadcast=True, namespace='/notifications')

在上面的代码中,/chat/notifications 是两个不同的命名空间,分别用于处理聊天消息和通知。

房间(Rooms)

房间是命名空间的进一步细分,允许将用户分组,以便向特定的用户组发送消息。这在聊天室、多人游戏等场景中非常有用。

功能示例
from flask_socketio import join_room, leave_room@socketio.on('join')
def on_join(data):username = data['username']room = data['room']join_room(room)send(username + ' has entered the room.', to=room)@socketio.on('leave')
def on_leave(data):username = data['username']room = data['room']leave_room(room)send(username + ' has left the room.', to=room)

在上面的代码中,join_roomleave_room 函数用于管理用户加入和离开房间。send 函数的 to 参数用于指定消息发送到的房间。

总结
  • 命名空间:用于创建独立的通信通道,适合将不同的功能模块分开。
  • 房间:用于将用户分组,适合向特定用户组发送消息。

通过合理使用命名空间和房间,可以构建更加模块化和高效的实时通信应用。

拓展:

room功能实现用户之间消息的发送

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/901994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Prompt 技术【提示词】打造自己的大语言智能体

机器如何按照人类的指令执行任务的探索 机器需具备理解任务叙述的能力&#xff0c;以便能够按照人类的指令执行任务&#xff0c;为机器提供一些范例作为参考&#xff0c;使其能够理解该执行的任务类型。这样的学习方式称为“Instruction learning”&#xff0c;透过精心设计的…

Node.js 数据库 事务 项目示例

1、参考&#xff1a;JavaScript语言的事务管理_js 函数 事务性-CSDN博客 或者百度搜索&#xff1a;Nodejs控制事务&#xff0c; 2、实践 2.1、对于MySQL或MariaDB&#xff0c;你可以使用mysql或mysql2库&#xff0c;并结合Promise或async/await语法来控制事务。 使用 mysql2…

【Mamba】MambaVision论文阅读

文章目录 MambaVision一、研究背景&#xff08;一&#xff09;Transformer vs Mamba​&#xff08;二&#xff09;Mamba in CV​ 二、相关工作​&#xff08;一&#xff09;Transformer 在计算机视觉领域的进展​&#xff08;二&#xff09;Mamba 在计算机视觉领域的探索​ 三、…

前端面试宝典---原型链

引言----感谢大佬的讲解 大佬链接 原型链示意图 原型链问题中需要记住一句话&#xff1a;一切变量和函数都可以并且只能通过__proto__去找它所在原型链上的属性与方法 原型链需要注意的点 看上图可以发现 函数&#xff08;构造函数&#xff09;也可以通过__proto__去找到原…

C语言---FILE结构体

一、FILE 结构体的本质与定义 基本概念 FILE 是 C 语言标准库中用于封装文件操作的结构体类型&#xff0c;定义于 <stdio.h> 中。它代表一个“文件流”&#xff0c;可以是磁盘文件、标准输入输出&#xff08;stdin/stdout/stderr&#xff09;或其他输入输出设备。 实现特…

基于大模型的直肠息肉诊疗全流程风险预测与方案优化研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型技术概述 2.1 大模型原理简介 2.2 大模型在医疗领域应用现状 三、直肠息肉术前预测与准备 3.1 基于大模型的术前风险预测 3.1.1 息肉性质预测 3.1.2 手术难度预测 3.2 基于预测结果的术前准备 3.…

华为OD机试真题——MELON的难题(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析&#xff1b; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式&#xff01; 2025华为OD真题目录全流程解析/备考攻略/经验分享 华为OD机试真题《MELON的…

AI数据分析与BI可视化结合:解锁企业决策新境界

大家好&#xff0c;今天我们来聊聊一个前沿而热门的话题——AI数据分析与BI可视化结合&#xff0c;如何携手推动企业决策迈向新高度。在数据爆炸的时代&#xff0c;企业如何高效利用这些数据&#xff0c;成为制胜的关键。AI数据分析与BI可视化的结合&#xff0c;正是解锁这一潜…

克服储能领域的数据处理瓶颈及AI拓展

对于储能研究人员来说&#xff0c;日常工作中经常围绕着一项核心但有时令人沮丧的任务&#xff1a;处理实验数据。从电池循环仪的嗡嗡声到包含电压和电流读数的大量电子表格&#xff0c;研究人员的大量时间都花在了提取有意义的见解上。长期以来&#xff0c;该领域一直受到对专…

【SpringBoot+Vue自学笔记】002 SpringBoot快速上手

跟着这位老师学习的&#xff1a;https://www.bilibili.com/video/BV1nV4y1s7ZN?vd_sourceaf46ae3e8740f44ad87ced5536fc1a45 最好和老师的idea版本完全一致&#xff01;截至本文写的当日最新的idea好像默认jdk17&#xff0c;配置时遇到很多bug。 &#x1f33f; Spring Boot&a…

SpringAI+DeepSeek大模型应用开发——2 大模型应用开发架构

目录 2.大模型开发 2.1 模型部署 2.1.1 云服务-开放大模型API 2.1.2 本地部署 搜索模型 运行大模型 2.2 调用大模型 接口说明 提示词角色 ​编辑 会话记忆问题 2.3 大模型应用开发架构 2.3.1 技术架构 纯Prompt模式 FunctionCalling RAG检索增强 Fine-tuning …

蓝桥杯12. 日期问题

日期问题 原题目链接 题目描述 小明正在整理一批历史文献。这些历史文献中出现了很多日期。 小明知道这些日期都在 1960 年 1 月 1 日 至 2059 年 12 月 31 日 之间。 令小明头疼的是&#xff0c;这些日期采用的格式非常不统一&#xff1a; 有的采用 年/月/日有的采用 月…

STM32使用rand()生成随机数并显示波形

一、随机数生成 1、加入头文件&#xff1a;#include "stdlib.h" 2、定义一个用作生成随机数种子的变量并加入到滴答定时器中不断自增&#xff1a;uint32_t run_times 0; 3、设置种子&#xff1a;srand(run_times);//每次生成随机数前调用一次为佳 4、生成一个随…

『前端样式分享』联系我们卡片式布局 自适应屏幕 hover动效 在wikijs中使用 (代码拿来即用)

目录 预览效果分析要点响应式网格布局卡片样式&#xff1a;阴影和过渡效果 代码优化希望 长短不一的邮箱地址在左右居中的同时,做到左侧文字对齐(wikijs可用)总结 欢迎关注 『前端布局样式』 专栏&#xff0c;持续更新中 欢迎关注 『前端布局样式』 专栏&#xff0c;持续更新中…

【ubuntu】在Linux Yocto的基础上去适配Ubuntu的wifi模块

一、修改wifi的节点名 1.找到wifi模块的PID和VID ifconfig查看wifi模块网络节点的名字&#xff0c;发现是wlx44876393bb3a&#xff08;wlxmac地址&#xff09; 通过udevadm info -a /sys/class/net/wlx44876393bba路径的命令去查看wlx44876393bba的总线号&#xff0c;端口号…

健康养生:开启活力生活新篇章

在当代社会&#xff0c;熬夜加班、久坐不动、外卖快餐成为许多人的生活常态&#xff0c;随之而来的是各种亚健康问题。想要摆脱身体的疲惫与不适&#xff0c;健康养生迫在眉睫&#xff0c;它是重获活力、拥抱美好生活的关键。​ 应对不良饮食习惯带来的健康隐患&#xff0c;饮…

【verilog】多个 if 控制同一个变量(后面会覆盖前面)非阻塞赋值真的并行吗?

非阻塞赋值 (<) 是“并行”的&#xff0c;但是代码顺序会影响结果&#xff1f;”这正是 Verilog 的硬件描述本质 vs 行为语义之间的微妙之处。 &#x1f4a1;1. 非阻塞赋值真的并行吗&#xff1f; 是的&#xff01;非阻塞赋值 < 从行为上是并行的&#xff0c;也就是说&a…

前沿篇|CAN XL 与 TSN 深度解读

引言 1. CAN XL 标准演进与设计目标 2. CAN XL 物理层与帧格式详解 3. 时间敏感网络 (TSN) 关键技术解析 4. CAN XL + TSN 在自动驾驶领域的典型应用

vscode、cherry studio接入高德mcp服务

最近mcp协议比较火&#xff0c;好多平台都已经开通了mcp协议&#xff0c;今天来接入下高德的mcp看看效果如何。 话不多说&#xff0c;咱们直接开干。 先来看下支持mcp协议的工具有cusor、cline等等。更新cherrystudio后发现上面也有mcp服务器了。今天咱就来试试添加高德的mcp协…

Triton(2)——Triton源码接结构

1 triton 3.0.0 源码结构 triton docs/&#xff1a;项目文档 cmake/&#xff1a;构建配置相关 bin/&#xff1a;工具、脚本 CmakeLists.txt&#xff1a;cmake 配置文件 LSCENSE README.md Pyproject.toml&#xff1a;python 项目配置文件 utils/&#xff1a;项目配置文…