前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >体育赛事直播系统开发:实现用户群聊和发红包功能的关键部分代码

体育赛事直播系统开发:实现用户群聊和发红包功能的关键部分代码

原创
作者头像
用户10027718
发布2025-04-09 14:22:37
发布2025-04-09 14:22:37
740
举报

基于“东莞梦幻网络科技”体育赛事直播系统中的聊一聊功能模块的群聊和发红包关键代码实现方案,所用技术栈(后端:PHP-ThinkPHP、安卓-Java、iOS-OC、PC/H5-Vue.js)。

数据库表设计(MySQL)

代码语言:sql
复制
-- 群组表

CREATE TABLE `groups` (

  `id` int(11) NOT NULL AUTO\_INCREMENT,

  `name` varchar(100) NOT NULL,

  `creator\_id` int(11) NOT NULL,

  `avatar` varchar(255) DEFAULT NULL,

  `created\_at` datetime NOT NULL,

  `updated\_at` datetime NOT NULL,

  PRIMARY KEY (`id`)

);



-- 群成员表

CREATE TABLE `group\_members` (

  `id` int(11) NOT NULL AUTO\_INCREMENT,

  `group\_id` int(11) NOT NULL,

  `user\_id` int(11) NOT NULL,

  `role` tinyint(1) DEFAULT '0' COMMENT '0-普通成员 1-管理员 2-群主',

  `joined\_at` datetime NOT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `group\_user` (`group\_id`,`user\_id`)

);



-- 消息表

CREATE TABLE `messages` (

  `id` int(11) NOT NULL AUTO\_INCREMENT,

  `group\_id` int(11) NOT NULL,

  `sender\_id` int(11) NOT NULL,

  `content` text NOT NULL,

  `type` tinyint(1) DEFAULT '0' COMMENT '0-文本 1-图片 2-红包 3-系统通知',

  `created\_at` datetime NOT NULL,

  PRIMARY KEY (`id`),

  KEY `group\_id` (`group\_id`)

);



-- 红包表

CREATE TABLE `red\_packets` (

  `id` int(11) NOT NULL AUTO\_INCREMENT,

  `group\_id` int(11) NOT NULL,

  `sender\_id` int(11) NOT NULL,

  `amount` decimal(10,2) NOT NULL,

  `count` int(11) NOT NULL,

  `remain\_amount` decimal(10,2) NOT NULL,

  `remain\_count` int(11) NOT NULL,

  `message` varchar(255) DEFAULT NULL,

  `created\_at` datetime NOT NULL,

  `expire\_at` datetime NOT NULL,

  `status` tinyint(1) DEFAULT '0' COMMENT '0-未领完 1-已领完 2-已过期',

  PRIMARY KEY (`id`)

);



-- 红包领取记录

CREATE TABLE `red\_packet\_records` (

  `id` int(11) NOT NULL AUTO\_INCREMENT,

  `red\_packet\_id` int(11) NOT NULL,

  `receiver\_id` int(11) NOT NULL,

  `amount` decimal(10,2) NOT NULL,

  `received\_at` datetime NOT NULL,

  PRIMARY KEY (`id`),

  KEY `red\_packet\_id` (`red\_packet\_id`)

);

后端实现 (ThinkPHP)

**群聊API控制器**

代码语言:php
复制
<?php

namespace app\api\controller;



use think\Controller;

use think\Request;



class Group extends Controller

{

    // 创建群组

    public function create()

    {

        $user\_id = Request::instance()->param('user\_id');

        $name = Request::instance()->param('name');

        

        $group\_id = Db::name('groups')->insertGetId([

            'name' => $name,

            'creator\_id' => $user\_id,

            'created\_at' => date('Y-m-d H:i:s'),

            'updated\_at' => date('Y-m-d H:i:s')

        ]);

        

        // 添加创建者为群主

        Db::name('group\_members')->insert([

            'group\_id' => $group\_id,

            'user\_id' => $user\_id,

            'role' => 2, // 群主

            'joined\_at' => date('Y-m-d H:i:s')

        ]);

        

        return json(['code' => 0, 'data' => ['group\_id' => $group\_id]]);

    }

    

    // 发送群消息

    public function sendMessage()

    {

        $group\_id = Request::instance()->param('group\_id');

        $user\_id = Request::instance()->param('user\_id');

        $content = Request::instance()->param('content');

        

        // 检查是否是群成员

        $is\_member = Db::name('group\_members')

            ->where('group\_id', $group\_id)

            ->where('user\_id', $user\_id)

            ->count();

            

        if(!$is\_member) {

            return json(['code' => 1, 'msg' => '您不是该群成员']);

        }

        

        // 保存消息到数据库

        $message\_id = Db::name('messages')->insertGetId([

            'group\_id' => $group\_id,

            'sender\_id' => $user\_id,

            'content' => $content,

            'type' => 0,

            'created\_at' => date('Y-m-d H:i:s')

        ]);

        

        // 通过WebSocket推送消息

        // 实际实现中应该调用WebSocket服务推送

        

        return json(['code' => 0, 'data' => ['message\_id' => $message\_id]]);

    }

    

    // 发送红包

    public function sendRedPacket()

    {

        $group\_id = Request::instance()->param('group\_id');

        $user\_id = Request::instance()->param('user\_id');

        $amount = Request::instance()->param('amount');

        $count = Request::instance()->param('count');

        $message = Request::instance()->param('message', '');

        

        // 检查余额等逻辑

        

        // 创建红包

        $red\_packet\_id = Db::name('red\_packets')->insertGetId([

            'group\_id' => $group\_id,

            'sender\_id' => $user\_id,

            'amount' => $amount,

            'count' => $count,

            'remain\_amount' => $amount,

            'remain\_count' => $count,

            'message' => $message,

            'created\_at' => date('Y-m-d H:i:s'),

            'expire\_at' => date('Y-m-d H:i:s', time() + 86400), // 24小时后过期

            'status' => 0

        ]);

        

        // 保存消息

        $message\_id = Db::name('messages')->insertGetId([

            'group\_id' => $group\_id,

            'sender\_id' => $user\_id,

            'content' => json\_encode(['red\_packet\_id' => $red\_packet\_id]),

            'type' => 2, // 红包消息

            'created\_at' => date('Y-m-d H:i:s')

        ]);

        

        return json(['code' => 0, 'data' => ['red\_packet\_id' => $red\_packet\_id]]);

    }

    

    // 领取红包

    public function receiveRedPacket()

    {

        $red\_packet\_id = Request::instance()->param('red\_packet\_id');

        $user\_id = Request::instance()->param('user\_id');

        

        // 检查红包状态

        $red\_packet = Db::name('red\_packets')->find($red\_packet\_id);

        if(!$red\_packet || $red\_packet['status'] != 0) {

            return json(['code' => 1, 'msg' => '红包已领取完或已过期']);

        }

        

        // 检查是否已领取

        $has\_received = Db::name('red\_packet\_records')

            ->where('red\_packet\_id', $red\_packet\_id)

            ->where('receiver\_id', $user\_id)

            ->count();

            

        if($has\_received) {

            return json(['code' => 2, 'msg' => '您已领取过该红包']);

        }

        

        // 计算领取金额

        $amount = $this->calculateRedPacketAmount($red\_packet);

        

        // 更新红包状态

        Db::name('red\_packets')

            ->where('id', $red\_packet\_id)

            ->update([

                'remain\_amount' => Db::raw('remain\_amount-' . $amount),

                'remain\_count' => Db::raw('remain\_count-1'),

                'status' => $red\_packet['remain\_count'] == 1 ? 1 : 0

            ]);

        

        // 添加领取记录

        Db::name('red\_packet\_records')->insert([

            'red\_packet\_id' => $red\_packet\_id,

            'receiver\_id' => $user\_id,

            'amount' => $amount,

            'received\_at' => date('Y-m-d H:i:s')

        ]);

        

        // 更新用户余额等逻辑

        

        return json(['code' => 0, 'data' => ['amount' => $amount]]);

    }

    

    private function calculateRedPacketAmount($red\_packet)

    {

        // 简单实现:平均分配

        if($red\_packet['remain\_count'] == 1) {

            return $red\_packet['remain\_amount'];

        }

        

        $avg = $red\_packet['remain\_amount'] / $red\_packet['remain\_count'];

        $min = 0.01;

        $max = $avg \* 2;

        $amount = mt\_rand($min \* 100, $max \* 100) / 100;

        $amount = min($amount, $red\_packet['remain\_amount'] - ($red\_packet['remain\_count'] - 1) \* 0.01);

        

        return round($amount, 2);

    }

}

前端实现 (Vue.js)

**群聊主界面组件**

代码语言:html
复制
<template>

  <div class="group-chat-container">

    <!-- 群聊头部 -->

    <div class="chat-header">

      <h2>{{ groupName }}</h2>

      <div class="header-actions">

        <button @click="showGroupInfo">群信息</button>

        <button @click="showRedPacketDialog">发红包</button>

      </div>

    </div>

    

    <!-- 消息列表 -->

    <div class="message-list" ref="messageList">

      <div v-for="(message, index) in messages" :key="index" 

           :class="['message-item', message.sender\_id === currentUserId ? 'self' : 'other']">

        <div v-if="message.type === 0" class="text-message">

          <div class="sender-name" v-if="message.sender\_id !== currentUserId">

            {{ getMemberName(message.sender\_id) }}

          </div>

          <div class="message-content">{{ message.content }}</div>

          <div class="message-time">{{ formatTime(message.created\_at) }}</div>

        </div>

        

        <div v-else-if="message.type === 2" class="red-packet-message">

          <div class="sender-name">{{ getMemberName(message.sender\_id) }}的红包</div>

          <div class="red-packet-content" @click="openRedPacket(message)">

            <div class="red-packet-icon">🧧</div>

            <div class="red-packet-message-text">{{ getRedPacketMessage(message) }}</div>

          </div>

          <div class="message-time">{{ formatTime(message.created\_at) }}</div>

        </div>

      </div>

    </div>

    

    <!-- 输入框 -->

    <div class="message-input">

      <input v-model="inputMessage" @keyup.enter="sendMessage" placeholder="输入消息...">

      <button @click="sendMessage">发送</button>

    </div>

    

    <!-- 红包对话框 -->

    <div v-if="showRedPacket" class="red-packet-dialog">

      <div class="red-packet-box">

        <h3>发红包</h3>

        <div class="red-packet-form">

          <div class="form-item">

            <label>金额</label>

            <input type="number" v-model="redPacketAmount" placeholder="输入金额">

          </div>

          <div class="form-item">

            <label>个数</label>

            <input type="number" v-model="redPacketCount" placeholder="输入红包个数">

          </div>

          <div class="form-item">

            <label>留言</label>

            <input v-model="redPacketMessage" placeholder="恭喜发财">

          </div>

          <div class="form-actions">

            <button @click="sendRedPacket">塞钱进红包</button>

            <button @click="showRedPacket = false">取消</button>

          </div>

        </div>

      </div>

    </div>

  </div>

</template>



<script>

export default {

  data() {

    return {

      groupId: null,

      groupName: '群聊名称',

      currentUserId: 1, // 当前用户ID

      messages: [],

      inputMessage: '',

      showRedPacket: false,

      redPacketAmount: '',

      redPacketCount: 1,

      redPacketMessage: '恭喜发财',

      members: [],

      ws: null

    }

  },

  

  mounted() {

    this.groupId = this.$route.params.groupId;

    this.loadGroupInfo();

    this.loadMessages();

    this.connectWebSocket();

  },

  

  methods: {

    async loadGroupInfo() {

      try {

        const response = await this.$http.get(`/api/group/info/${this.groupId}`);

        this.groupName = response.data.name;

        this.members = response.data.members;

      } catch (error) {

        console.error('获取群信息失败:', error);

      }

    },

    

    async loadMessages() {

      try {

        const response = await this.$http.get(`/api/group/messages/${this.groupId}`);

        this.messages = response.data;

        this.$nextTick(() => {

          this.scrollToBottom();

        });

      } catch (error) {

        console.error('获取消息失败:', error);

      }

    },

    

    connectWebSocket() {

      this.ws = new WebSocket(`ws://your-websocket-server:2346?user\_id=${this.currentUserId}`);

      

      this.ws.onmessage = (event) => {

        const message = JSON.parse(event.data);

        if(message.group\_id === this.groupId) {

          this.messages.push(message);

          this.$nextTick(() => {

            this.scrollToBottom();

          });

        }

      };

      

      this.ws.onclose = () => {

        console.log('WebSocket连接关闭');

      };

    },

    

    sendMessage() {

      if(!this.inputMessage.trim()) return;

      

      const message = {

        type: 'group\_message',

        group\_id: this.groupId,

        sender\_id: this.currentUserId,

        content: this.inputMessage

      };

      

      this.ws.send(JSON.stringify(message));

      

      // 添加到本地消息列表

      this.messages.push({

        group\_id: this.groupId,

        sender\_id: this.currentUserId,

        content: this.inputMessage,

        type: 0,

        created\_at: new Date().toISOString()

      });

      

      this.inputMessage = '';

      this.$nextTick(() => {

        this.scrollToBottom();

      });

    },

    

    scrollToBottom() {

      const container = this.$refs.messageList;

      container.scrollTop = container.scrollHeight;

    },

    

    showRedPacketDialog() {

      this.showRedPacket = true;

    },

    

    async sendRedPacket() {

      try {

        const response = await this.$http.post('/api/group/sendRedPacket', {

          group\_id: this.groupId,

          user\_id: this.currentUserId,

          amount: this.redPacketAmount,

          count: this.redPacketCount,

          message: this.redPacketMessage

        });

        

        // 添加到消息列表

        this.messages.push({

          group\_id: this.groupId,

          sender\_id: this.currentUserId,

          content: JSON.stringify({red\_packet\_id: response.data.red\_packet\_id}),

          type: 2,

          created\_at: new Date().toISOString()

        });

        

        this.showRedPacket = false;

        this.redPacketAmount = '';

        this.redPacketCount = 1;

        this.redPacketMessage = '恭喜发财';

        

        this.$nextTick(() => {

          this.scrollToBottom();

        });

      } catch (error) {

        console.error('发送红包失败:', error);

      }

    },

    

    async openRedPacket(message) {

      try {

        const content = JSON.parse(message.content);

        const response = await this.$http.post('/api/group/receiveRedPacket', {

          red\_packet\_id: content.red\_packet\_id,

          user\_id: this.currentUserId

        });

        

        alert(`恭喜您领取了${response.data.amount}元红包`);

      } catch (error) {

        console.error('领取红包失败:', error);

        alert(error.response?.data?.msg || '领取红包失败');

      }

    },

    

    getMemberName(userId) {

      const member = this.members.find(m => m.user\_id === userId);

      return member ? member.name : '未知用户';

    },

    

    getRedPacketMessage(message) {

      try {

        const content = JSON.parse(message.content);

        return content.message || '恭喜发财';

      } catch {

        return '恭喜发财';

      }

    },

    

    formatTime(time) {

      return new Date(time).toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'});

    },

    

    showGroupInfo() {

      // 显示群信息

    }

  },

  

  beforeDestroy() {

    if(this.ws) {

      this.ws.close();

    }

  }

}

</script>



<style scoped>

.group-chat-container {

  display: flex;

  flex-direction: column;

  height: 100vh;

}



.chat-header {

  padding: 10px;

  background: #f5f5f5;

  display: flex;

  justify-content: space-between;

  align-items: center;

}



.message-list {

  flex: 1;

  overflow-y: auto;

  padding: 10px;

}



.message-item {

  margin-bottom: 15px;

}



.message-item.self {

  text-align: right;

}



.message-item.other {

  text-align: left;

}



.sender-name {

  font-size: 12px;

  color: #666;

  margin-bottom: 5px;

}



.message-content {

  display: inline-block;

  padding: 8px 12px;

  background: #e6f7ff;

  border-radius: 4px;

  max-width: 70%;

  word-break: break-word;

}



.message-item.self .message-content {

  background: #69c0ff;

  color: white;

}



.message-time {

  font-size: 10px;

  color: #999;

  margin-top: 3px;

}



.message-input {

  padding: 10px;

  display: flex;

  border-top: 1px solid #eee;

}



.message-input input {

  flex: 1;

  padding: 8px;

  border: 1px solid #ddd;

  border-radius: 4px;

  margin-right: 10px;

}



.red-packet-message {

  cursor: pointer;

}



.red-packet-content {

  display: inline-flex;

  align-items: center;

  padding: 8px 12px;

  background: #ff4d4f;

  color: white;

  border-radius: 4px;

}



.red-packet-icon {

  font-size: 20px;

  margin-right: 8px;

}



.red-packet-dialog {

  position: fixed;

  top: 0;

  left: 0;

  right: 0;

  bottom: 0;

  background: rgba(0, 0, 0, 0.5);

  display: flex;

  justify-content: center;

  align-items: center;

  z-index: 1000;

}



.red-packet-box {

  background: white;

  padding: 20px;

  border-radius: 8px;

  width: 300px;

}



.red-packet-form .form-item {

  margin-bottom: 15px;

}



.red-packet-form label {

  display: block;

  margin-bottom: 5px;

  font-weight: bold;

}



.red-packet-form input {

  width: 100%;

  padding: 8px;

  border: 1px solid #ddd;

  border-radius: 4px;

}



.form-actions {

  display: flex;

  justify-content: space-between;

  margin-top: 20px;

}



.form-actions button {

  padding: 8px 15px;

  border: none;

  border-radius: 4px;

  cursor: pointer;

}



.form-actions button:first-child {

  background: #ff4d4f;

  color: white;

}



.form-actions button:last-child {

  background: #f5f5f5;

}

</style>

Android实现 (Java)

代码语言:java
复制
public class GroupChatActivity extends AppCompatActivity implements ChatWebSocketClient.ChatMessageListener {

    private static final String WS\_URL = "ws://your-websocket-server:2346";

    

    private RecyclerView messageRecyclerView;

    private EditText messageInput;

    private Button sendButton;

    private ChatWebSocketClient webSocketClient;

    private MessageAdapter messageAdapter;

    private List<ChatMessage> messages = new ArrayList<>();

    private int currentUserId = 1; // 当前用户ID

    private int groupId;

    

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity\_group\_chat);

        

        groupId = getIntent().getIntExtra("group\_id", 0);

        

        messageRecyclerView = findViewById(R.id.message\_recycler\_view);

        messageInput = findViewById(R.id.message\_input);

        sendButton = findViewById(R.id.send\_button);

        

        // 设置RecyclerView

        messageAdapter = new MessageAdapter(messages, currentUserId);

        messageRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        messageRecyclerView.setAdapter(messageAdapter);

        

        // 连接WebSocket

        try {

            webSocketClient = new ChatWebSocketClient(new URI(WS\_URL + "?user\_id=" + currentUserId), this);

            webSocketClient.connect();

        } catch (URISyntaxException e) {

            e.printStackTrace();

        }

        

        // 发送消息

        sendButton.setOnClickListener(v -> sendMessage());

        

        // 加载历史消息

        loadMessages();

    }

    

    private void sendMessage() {

        String content = messageInput.getText().toString().trim();

        if (content.isEmpty()) return;

        

        try {

            JSONObject message = new JSONObject();

            message.put("type", "group\_message");

            message.put("group\_id", groupId);

            message.put("sender\_id", currentUserId);

            message.put("content", content);

            

            if (webSocketClient != null && webSocketClient.isOpen()) {

                webSocketClient.send(message.toString());

                

                // 添加到本地列表

                ChatMessage chatMessage = new ChatMessage();

                chatMessage.setGroupId(groupId);

                chatMessage.setSenderId(currentUserId);

                chatMessage.setContent(content);

                chatMessage.setType(0); // 文本消息

                chatMessage.setTime(new SimpleDateFormat("HH:mm", Locale.getDefault()).format(new Date()));

                

                messages.add(chatMessage);

                messageAdapter.notifyItemInserted(messages.size() - 1);

                messageRecyclerView.scrollToPosition(messages.size() - 1);

                

                messageInput.setText("");

            }

        } catch (JSONException e) {

            e.printStackTrace();

        }

    }

    

    private void loadMessages() {

        // 从API加载历史消息

        // 实现网络请求获取消息列表

    }

    

    @Override

    public void onGroupMessageReceived(int groupId, int senderId, String content, String time) {

        if (this.groupId == groupId) {

            runOnUiThread(() -> {

                ChatMessage message = new ChatMessage();

                message.setGroupId(groupId);

                message.setSenderId(senderId);

                message.setContent(content);

                message.setType(0); // 文本消息

                message.setTime(time);

                

                messages.add(message);

                messageAdapter.notifyItemInserted(messages.size() - 1);

                messageRecyclerView.scrollToPosition(messages.size() - 1);

            });

        }

    }

    

    @Override

    public void onRedPacketReceived(int groupId, int senderId, int redPacketId, String message) {

        // 处理红包消息

    }

    

    @Override

    protected void onDestroy() {

        super.onDestroy();

        if (webSocketClient != null) {

            webSocketClient.close();

        }

    }

}



class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.MessageViewHolder> {

    private List<ChatMessage> messages;

    private int currentUserId;

    

    public MessageAdapter(List<ChatMessage> messages, int currentUserId) {

        this.messages = messages;

        this.currentUserId = currentUserId;

    }

    

    @Override

    public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext())

                .inflate(R.layout.item\_message, parent, false);

        return new MessageViewHolder(view);

    }

    

    @Override

    public void onBindViewHolder(MessageViewHolder holder, int position) {

        ChatMessage message = messages.get(position);

        

        if (message.getSenderId() == currentUserId) {

            // 自己的消息

            holder.messageLayout.setGravity(Gravity.END);

            holder.messageContent.setBackgroundResource(R.drawable.bg\_message\_self);

        } else {

            // 别人的消息

            holder.messageLayout.setGravity(Gravity.START);

            holder.messageContent.setBackgroundResource(R.drawable.bg\_message\_other);

            holder.senderName.setText("用户" + message.getSenderId());

            holder.senderName.setVisibility(View.VISIBLE);

        }

        

        holder.messageContent.setText(message.getContent());

        holder.messageTime.setText(message.getTime());

    }

    

    @Override

    public int getItemCount() {

        return messages.size();

    }

    

    class MessageViewHolder extends RecyclerView.ViewHolder {

        LinearLayout messageLayout;

        TextView senderName;

        TextView messageContent;

        TextView messageTime;

        

        public MessageViewHolder(View itemView) {

            super(itemView);

            messageLayout = itemView.findViewById(R.id.message\_layout);

            senderName = itemView.findViewById(R.id.sender\_name);

            messageContent = itemView.findViewById(R.id.message\_content);

            messageTime = itemView.findViewById(R.id.message\_time);

        }

    }

}

iOS实现 (Objective-C)

代码语言:objectivec
复制
#import "ChatWebSocketClient.h"

#import "SRWebSocket.h"



@interface ChatWebSocketClient () <SRWebSocketDelegate>

@property (nonatomic, strong) SRWebSocket \*webSocket;

@property (nonatomic, weak) id<ChatMessageDelegate> delegate;

@end



@implementation ChatWebSocketClient



- (instancetype)initWithURL:(NSURL \*)url delegate:(id<ChatMessageDelegate>)delegate {

    self = [super init];

    if (self) {

        \_delegate = delegate;

        \_webSocket = [[SRWebSocket alloc] initWithURL:url];

        \_webSocket.delegate = self;

        [\_webSocket open];

    }

    return self;

}



- (void)sendMessage:(NSDictionary \*)message {

    NSError \*error;

    NSData \*jsonData = [NSJSONSerialization dataWithJSONObject:message options:0 error:&error];

    if (!error) {

        NSString \*jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

        [\_webSocket send:jsonString];

    }

}



- (void)close {

    [\_webSocket close];

}



#pragma mark - SRWebSocketDelegate



- (void)webSocketDidOpen:(SRWebSocket \*)webSocket {

    NSLog(@"WebSocket连接已打开");

}



- (void)webSocket:(SRWebSocket \*)webSocket didReceiveMessage:(id)message {

    NSLog(@"收到消息: %@", message);

    

    if ([message isKindOfClass:[NSString class]]) {

        NSError \*error;

        NSDictionary \*json = [NSJSONSerialization JSONObjectWithData:[message dataUsingEncoding:NSUTF8StringEncoding] 

                                                           options:0 

                                                             error:&error];

        if (!error) {

            NSString \*type = json[@"type"];

            if ([type isEqualToString:@"group\_message"]) {

                NSInteger groupId = [json[@"group\_id"] integerValue];

                NSInteger senderId = [json[@"sender\_id"] integerValue];

                NSString \*content = json[@"content"];

                NSString \*time = json[@"time"];

                

                if ([self.delegate respondsToSelector:@selector(didReceiveGroupMessage:groupId:senderId:content:time:)]) {

                    [self.delegate didReceiveGroupMessage:self groupId:groupId senderId:senderId content:content time:time];

                }

            } else if ([type isEqualToString:@"red\_packet"]) {

                // 处理红包消息

            }

        }

    }

}



- (void)webSocket:(SRWebSocket \*)webSocket didFailWithError:(NSError \*)error {

    NSLog(@"WebSocket错误: %@", error);

}



- (void)webSocket:(SRWebSocket \*)webSocket didCloseWithCode:(NSInteger)code reason:(NSString \*)reason wasClean:(BOOL)wasClean {

    NSLog(@"WebSocket连接已关闭: %@", reason);

}



@end

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据库表设计(MySQL)
  • 后端实现 (ThinkPHP)
  • 前端实现 (Vue.js)
  • Android实现 (Java)
  • iOS实现 (Objective-C)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档