有办法不通过额外的服务端,在两个浏览器间建立连接进行通信吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lynan
V2EX    浏览器

有办法不通过额外的服务端,在两个浏览器间建立连接进行通信吗

  •  
  •   lynan 2022-10-25 10:28:57 +08:00 5407 次点击
    这是一个创建于 1093 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题~
    第 1 条附言    2022-10-25 14:47:39 +08:00
    是内网~
    31 条回复    2022-10-25 18:48:15 +08:00
    registerrr
        1
    registerrr  
       2022-10-25 10:32:50 +08:00
    webrtc
    SethShi
        2
    SethShi  
       2022-10-25 10:35:17 +08:00
    @registerrr 你这个也需要服务端返回 JS 去执行吧
    我猜楼主是说完全不需要服务端的. 我能想到的估计也就 c2c 内网有可能
    thinkershare
        3
    thinkershare  
       2022-10-25 10:36:11 +08:00
    没有办法
    wangtian2020
        4
    wangtian2020  
       2022-10-25 10:42:35 +08:00
    webrtc
    看哔哩哔哩直播的时候,如果用户的浏览器支持 webrtc ,哔哩哔哩会控制在用户之间 P2P 节约大量视频带宽
    通信传送视频信息,和传送文本数据是一样的
    ysc3839
        5
    ysc3839  
       2022-10-25 10:45:45 +08:00
    WebRTC 的 P2P 模式好像也要服务器转发一些数据才能建立连接的。
    kuro1
        6
    kuro1  
       2022-10-25 10:48:45 +08:00
    mDNS
    duke807
        7
    duke807  
       2022-10-25 10:49:44 +08:00
    serverless-webrtc
    NessajCN
        8
    NessajCN  
       2022-10-25 10:53:09 +08:00
    @seth19960929 理论上是可以的,你本地写 html+js 脚本,手动生成一个 sdp 作为 offer 。再去另一个浏览器那里把 offer 的 sdp 复制粘贴过来写死在 js 代码里生成 answer 。再把 answer 的 sdp 复制粘贴到 offer 那里,就能连上了。不需要服务端..
    diegozhu
        9
    diegozhu  
       2022-10-25 11:14:42 +08:00
    @NessajCN 你这自己相当于是一个服务器端。
    nVic
        10
    nVic  
       2022-10-25 11:23:07 +08:00
    网络环境?内网?大内网?公网?互联网?中间有没有单独的 dns 服务器?
    yufeng0681
        11
    yufeng0681  
       2022-10-25 11:38:15 +08:00
    访问同一个网址, 然后在网址上的文本框里 聊天
    比如:
    1 、在 在线 excel 的表格里面聊天
    2 、在 在线 word 文档里聊天
    3 、可以在博客留言区聊天(不实时,可能会被其他人看到)
    SunsetShimmer
        12
    SunsetShimmer  
       2022-10-25 11:45:40 +08:00
    SunsetShimmer
        13
    SunsetShimmer  
       2022-10-25 11:48:25 +08:00
    个人认为,除非两端都在公网且知道对方的 IP ,否则总会有一个中转(利用公开服务)。
    ClericPy
        14
    ClericPy  
       2022-10-25 12:16:11 +08:00 via Android
    火狐当年貌似有个类似的东西... 你通信干嘛
    hoshan185
        15
    hoshan185  
       2022-10-25 12:22:06 +08:00
    那这样两端里面起码要有一个可以在公网上访问的吧
    jeesk
        16
    jeesk  
       2022-10-25 12:37:06 +08:00
    不行, 首先浏览器必须走网络协议, 那么这个网路协议怎么来, 需要网络吧, 那么就需要第三方服务器(路由器也是)? 如果是 app 之间可以尝试 wifi direct 或者蓝牙 p2p .
    ArthurSS
        17
    ArthurSS  
       2022-10-25 13:59:56 +08:00
    @NessajCN 你这 sdp 还是要走信令服务器的
    NessajCN
        18
    NessajCN  
       2022-10-25 14:11:45 +08:00
    @ArthurSS 我这都手动复制粘贴了哪里还需要 signaling ,我自己就是 signaling 呀
    cy1027
        19
    cy1027  
       2022-10-25 14:15:00 +08:00
    单从通信的原理上来讲,你纯内网的可以广播建立链接,只要你是内网到外网,没有第三方怎么建立链接呢?
    jones2000
        20
    jones2000  
       2022-10-25 14:39:14 +08:00
    做插件点对点值连, 局域网可以用命名管道或 udp 广播。
    meeop
        21
    meeop  
       2022-10-25 14:55:31 +08:00
    有的,我最近正在写这方面的库
    首先要抽象一下,是不是浏览器不重要,这个问题是如何实现两个客户端之间直连

    分场景:
    1 内网环境或者有公网 ip 或者可直连 ipv6,两个客户端直接拿对方 ip 端口连接就行
    2nat 网络类型支持内网穿透(通常都支持),需要一个中介服务器协调 nat 穿透,客户端之间连接成功后就是直连,不需要中介服务器了.这个中介服务器如果是 stun 协议的话,可以自荐,网上也有免费的
    3 最差的情况无法穿透 nat 直连,就需要代理,有很多种协议,这种一定需要一个服务器做转发
    4 相对成熟解决方案就是 webrtc,这个原理就是上述 123 的整合,需要自建服务器端
    5 通解还是需要有公网 ip(v4 或者 v6)
    ArthurSS
        22
    ArthurSS  
       2022-10-25 14:56:36 +08:00
    @NessajCN 可是你不知道对方 ip ,如何连?你的 sdp 本质上也是要通过 TURN 服务去中转吧,类似#13 所说
    ArthurSS
        23
    ArthurSS  
       2022-10-25 14:57:57 +08:00
    @NessajCN 参考#21 说的也行,现在网上公开的库,都是内置了一个
    julyclyde
        24
    julyclyde  
       2022-10-25 15:23:48 +08:00
    mDNS 可以相互发现

    我不懂怎么在浏览器里“监听”
    xiqishow
        25
    xiqishow  
       2022-10-25 15:26:24 +08:00
    xiqishow
        26
    xiqishow  
       2022-10-25 15:27:16 +08:00
    @xiqishow #25 可以在局域网里 互相传文件 也是 mdns 的实现吧
    NessajCN
        27
    NessajCN  
       2022-10-25 15:36:24 +08:00
    @ArthurSS turn 是另外一码事了,跟 signaling 没关系。sdp 里面包含了 ip ,只是这个 ip 如果无法从公网访问那自然是连不通的需要走 turn 。不过楼主都说了内网了那就不存在需要 turn 中转啊,两边 sdp 都是内网 ip ,本来就能互相连通。
    flyqie
        28
    flyqie  
       2022-10-25 18:32:37 +08:00 via Android
    这得看你是不是要求完全不用服务端(人肉也算)。

    完全不用的话,如果你不能通过各种奇怪的方式(浏览器插件什么的)开一个可被内网访问的固定服务端口,那无解。

    不完全的话,可以搞个服务(不管是不是人肉)做个 signal server ,然后走 webrtc 。
    killva4624
        29
    killva4624  
       2022-10-25 18:40:14 +08:00
    理论上是可以的。
    对端发现:靠手动填 IP ,或者广播自己的地址给特定端口(我记得以前有个叫 FeiQ )的。
    kwh
        30
    kwh  
       2022-10-25 18:42:07 +08:00
    可以吧???我就通过 ipv6 地址从互联网访问到了我电脑本地。
    yueji
        31
    yueji  
       2022-10-25 18:48:15 +08:00
    php websocket 开端口 + 扫同网段 相同端口
    谁先扫到就 connect
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5402 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 08:29 PVG 16:29 LAX 01:29 JFK 04:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86