1,准备材料:jl1.0.1.jar 音乐播放包和准备下载一些mp3的材料,然后放到eclispe 里边
■ 下载连接:https://sourceforge.net/projects/javalayer/
(下载后,解压出来,咱只需要用到一个jl1.0.1.jar 文件)把这个jl1.0.1.jar的文件复制到java的编译器,例如Eclispe中,右键-》Build Path-》Add to Build Path (准备工作结束,接下来,咱就可以用这个包的东西啦,这个包,其实也没啥东西,就一个播放的Player类,以及播放方法play(),然后关闭close()方法哈哈哈)
2,开始书写项目,先分析一下咱的思路:
❀ class MusicStore :音乐仓库,使用了static 静态代码块的添加
❀ class PlayMusicTask :播放音乐的线程任务,里边就使用到咱的音乐包中的Player对象和play() 方法。
❀ class MusicServers:音乐服务器,服务多个客户端,选择死循环(为了简单),而非多线程
❀ class SocketHandle :处理客户端的线程任务
❀ class ServerTest:服务端测试类
❀ class ClientServer:客户端服务
3,全部代码:
❀ class MusicStore :音乐仓库,使用了static 静态代码块的添加
package SoundServers;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;
/**
* 音乐仓库
* @author Huangyujun
*
*/
public class MusicStore {
public static Map<String, File> musicMap = new HashMap<String, File>();
static {
musicMap.put("AreYouOK", new File("music/AreYouOK.mp3"));
musicMap.put("nanpengyou", new File("music/nanpengyou.mp3"));
musicMap.put("tianqi", new File("music/tianqi.mp3"));
musicMap.put("xiaciyiding", new File("music/xiaciyiding.mp3"));
}
}
❀ class PlayMusicTask :播放音乐的线程任务,里边就使用到咱的音乐包中的Player对象和play() 方法。
package SoundServers;
/**
* 播放音乐的任务
* @author Huangyujun
*
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;
public class PlayMusicTask implements Runnable{
private String choiceMusic;
public PlayMusicTask(String choiceMusic) {
this.choiceMusic = choiceMusic;
}
@Override
public void run() {
File file = MusicStore.musicMap.get(choiceMusic);
InputStream inStream = null;
try {
inStream = new FileInputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Player player = null;
try {
player = new Player(inStream);
player.play();
} catch (JavaLayerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
❀ class MusicServers:音乐服务器,服务多个客户端,选择死循环(为了简单),而非多线程
package SoundServers;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 音乐服务端,服务多个客户端,选择死循环(为了简单),而非多线程
* @author Huangyujun
*
*/
public class MusicServers {
//端口
private int port;
//服务端
private ServerSocket serverSocket;
//服务端状态
private boolean isRunnable;
public MusicServers(int port) {
this.port = port;
isRunnable = true;
}
//服务端要工作啦
public void start() throws IOException {
//连接服务端(相当于咱的电话机器有了自己的电话号码啦)
serverSocket = new ServerSocket(port);
while(isRunnable) {
//循环不断的等待其他电话打来(等待客户端)
System.out.println("服务端已经开始工作啦,监听端口:" + port);
Socket socket = serverSocket.accept();
System.out.println("服务端已经连接客户端:" + socket.getRemoteSocketAddress());
//多个客户端,面对客户端的要求,咱封装成一个类
//(线程任务,因为咱客户要求可能不间断)来处理客户端的要求
new Thread(new SocketHandle(socket)).start();
}
}
}
❀ class SocketHandle :处理客户端的线程任务
package SoundServers;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
/**
* 处理客户端的线程任务
* @author Huangyujun
*
*/
public class SocketHandle implements Runnable{
private Socket socket;
private ObjectInputStream oinStream;
private ObjectOutputStream ooStream;
public SocketHandle(Socket socket) throws IOException {
this.socket = socket;
oinStream = new ObjectInputStream(socket.getInputStream());
ooStream = new ObjectOutputStream(socket.getOutputStream());
}
@Override
public void run() {
//先判断客户端的请求是什么
Object requestContent = null;
try {
while((requestContent = oinStream.readObject()) != null) {
//请求是否在咱的处理能力范围内
if(MusicStore.musicMap.containsKey(requestContent.toString())) {
//调用音乐播放任务,播放音乐的决定权在用户手里,咱把这个音乐文件给客户就好
//如何给用户呢?----流,传输数据
new Thread(new PlayMusicTask(requestContent.toString())).start();
// ooStream.writeObject(MusicStore.musicMap.get(requestContent.toString()));
}else if("bye".equals(requestContent.toString())) {
System.out.println("小嘟嘟也要去睡觉了,晚安");
}else {
System.out.println("对不起,小嘟嘟还是太小了,还不明白你的意思,请换个简单的请求");
}
//推流
ooStream.flush();
}
} catch (ClassNotFoundException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//关闭流
try {
oinStream.close();
ooStream.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
❀ class ServerTest:服务端测试类
package SoundServers;
import java.io.IOException;
import AIMusic.ServerMusic;
/**
* 服务端测试类
* @author Huangyujun
*
*/
public class ServerTest {
public static void main(String[] args) throws IOException {
ServerMusic serverMusic = new ServerMusic(9527);
serverMusic.start();
}
}
❀ class ClientServer:客户端服务
package SoundServers;
import java.io.File;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/**
* 客户端服务
*
* @author Huangyujun
*
*/
public class ClientServer {
// main方法单线程客户端就够了,客户就只要求听歌吧
public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException {
Socket socket = new Socket("localhost", 9527); // 连接好客户端
ObjectOutputStream ooStream = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream oinStream = new ObjectInputStream(socket.getInputStream());
System.out.println("想听什么歌曲呢?今天");
Scanner scanner = new Scanner(System.in);
String loveSong = null;
// 客户端想听的歌曲
while (true) {
loveSong = scanner.next();
ooStream.writeObject(loveSong); // 把客户端请求传递给服务端
//推流!!!!!!!!!!
ooStream.flush();
// 看看服务端反应,服务端是否把音乐文件资源传递过来
Object obj = oinStream.readObject();
if (obj instanceof File) {
// 播放音乐啦
new Thread(new PlayMusicTask(loveSong)).start(); // 线程刹不住车,死循环啦
// 这里改写的是客户端,决定同意要播放音乐就可以啦,播放音乐还是在服务端那边
// System.out.println("还想听其他什么歌曲吗?");
}
System.out.println("还想听其他什么歌曲吗?");
}
// 最后关闭流
// ooStream.close();
// oinStream.close();
// socket.close();
}
}