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.pswp.cn/news/901994.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901994.shtml
英文地址,請注明出處:http://en.pswp.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;項目配置文…