videocalling
聊天(Chat)

聊天(Chat)

功能

基于文本的消息功能,允许参与者在视频通话期间发送消息

什么是聊天?

视频会议中的聊天是一种基于文本的消息功能,允许参与者在会议期间相互发送书面消息。聊天在音频和视频之外提供了一个并行的通信渠道,使参与者能够共享链接、提问、提供反馈或进行旁边对话而不打断主要讨论。

现代聊天实现提供公开消息(所有人可见)、私人消息(向特定参与者发送直接消息)、文件共享、表情符号反应和格式选项,使聊天成为虚拟会议中口头交流的重要补充。

聊天消息类型

公开聊天(发给所有人)

所有会议参与者可见的消息:

  • 用例:共享链接、资源、所有人都能看到的问题
  • 可见性:所有参与者都可以看到和回应
  • 持久性:消息在整个会议期间保持可见
  • 归档:通常与会议转录/录制一起保存
// 发送公开聊天消息
const publicMessage = {
  id: generateId(),
  type: 'public',
  senderId: currentUserId,
  senderName: 'John Doe',
  content: '这是链接:https://example.com/document',
  timestamp: Date.now(),
  edited: false
};

broadcastToMeeting(meetingId, {
  type: 'chat-message',
  message: publicMessage
});

私人消息(直接消息)

两个参与者之间的一对一消息:

  • 用例:边栏对话、私人问题、技术协助
  • 可见性:只有发送者和接收者可以看到
  • 隐私:主持人可能能够或不能看到私人聊天(取决于平台)
  • 谨慎性:允许在不干扰整个会议的情况下进行对话
// 发送私人消息
const privateMessage = {
  id: generateId(),
  type: 'private',
  senderId: currentUserId,
  recipientId: targetUserId,
  content: '会议后可以分享那个资源吗?',
  timestamp: Date.now()
};

// 仅发送给接收者
sendToParticipant(targetUserId, {
  type: 'chat-message',
  message: privateMessage
});

仅主持人消息

仅发送给主持人/调节者的消息:

  • 用例:技术问题、问题、帮助请求
  • 可见性:只有主持人和联合主持人接收
  • 支持:允许参与者在不干扰会议的情况下获得帮助

聊天功能和能力

富文本格式

现代聊天支持各种格式选项:

  • 粗体/斜体/删除线:**粗体**、*斜体*、~~删除线~~
  • 代码块:用于代码片段的等宽文本
  • 链接:自动检测并链接化 URL
  • 提及:@用户名通知特定参与者
  • 表情符号:😊 👍 🎉 用于快速反应

文件共享

通过聊天界面共享文件:

  • 文档共享:PDF、Word 文档、电子表格
  • 图像:截图、图表、照片
  • 大小限制:通常为 10-200 MB,取决于平台
  • 安全扫描:自动病毒/恶意软件扫描
  • 过期:文件可能在会议结束后或特定时间段后过期
// 通过聊天发送文件
async function sendFile(file) {
  // 将文件上传到服务器
  const uploadedFile = await uploadFile(file);
  
  const fileMessage = {
    id: generateId(),
    type: 'public',
    senderId: currentUserId,
    contentType: 'file',
    file: {
      name: file.name,
      size: file.size,
      type: file.type,
      url: uploadedFile.url
    },
    timestamp: Date.now()
  };
  
  broadcastToMeeting(meetingId, {
    type: 'chat-message',
    message: fileMessage
  });
}

反应和表情符号

  • 快速反应:一键表情符号响应
  • 消息反应:对特定消息做出反应(如 Slack)
  • 表情符号选择器:浏览并从表情符号库中选择
  • 肤色:支持多样化的表情符号变体

消息管理

  • 编辑消息:修改已发送的消息(带有"已编辑"指示器)
  • 删除消息:删除消息(可能留下"已删除"占位符)
  • 回复线程:回复特定消息创建线程
  • 搜索:在聊天历史记录中搜索关键字
  • 固定消息:在聊天顶部突出显示重要消息

主持人控制

调节能力

主持人可以管理聊天活动:

  • 禁用聊天:完全关闭聊天
  • 限制接收者:仅允许向主持人或所有人发送消息
  • 删除消息:删除不当或垃圾消息
  • 静音参与者:阻止特定用户聊天
  • 保存聊天:导出聊天记录以供存档
// 主持人控制:将聊天限制为仅主持人
function restrictChatToHost(meetingId) {
  const meeting = meetings.get(meetingId);
  
  meeting.settings.chatPolicy = 'host-only';
  
  // 通知所有参与者
  broadcastToMeeting(meetingId, {
    type: 'chat-policy-changed',
    policy: 'host-only',
    message: '聊天现已受限。您只能向主持人发送消息。'
  });
}

聊天政策

常见的聊天权限配置:

  • 所有人都可以聊天:所有参与者都可以向任何人发送消息
  • 仅公开:禁用私人消息,允许公开聊天
  • 仅主持人:参与者只能向主持人/联合主持人发送消息
  • 无聊天:完全禁用聊天
  • 无私人聊天:允许公开,禁用直接消息

使用 WebSocket 实现

实时聊天基础设施

// 服务器端:处理聊天消息
socket.on('send-chat-message', ({ meetingId, message }) => {
  const participant = getParticipant(socket.userId, meetingId);
  
  // 验证权限
  if (!canSendChat(participant, message.type)) {
    return socket.emit('error', { message: '聊天权限被拒绝' });
  }
  
  // 添加服务器元数据
  message.id = generateId();
  message.timestamp = Date.now();
  message.senderName = participant.name;
  
  // 存储消息
  saveChatMessage(meetingId, message);
  
  // 根据消息类型广播
  if (message.type === 'public') {
    // 发送给所有参与者
    broadcastToMeeting(meetingId, {
      type: 'chat-message',
      message: message
    });
  } else if (message.type === 'private') {
    // 仅发送给接收者
    sendToParticipant(message.recipientId, {
      type: 'chat-message',
      message: message
    });
    // 回显给发送者
    socket.emit('chat-message', { message });
  }
});

客户端聊天界面

// 客户端:发送聊天消息
function sendChatMessage(content, type = 'public', recipientId = null) {
  const message = {
    type: type,
    content: content,
    recipientId: recipientId
  };
  
  socket.emit('send-chat-message', {
    meetingId: currentMeetingId,
    message: message
  });
}

// 接收和显示消息
socket.on('chat-message', ({ message }) => {
  displayChatMessage(message);
  
  // 如果聊天面板关闭,显示通知
  if (!isChatPanelVisible()) {
    showChatNotification(message);
    incrementUnreadCount();
  }
  
  // 播放通知声音
  if (message.senderId !== currentUserId) {
    playNotificationSound();
  }
});

常见用例

  • 问答环节:参与者通过聊天提交问题,主持人/调节者口头回答
  • 链接共享:在不打断演讲者的情况下共享资源、文档或参考资料
  • 多语言支持:在聊天中提供翻译或解释
  • 技术支持:IT 人员在会议期间通过私人聊天提供帮助
  • 反馈收集:收集快速反馈或投票响应
  • 无障碍:为听力受损的参与者补充音频
  • 会议记录:在聊天中协作记笔记
  • 参与:增加较安静的与会者的参与度

最佳实践

对于参与者

  1. 保持主题:保持聊天与会议讨论相关
  2. 使用 @提及:向特定人员提出问题
  3. 避免垃圾信息:不要用过多的消息淹没聊天
  4. 检查受众:验证您正在发送给正确的接收者(公开 vs 私人)
  5. 专业语气:保持与口头交流相同的专业性

对于主持人

  1. 监控聊天:在演示期间指派联合主持人观察聊天
  2. 确认消息:定期回答聊天中的问题
  3. 设定期望:在会议开始时解释聊天政策
  4. 保存记录:导出聊天以跟进问题/行动项目
  5. 积极调节:快速处理不当消息

会议礼仪

  • 自我介绍:如果第一次聊天,请以姓名开始
  • 在演示期间谨慎使用:避免分散演讲者的注意力
  • 校对:发送前检查拼写错误,特别是在专业环境中
  • 尊重隐私:不要截屏或分享私人消息

高级功能(2025)

AI 驱动的能力

  • 自动翻译:聊天消息的实时翻译
  • 智能建议:基于上下文的建议响应
  • 情感分析:检测困惑、问题或负面情绪
  • 自动摘要:AI 生成聊天讨论的摘要
  • 主题检测:自动按主题分类和分组消息

集成功能

  • 斜杠命令:/poll、/remind、/schedule 用于快速操作
  • 机器人集成:用于信息、支持或自动化的聊天机器人
  • 外部应用链接:深度链接到 Jira、Trello、Google Docs
  • GIF 支持:动画 GIF 反应和响应

安全和隐私

加密

  • 传输中加密:用于消息传输的 TLS/SSL
  • 端到端加密:一些平台为聊天提供 E2EE(不太常见)
  • 静态加密:聊天存档的加密存储

数据保留

  • 仅会议期间:会议结束时删除聊天
  • 短期保留:会议后 24-48 小时可用
  • 长期存档:为合规目的无限期保存
  • 用户导出:参与者可以保存自己的副本

合规

  • GDPR:删除权、数据可移植性
  • eDiscovery:法律保留和搜索能力
  • 审核日志:跟踪谁在何时发送了什么
  • DLP 集成:扫描敏感数据(SSN、信用卡)

无障碍

  • 屏幕阅读器支持:向视觉受损用户宣布新消息
  • 键盘快捷键:Ctrl+K 聚焦聊天,箭头键导航
  • 高对比度:支持高对比度主题
  • 字体缩放:尊重系统字体大小设置
  • 音频替代:对聋人/听力受损的参与者至关重要

平台示例

  • Zoom:公开/私人聊天,文件共享,保存记录,限制聊天权限
  • Microsoft Teams:线程对话,富格式,GIF,@提及,与 Teams 聊天深度集成
  • Google Meet:简单的聊天界面,聊天保存到会议组织者的 Drive
  • Slack Huddles:与 Slack 频道集成,会议之外的持久聊天
  • Discord:带有持久文本聊天的语音频道,丰富的嵌入支持

性能考虑

  • 消息限流:限制每个用户每分钟的消息数以防止垃圾信息
  • 历史限制:仅加载最近的 N 条消息,延迟加载较旧的历史记录
  • 文件大小限制:防止大文件上传减慢体验
  • 输入指示器:显示谁正在输入(使用防抖以减少流量)