c语言sscanf函数的用法是什么
289
2022-11-18
Sockect 服务端与客户端(一对多)~音响小案例
Sockect 服务端与客户端(一对多)~音响小案例
1,准备材料:jl1.0.1.jar 音乐播放包和准备下载一些mp3的材料,然后放到eclispe 里边
下载连接:文件)把这个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 musicMap = new HashMap(); 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(); }}
参考自:《老九学堂~线上训练营~网络编程~开发聊天程序》
作者:一乐乐
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~