Sockect 服务端与客户端(一对多)~音响小案例
Sockect 服务端与客户端(一对多)~音响小案例
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(); } }
参考自:《老九学堂~线上训练营~网络编程~开发聊天程序》
本文来自博客园,作者:一乐乐,转载请注明原文链接:https://www.cnblogs.com/shan333/p/14807725.html