文章目錄
- 1. Flask-SocketIO 后端代碼
- 后端代碼
- 2. Android Studio Java 客戶端代碼
- 客戶端代碼
- 3. 代碼說明
SocketIO基礎
1. Flask-SocketIO 后端代碼
后端代碼
from flask import Flask, request
from flask_socketio import SocketIO, emit
import uuidapp = Flask(__name__)
socketio = SocketIO(app)# 存儲客戶端的 session ID 和用戶名的映射
clients = {}@socketio.on('join')
def on_join():username = request.args.get('username')room = username clients[username] = usernamejoin_room(room)@socketio.on('leave')
def on_leave():username = request.args.get('username')room = username leave_room(room)removed_value = clients.pop(username)@socketio.on('client_message')
def handle_client_message(data):target_username = data.get('target')message = data.get('message')if target_username in clients:emit('server_message', message , to=target_username )else:# 如果沒有指定目標用戶,則廣播消息emit('server_message', "targetUsernameOffline")#返回發送失敗消息:目標用戶離線if __name__ == '__main__':socketio.run(app, host='0.0.0.0', port=5000)
2. 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();mSocket.emit("join", new JSONObject().put("username", "1331554545") // 每個用戶擁有自己的房間// 發送消息給特定用戶mSocket.emit("client_message", new JSONObject().put("target", "1331554646") // 目標用戶的用戶名.put("message", "Hello Bob!")); // 消息內容// 監聽服務器消息mSocket.on("server_message", new Emitter.Listener() {@Overridepublic void call(Object... args) {String message = (String) args[0];runOnUiThread(() -> {Toast.makeText(MainActivity.this, "Received: " + message, Toast.LENGTH_SHORT).show();});}});} catch (Exception e) {e.printStackTrace();}}@Overrideprotected void onDestroy() {super.onDestroy();mSocket.emit("leave", new JSONObject().put("username", "1331554545") // 關閉對話刪除房間mSocket.disconnect();mSocket.off("server_message");}
}
3. 代碼說明
-
后端代碼:
- 在
on_join
中,每個連接以自己username創建房間,表示上線。 - 在
handle_client_message
中,根據通過target_username向指定房間發送消息,完成向指定客戶端發送消息 - 在
on_leave
中,從MainActivity離開,刪除房間,表示離線。
- 在
-
客戶端代碼:
- 客戶端通過
socket.on
監聽服務器發送的server_message
事件。 - 客戶端通過
socket.emit
向服務器發送消息,進而向指定客戶端發送消息。
- 客戶端通過