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

2017-06-20 10:21:05 +08:00
 yishanxin

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

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

多台设备登陆如图

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

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

模拟 UDP 广播效果

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

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)
}

3342 次点击
所在节点    程序员
7 条回复
killsting
2017-06-20 10:23:44 +08:00
Spotify 确实做得很好在同步方面。
TimePPT
2017-06-20 10:35:56 +08:00
Spotify 最让我爽的是不通过局域网一样能串流操作
yishanxin
2017-06-20 10:41:15 +08:00
@TimePPT 同,在线同步机制正在分析 ........😊😊😊
TimePPT
2017-06-20 10:46:30 +08:00
@yishanxin 加油,期待分享
moguiyu
2017-06-20 10:48:22 +08:00
好棒! spotify 这点很赞
Wichna
2017-06-20 18:03:50 +08:00
musixmatch 同步 spotify 的播放进度也是这个原理么?
yishanxin
2017-06-20 20:36:31 +08:00
@Wichna For Mac ?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/369731

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX