V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
yishanxin
V2EX  ›  程序员

Spotify 局域网同步技术(探索一)

  •  1
     
  •   yishanxin · 2017-06-20 10:21:05 +08:00 · 3545 次点击
    这是一个创建于 2739 天前的主题,其中的信息可能已经有所发展或是发生改变。

    剁手 Spotify 会员有一段时间了, 对终端同步(当前播放音乐 /播放进度 /控制)比较有兴趣!总结如下

    • TCP/IP
    • UDP 广播

    这次感触最多的就是针对一个通用协议,做到物尽其用......顿时对 Spotify 有了好感!

    多台设备登陆如图

    Screen Shot 2017-06-09 at 1.12.29 PM.png

    查看电脑所有端口情况 找到 Spotify (发现局域网设备对应连接)

    Screen Shot 2017-06-09 at 2.11.59 PM.png

    开启防火墙,验证是否通过 UDP broadcast

    Screen Shot 2017-06-15 at 2.42.52 PM.png

    模拟 UDP 广播效果

    局域网 IP 159 发 UDP 广播,当前电脑 IP 151,收到流量包数据,并回复一个数据包!

    Screen Shot 2017-06-15 at 10.26.26 AM.png
    Screen Shot 2017-06-15 at 10.26.35 AM.png

    Sample(部分代码参考 Github 示例)

    udpserver.go

    package main
    
    import (
    	"fmt"
    	"net"
    )
    
    func main() {
    	listener, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.IPv4zero, Port: 9001})
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	fmt.Printf("Local: <%s> \n", listener.LocalAddr().String())
    	data := make([]byte, 1024)
    	for {
    		n, remoteAddr, err := listener.ReadFromUDP(data)
    		if err != nil {
    			fmt.Printf("error during read: %s", err)
    		}
    		fmt.Printf("<%s> %s\n", remoteAddr, data[:n])
    		_, err = listener.WriteToUDP([]byte("world"), remoteAddr)
    		if err != nil {
    			fmt.Printf(err.Error())
    		}
    	}
    }
    
    

    udpclient.go

    package main
    
    import (
    	"fmt"
    	"net"
    	"os"
    )
    
    func main() {
    	ip := net.ParseIP("192.168.199.255")
    	srcAddr := &net.UDPAddr{IP: net.IPv4zero, Port: 0}
    	dstAddr := &net.UDPAddr{IP: ip, Port: 9001}
    	conn, err := net.ListenUDP("udp", srcAddr)
    	if err != nil {
    		fmt.Println(err)
    	}
    	n, err := conn.WriteToUDP([]byte("hello"), dstAddr)
    	if err != nil {
    		fmt.Println(err)
    	}
    	data := make([]byte, 1024)
    	n, _, err = conn.ReadFrom(data)
    	if err != nil {
    		fmt.Println(err)
    	}
    	fmt.Printf("read %s from <%s>\n", data[:n], conn.RemoteAddr())
    	b := make([]byte, 1)
    	os.Stdin.Read(b)
    }
    
    
    7 条回复    2017-06-20 20:36:31 +08:00
    killsting
        1
    killsting  
       2017-06-20 10:23:44 +08:00
    Spotify 确实做得很好在同步方面。
    TimePPT
        2
    TimePPT  
       2017-06-20 10:35:56 +08:00 via iPhone
    Spotify 最让我爽的是不通过局域网一样能串流操作
    yishanxin
        3
    yishanxin  
    OP
       2017-06-20 10:41:15 +08:00
    @TimePPT 同,在线同步机制正在分析 ........😊😊😊
    TimePPT
        4
    TimePPT  
       2017-06-20 10:46:30 +08:00
    @yishanxin 加油,期待分享
    moguiyu
        5
    moguiyu  
       2017-06-20 10:48:22 +08:00 via iPhone
    好棒! spotify 这点很赞
    Wichna
        6
    Wichna  
       2017-06-20 18:03:50 +08:00
    musixmatch 同步 spotify 的播放进度也是这个原理么?
    yishanxin
        7
    yishanxin  
    OP
       2017-06-20 20:36:31 +08:00
    @Wichna For Mac ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3793 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:14 · PVG 12:14 · LAX 20:14 · JFK 23:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.