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();
    }
}

 

参考自:《老九学堂~线上训练营~网络编程~开发聊天程序》

 

posted @ 2021-05-25 10:48  一乐乐  阅读(174)  评论(0编辑  收藏  举报