pushclient+webrtc实现临时p2p点对点音视频通话文字聊天大文件发送接收代码

代码语言:html

所属分类:其他

代码描述:pushclient+webrtc实现临时p2p点对点音视频通话文字聊天大文件发送接收代码,打开页面会显示一个分享二维码与链接,对方扫码或打开链接后就能建立基于webrtc的p2p链接,可以音频通话、视频通话、文件发送、文字聊天,针对临时的2人p2p的通讯需求,无服务器,点对点通讯。

代码标签: pushclient webrtc 临时 p2p 点对点 视频 通话 文字 聊天 文件 发送

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width,initial-scale=1.0"/>
  <title>P2P 通信套件 (文件·聊天·音视频) </title>
<link type="text/css" rel="stylesheet" href="//repo.bfw.wiki/bfwrepo/css/all.6.7.0.css">
  <script src="https://repo.bfw.wiki/bfwrepo/js/qrcode.js"></script>
  <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/pushclient.js"></script>
  <style>
    :root{--primary:#007bff;--secondary:#28a745;--danger:#dc3545;--bg:#f8f9fa;--surface:#fff;--border:#dee2e6;--text:#212529;--muted:#6c757d;}
    
    html, body{margin:0;padding:0;height:100%;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;background-color:#e9ecef;overflow:hidden;}

    /* --- App Container --- */
    .app-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:1rem;}
    .app-window{width:100%;height:100%;max-width:800px;max-height:90vh;background:var(--surface);border-radius:16px;box-shadow:0 12px 28px rgba(0,0,0,.1), 0 2px 4px rgba(0,0,0,.05);display:flex;flex-direction:column;overflow:hidden;position:relative;}

    /* --- Initial Connection View --- */
    #initial-connection-view{margin:auto;}
    .connection-panel{text-align:center;padding:2rem;max-width:340px;}
    .connection-panel h2{margin:0 0 1rem;color:var(--text);font-size:1.5rem;font-weight:600;}
    .connection-panel p{margin:6px 0 1rem;color:var(--muted);font-size:14px;}
    #qrcode{margin:1rem auto;padding:1rem;background:#fff;border-radius:12px;box-shadow:0 4px 16px rgba(0,0,0,.06);width:fit-content;display:flex;align-items:center;justify-content:center;}
    .link-box{display:flex;margin:1rem 0;border:1px solid var(--border);border-radius:8px;overflow:hidden;}
    #share-link{flex:1;border:none;padding:10px 12px;font-size:14px;outline:none;color:var(--text);background:#f8f9fa;}
    #copy-link-btn{background:var(--primary);color:#fff;border:none;padding:0 1.25rem;cursor:pointer;font-weight:500;display:inline-flex;align-items:center;gap:8px;}
    #copy-link-btn:hover{background:#0069d9;}

    /* --- Main Chat View --- */
    #main-chat-view{display:none;flex-direction:column;width:100%;height:100%;}
    
    /* Header */
    .chat-header{padding:0.75rem 1.25rem;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:10px;flex-shrink:0;}
    .chat-header h3{margin:0;font-size:1.1rem;font-weight:600;}
    .status-indicator{width:10px;height:10px;border-radius:50%;background-color:var(--secondary);}
    
    /* Log Area */
    .chat-log-container{flex:1;overflow-y:auto;padding:1rem;background:var(--bg);}
    .chat-log{display:flex;flex-direction:column;gap:12px;}
    .bubble{max-width:75%;padding:10px 16px;border-radius:18px;line-height:1.5;word-wrap:break-word;font-size:15px;}
    .bubble.me{align-self:flex-end;background:var(--primary);color:#fff;border-bottom-right-radius:4px;}
    .bubble.peer{align-self:flex-start;background:#e9ecef;color:#222;border:1px solid #e3e3e3;border-bottom-left-radius:4px;}
    .bubble.system{align-self:center;background:#ced4da;color:var(--surface);font-size:12px;padding:4px 12px;border-radius:12px;}
    .bubble.media{padding:6px; background:transparent; border:1px solid var(--border);}
    .bubble.media.me{background:transparent; border-color:var(--primary);}
    .bubble img, .bubble video{max-width:250px; border-radius:12px; display:block;}
    .bubble img{cursor:pointer;}
    .bubble audio{width:250px;}

    /* Input Area */
    .chat-input-area{flex-shrink:0;display:flex;align-items:center;padding:0.75rem 1rem;border-top:1px solid var(--border);gap:0.5rem;background:var(--surface);}
    #chat-input{flex:1;border:none;background:var(--bg);border-radius:20px;padding:10px 16px;font-size:15px;outline:none;}
    #chat-input:focus{box-shadow:0 0 0 2px rgba(0,123,255,.25);}
    .chat-actions .btn{background:transparent;color:var(--muted);font-size:1.2rem;padding:8px;border-radius:50%;border:none;width:40px;height:40px;line-height:1;cursor:pointer;transition:background-color .2s, color .2s;}
    .chat-actions .btn:hover{background:var(--bg);color:var(--primary);}
    .chat-actions .btn:disabled{color:var(--border);cursor:not-allowed;background:transparent;}
    #send-chat-btn{background:var(--primary);color:#fff;}
    #send-chat-btn:hover{background:#0069d9;}
    #send-chat-btn:disabled{background:var(--muted);color:#fff;}
    #file-input{display:none;}

    /* --- Drag & Drop Overlay --- */
    #drop-zone-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,123,255,.1);z-index:99;display:none;align-items:center;justify-content:center;border:2px dashed var(--primary);box-sizing:border-box;border-radius:16px;pointer-events:none;}
    #drop-zone-overlay p{font-size:1.5rem;font-weight:600;color:var(--primary);background:rgba(255,255,255,.8);padding:1rem 2rem;border-radius:12px;}

    /* --- Call Indicator (PiP style) --- */
    #call-indicator{position:fixed;top:2rem;right:2rem;background:rgba(0,0,0,0.7);border:1px solid rgba(255,255,255,.2);border-radius:12px;box-shadow:0 8px 24px rgba(0,0,0,.2);z-index:1000;display:none;width:280px;overflow:hidden;animation:slideIn .3s ease-out;}
    @keyframes slideIn { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } }
    #pip-video-container{display:none;position:relative;background:#111;}
    #remote-video-pip{width:100%;height:auto;display:block;}
    #local-video-pip{position:a.........完整代码请登录后点击上方下载按钮下载查看

网友评论0