+ 主持人 [cinwell website](follow_screen_leader.html ':include :type=iframe width=100% height=400px') + 被带人 [cinwell website](follow_screen_customer.html ':include :type=iframe width=100% height=400px') + 主持人端示例代码 ```javascript function createSocket(config) { var socket = io('https://epx-ws.4dkankan.com/', { // 注意:此地址仅供测试,切勿在生产中使用 path: '/ws-sync', transports: ['websocket'], }) return socket } var kankan = null var isJoined = false var socket = createSocket() socket.on('connect', () => { socket.emit('join', { userId: Date.now().toString(), roomId: 'test-room', role: 'customer', }) }) socket.on('join', data => { isJoined = true }) socket.on('action', data => { if (data.type == 'error') { } else if (data.type == 'user-init') { kankan.Connect.follow.sync() } }) socket.on('sync', data => { kankan.Connect.follow.receive(data) }) var kankan = new KanKan({ dom: '#scene', num: 'KJ-JYo2ZZyKKJ', }) kankan.Scene.on('loaded', () => { kankan.Connect.follow.start() }) kankan.Connect.follow.on('data', data => { if (isJoined) { socket.emit('sync', data) } }) kankan.render() ``` + 被带人示例代码 ```javascript function createSocket(config) { var socket = io('https://epx-ws.4dkankan.com/', { path: '/ws-sync', transports: ['websocket'], }) return socket } var kankan = null var isJoined = false var socket = createSocket() socket.on('connect', () => { socket.emit('join', { userId: Date.now().toString(), roomId: 'test-room', role: 'customer', }) }) socket.on('join', data => { isJoined = true }) socket.on('action', data => { if (data.type == 'error') { } }) socket.on('sync', data => { kankan.Connect.follow.receive(data) }) var kankan = new KanKan({ dom: '#scene', num: 'KJ-JYo2ZZyKKJ', }) kankan.Scene.on('loaded', () => { kankan.Connect.follow.start({ follow: true }) socket.emit('action', { type: 'user-init' }) }) kankan.Connect.follow.on('data', data => { if (isJoined) { socket.emit('sync', data) } }) kankan.render() ```