Sockect 服务端与客户端(一对多)~音响小案例

简介: Sockect 服务端与客户端(一对多)~音响小案例

Sockect 服务端与客户端(一对多)~音响小案例

1,准备材料:jl1.0.1.jar 音乐播放包和准备下载一些mp3的材料,然后放到eclispe 里边


(下载后,解压出来,咱只需要用到一个jl1.0.1.jar 文件)把这个jl1.0.1.jar的文件复制到java的编译器,例如Eclispe中,右键-》Build Path-》Add to Build Path (准备工作结束,接下来,咱就可以用这个包的东西啦,这个包,其实也没啥东西,就一个播放的Player类,以及播放方法play(),然后关闭close()方法哈哈哈)


4.png


2,开始书写项目,先分析一下咱的思路:

❀ class MusicStore :音乐仓库,使用了static 静态代码块的添加


5.png


 ❀ class PlayMusicTask :播放音乐的线程任务,里边就使用到咱的音乐包中的Player对象和play() 方法。

6.png


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



目录
相关文章
|
4月前
|
缓存 网络协议 Linux
c++实战篇(三) ——对socket通讯服务端与客户端的封装
c++实战篇(三) ——对socket通讯服务端与客户端的封装
|
12月前
|
前端开发 芯片
【芯片前端】保持代码手感——一对多的握手拆分模块
【芯片前端】保持代码手感——一对多的握手拆分模块
|
5月前
|
网络协议
客户端和服务端交互的基本模型
客户端和服务端交互的基本模型
50 0
|
网络协议
客户端与服务端交互的基本模型
客户端与服务端交互的基本模型,一定要理解噢!
83 0
|
XML 前端开发 网络协议
服务器向客户端推送消息的2种技术分析
服务器向客户端推送消息的2种技术分析
|
网络协议 前端开发 测试技术
海量用户通讯系统——服务端结构改进1|学习笔记
快速学习海量用户通讯系统——服务端结构改进1
海量用户通讯系统——服务端结构改进1|学习笔记
|
JSON 网络协议 测试技术
海量用户通讯系统-服务器接收消息2|学习笔记
快速学习海量用户通讯系统-服务器接收消息2
海量用户通讯系统-服务器接收消息2|学习笔记
|
JSON 前端开发 网络协议
海量用户通讯系统-服务端结构改进2|学习笔记
快速学习海量用户通讯系统-服务端结构改进2
WebSocket服务器和客户端的一对多通知实现
依次启动Orchestra,websocket server for KOI app和WebSocket server for Webshop,也就是总共启动三台服务器。
WebSocket服务器和客户端的一对多通知实现