1 系统功能说明

1.1系统简介
歌词在线同步系统,主要实现的是播放歌曲,然后能够通过UDP通信,从服务端加载歌词,并根据歌曲播放进度同步显示歌词。
1.2系统主要功能
实现播放子系统,其功能如下:
1.播放终端能够播放歌曲,并根据歌曲的信息从后台下载歌词
2. 歌词显示应当与歌曲播放同步
1.3系统开发环境
编译器:Spring tool suite
运行环境:JDK1.8导入整个项目,先运行server.java,再运行client.java即可启动项目

2 系统设计

2.1系统总体设计
本系统采用的是CS结构,系统的功能结构如下:
(1)服务端:采用UDP协议,接收客户端传来的数据,进行处理,比如查询歌词信息,查询到歌词信息以后返回给客户端,如果查询不到结果,则返回相应的提示信息。
(2)客户端:和用户交互,接收用户的操作输入,并将数据发送给服务端处理,获取返回结果展示在界面上,比如用户点击歌曲播放,客户端获取歌曲信息,发送给服务端,并且接收服务端返回的歌词,同步显示在界面上。
2.2界面设计
客户端歌曲查询界面:


歌词同步界面:

加载图片失败:

歌词加载失败:

2.3 网络通信

(1)网络通信采用的是UDP通信模型,因为客户端需要向服务端请求歌曲的专辑图片,歌 词,以及歌曲的歌手,专辑等信息,所以在请求消息中需要设置标志字段,用于区分服 务。
(2)客户端发送的数据格式、服务端接收的数据格式:
songName#requestContent#currentTime
各个字段的含义:
songName:歌曲名字
requestContent:请求内容(包括歌曲基本信息songInfo、专辑图片songImage、歌词内容 lrc)
currentTime:歌曲播放的进度时间
(3)图片是采用字节流的方式传输的,从服务端读取图片,然后通过DatagramPacket 发送 给客户端,客户端把接收到的字节流转换成图片文件,存到临时图片文件中,同时显示 到歌词展示界面。

2.4 数据存储
服务端和客户端发送的消息都是采用字节流的方式,它们的格式和存储方式如下:
(1)服务端和客户端的资源存储目录如下:
music/client-music 目录下存放的是客户端的歌曲,歌词,界面背景图片资源等
music/server-music 目录下存放的是服务端的歌词,专辑图片资源等

(2)服务端存储的是歌词文件,歌曲专辑图片文件;
其中歌词文件采用.lrc文件,其基本格式如样例如下:

而专辑图片则采用.png的格式存储。

(3)客户端存储的是歌曲文件信息,格式为.mp3,还有就是背景图片,按钮图片,临时图片资源等
其在项目中的存储格式样例如下:

2.5 多线程
(1)在服务端使用了多线程处理,服务端分为两个类,一个是Server类,一个是服务端线 程类UDPThread类。
Server类:
用于接受客户端发送来的packet数据包,然后把数据包交给子线程处理,使用了两 个DatagramSocket,一个接受数据,一个发送数据。
UDPThread 类:
根据客户端发送的数据包,判断请求数据的类型,比如歌词,图片资源等,然后查 找对应的资源,转换成字节流发送给客户端。

2.6同步与并发
同步:客户端实现了同步,当读取服务端歌词的线程接收到服务端发来的歌词文件的时候,需要先写入本地歌词文件中,而此时,本地歌词读取线程可能也会同时读取该歌词文件,所以需要歌词文件的写入需要加上同步锁。
并发:服务端采用了多线程,所以支持多个客户端同时开启,从服务端获取歌词,实现了并发。

3 系统错误与调试

3.1 常见异常及处理方法
(1)异常:客户端扫描本地文件夹的歌曲文件,如果文件夹名不存在,产生空指针异常
处理方法:判断文件对象是否为空,处理代码如下:

//如果文件夹不存在,则打印语句,并返回空
if (!file.exists()) {System.out.println("该文件夹为空!");return null;
}

(2)异常:服务端查询的歌词文件或者图片文件不存在,会产生空指针异常
处理方法:
服务端判断读的文件是否为空,如果为空,则发送无该歌词文件或者图片的消息给客户 端(处理代码如下):

File tempFile =new File(storeLrcPath+"/albumImage/"+strArray[0]+".png");
if(!tempFile.exists()) {//歌曲专辑图片不存在sendData = "albumImage not exist".getBytes();
}else {InputStream in = new FileInputStream(tempFile);byte[] buff = new byte[65507];int c = in.read(buff);sendData = buff;in.close;
}

3.2 系统实现过程中遇到的错误及其解决方法
(1)遇到的问题:在读取mp3歌曲文件里歌曲信息的时候,采用jaudiotagger jar包读取,但是读取到的中文都是乱码,采用了UTF-8,GBK转码都仍然是乱码。
解决办法:自己写代码读取MP3歌曲信息,在mp3文件的最后128个字节包含了歌曲的基本信息,读取后转换成GBK格式,成功解决了乱码问题。

(2)遇到的问题:在歌词同步的时候,最后一句歌词不能同步
解决办法:歌词获取的判断方法是根据歌曲时间在两句歌词之间来判断的,因为在判断最后一句歌词的时候,后面没有歌词信息了,所以无法同步最后一句歌词,解决办法是加上一个判断语句,判断当前是否是最后一行歌词,如果是,则直接返回最后一句歌词。

基于UDP的歌词同步系统相关推荐

  1. java聊天程序步骤解析_java网络之基于UDP的聊天程序示例解析

    基于UDP的Socket通信 UDP协议不是一种基于稳定连接的协议,是一种面向数据报包的通信协议,不需要通信双方建立稳定的连接,也没有所谓服务端和客户的概念,数据报包在传输的时候不保证一定及时到达,也 ...

  2. Linux网络编程:基于UDP的程序开发回顾篇

    基于无连接的UDP程序设计 同样,在开发基于UDP的应用程序时,其主要流程如下: 对于面向无连接的UDP应用程序在开发过程中服务端和客户端的操作流程基本差不多.对比面向连接的TCP程序,服务端少了li ...

  3. 基于TCP的应用层协议、与基于UDP的应用层协议分别有哪些?

    参考:https://zhidao.baidu.com/question/337954440.html 基于TCP的有FTP.Telnet.SMTP.HTTP.POP3与DNS 基于UDP的有TFTP ...

  4. 网络编程(socket)套接字之基于udp的套接字

    基于udp的网络编程 特点:不需要提前建立链接,每次收发都需要获取ip和端口 又称数据报协议,一次发送对应一次接收,不会产生粘包问题    不可靠传输,发送数据不需要回复ACK确认信息    没有链接 ...

  5. socketserver模块用法,多道技术、 基于UDP的简易版QQ

    复习 1.OSI七层2.以太网协议3.ip协议(arp协议)4.TCP5.UDP OSI七层 应表会 # 应用层 (HTTP协议, FTP协议)传输层 # 端口协议 在此层发挥作用网络层 # IP协议 ...

  6. 基于UDP的socket客户服务器编程

    前面我们写了关于TCP的客户/服务器模式,现在我们写关于UDP的客户/服务器模式. 基于TCP编写的应用程序和基于TCP编写的应用程序之间存在一些本质的差异,其原因在于这两个传输层之间的差别:UDP是 ...

  7. kcp 协议分析 基于udp的可靠协议

    项目地址:https://github.com/skywind3000/kcp 此项目是基于c语言的 其他语言实现自行搜索 简介 KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价 ...

  8. 基于UDP协议的socket套接字编程 基于socketserver实现并发的socket编程

    基于UDP协议 的socket套接字编程 1.UDP套接字简单示例 1.1服务端 import socketserver = socket.socket(socket.AF_INET,socket.S ...

  9. android udp定时发送,Android Socket基于UDP协议通信

    首先我们要知道UDP通信协议是Socket通信的一种实现方式,Socket通信一般有两种通信方式:基于TCP协议.基于UDP协议.这两者的差别和优缺点就不说了,这里主要讲一下基于UDP协议的实现. 基 ...

最新文章

  1. 阿里某程序员爆料:面试一个重庆小伙子,却被对方微信调戏!
  2. linux windows c system 函数简介
  3. iwconfig的用法
  4. 高等数学:第七章 空间解析几何(1)空间解析几何与向量代数 向量的加减法、数乘、坐标
  5. 多库操作:多个数据库的动态切换(一)
  6. mac vs 返回上一步_mac电脑打不开应用程序的解决方法
  7. android活动开始,android – 点击谷歌地图标记infoWindow开始活动
  8. Linux IPC实践(10) --Posix共享内存
  9. 视觉SLAM笔记(18) Sophus
  10. 安卓+JAVA实例开发源码
  11. Vuejs中字符串判空处理--如何判断字符串是否为空或不为空
  12. java漫画pdf_Java并发编程学习宝典(漫画版)(PDF+HTML完结)
  13. MapGIS出现“存储服务错误,可能未启动”问题解决方案
  14. 我在云栖社区读硕士,大数据专业
  15. python3 chm文档下载_python3.7.0官方参考文档 最新api文档 chm_Python教程_源雷技术空间...
  16. 服务更新发布方式------“金丝雀、滚动更新、蓝绿部署”
  17. 威廉.布莱克 和 他的诗歌
  18. 多位点序列分型_bionumerics应用16-全基因多位点序列分型(wgMLST)
  19. python: format
  20. 深入理解JUC的8锁现象

热门文章

  1. 欢迎光临我的公众号和我的博客
  2. dependencies 和 devDependencies 区别
  3. Bridge 模式(转)
  4. python矩阵定义_python矩阵定义
  5. 离散数学 ---- 命题逻辑 --- 什么是命题和命题联结词
  6. 升压芯片很简单(一),快速选择升压芯片+利用升压芯片设计LED电源
  7. 【渝粤教育】电大中专建筑材料_1作业 题库
  8. 计算机网络路由器的配置连接不上,路由器设置好了电脑连接不上怎么办
  9. 行列式,线性变换,变换,雅克比行列式,二次型
  10. 计算机二级web题库软件百度云,计算机等级考试题库,二级Web试题请你拿走拿走,别客气!...