TCP基础题:音乐播放列表管理系统

需求描述

  • 服务器端
    • 创建一个 TCP 服务器,监听本地的 9999 端口,支持多个客户端连接。
    • 维护一个音乐播放列表,每个音乐条目包含歌曲名称、歌手、时长等信息。
    • 能够处理客户端的以下请求:
      • 添加音乐到播放列表:接收客户端发送的 Music 对象,使用 ObjectInputStream 读取,并将其添加到播放列表中。
      • 删除音乐:接收客户端发送的歌曲名称,使用 ObjectInputStream 读取,从播放列表中删除对应歌曲。
      • 获取播放列表:将当前的播放列表封装成 MusicPlaylist 对象,使用 ObjectOutputStream 发送给客户端。
  • 客户端
    • 创建一个 TCP 客户端,连接到本地的 9999 端口。
    • 可以向服务器发送添加音乐请求,创建 Music 对象并使用 ObjectOutputStream 发送。
    • 可以向服务器发送删除音乐请求,将歌曲名称使用 ObjectOutputStream 发送。
    • 可以向服务器发送获取播放列表请求,接收服务器返回的 MusicPlaylist 对象,使用 ObjectInputStream 读取并显示。
数据描述
  • Music 类
    • String songName:歌曲名称。
    • String singer:歌手。
    • int duration:歌曲时长(秒)。
  • MusicPlaylist 类
    • ArrayList<Music> musicList:音乐播放列表。

 附加:修改歌单名字

Server和Client的Music,Data和MusicPlaylist类 

        music类

import java.io.Serializable;public class Music implements Serializable {private String songName;private String singer;private int duration;public Music(String songName, String singer, int duration) {this.songName = songName;this.singer = singer;this.duration = duration;}public String getSongName() {return songName;}public String getSinger() {return singer;}public int getDuration() {return duration;}public void setSongName(String songName) {this.songName=songName;}public void setSinger(String singer) {this.singer=singer;}public void setDuration(int duration) {this.duration=duration;}@Overridepublic String toString() {return "歌曲名称: " + songName + ", 歌手: " + singer + ", 时长: " + duration + " 秒";}
}

        MusicPlaylist类

import java.io.Serializable;
import java.util.ArrayList;public class MusicPlaylist implements Serializable {private ArrayList<Music> musicList;public MusicPlaylist() {this.musicList = new ArrayList<>();}public ArrayList<Music> getMusicList() {return musicList;}public void addMusic(Music music) {musicList.add(music);}public void removeMusic(String songName) {musicList.removeIf(music -> music.getSongName().equals(songName));}public void modifyMusic(String songModify, String songNew){for (Music music : musicList) {if (music.getSongName().equals(songModify)){music.setSongName(songNew);}}}
}

        Data类(Data类启到一个把用户操作封装的作用,便于数据的打包和传输,方便程序编写的使用)

import java.io.Serializable;public class Data implements Serializable {private String op;private String songName;private String songNew;private Music music;public Data() {}public Data(String op) {this.op=op;}public String getOp() {return op;}public void setOp(String op) {this.op=op;}public Music getMusic() {return music;}public void setMusic(Music music) {this.music=music;}public void setMusicName(String songName) {this.songName = songName;}public String getMusicName() {return songName;}public void setMusicNewName(String songNew) {this.songNew = songNew;}public String getMusicNewName() {return songNew;}
}

客户端ClientZJL:

import com.zb2.entity.Data;
import com.zb2.entity.Music;
import com.zb2.entity.MusicPlaylist;import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.ArrayList;public class ClientZJL {public static void main(String[] args) throws IOException, ClassNotFoundException {Socket socket = new Socket("127.0.0.1", 9999);ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());String opWhat;String songDelete;String songModify;String songNew;String msg;Data op = new Data();// 添加音乐===============================================Music music = new Music("青花瓷", "周杰伦", 300);opWhat = "添加";//包装Dataop.setOp(opWhat);op.setMusic(music);//发送Dataoos.writeObject(op);//接收系统发回的信息msg = (String) ois.readObject();System.out.println(msg);//修改音乐===============================================opWhat = "修改";songModify = "青花瓷";songNew = "七里香";//包装Dataop.setOp(opWhat);op.setMusicName(songModify);op.setMusicNewName(songNew);//发送Dataoos.writeObject(op);//接收系统发回的信息msg = (String) ois.readObject();System.out.println(msg);//删除音乐===============================================opWhat = "删除";songDelete = "青花瓷";//包装Dataop.setOp(opWhat);op.setMusicName(songDelete);//发送Dataoos.writeObject(op);//接收系统发回的信息msg = (String) ois.readObject();System.out.println(msg);// 获取播放列表===============================================opWhat = "查看歌单";//包装Dataop.setOp(opWhat);//发送Dataoos.writeObject(op);//接收系统发回的歌单对象MusicPlaylist playlist = (MusicPlaylist) ois.readObject();//将歌单对象转换为集合并打印ArrayList<Music> musicList = playlist.getMusicList();for (Music m : musicList) {System.out.println(m);}}
}

服务端Server:

        Server类

import com.zb2.entity.MusicPlaylist;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(9999);System.out.println("服务器启动 端口:" + 9999);MusicPlaylist playlist = new MusicPlaylist();while (true) {Socket socket=serverSocket.accept();ServerThread serverThread = new ServerThread(socket, playlist);serverThread.start();}}
}

        ServerThread类

import com.zb2.entity.Data;
import com.zb2.entity.MusicPlaylist;import java.io.*;
import java.net.Socket;public class ServerThread extends Thread {private Socket socket;private MusicPlaylist playlist;public ServerThread(Socket socket, MusicPlaylist playlist) {this.socket = socket;this.playlist = playlist;}@Overridepublic void run() {ObjectInputStream ois =null;ObjectOutputStream oos =null;try {ois=new ObjectInputStream(socket.getInputStream());oos=new ObjectOutputStream(socket.getOutputStream());Data op = new Data();op =(Data) ois.readObject();switch (op.getOp()) {case "添加":playlist.addMusic(op.getMusic());System.out.println("添加音乐: " + op.getMusic());oos.writeObject("添加成功!");break;case "删除":playlist.removeMusic(op.getMusicName());System.out.println("删除音乐: " + op.getMusicName());oos.writeObject("删除成功!");break;case "修改":playlist.modifyMusic(op.getMusicName(),op.getMusicNewName());System.out.println("修改音乐: " + op.getMusicName()+",为"+op.getMusicNewName());oos.writeObject("修改成功!");break;case "查看歌单":oos.writeObject(playlist);System.out.println("返回给客户端歌单");break;}} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}finally {try {oos.close();ois.close();socket.close();} catch (IOException e) {e.printStackTrace();}}}
}

运行结果:

添加歌曲:

查看歌单:

删除歌曲(青花瓷):

再次查看歌单:

修改曲目(青花瓷->七里香):

再次查看歌单:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Verilog 语法 (二)

在掌握了 Verilog 的基础语法和常用程序框架之后&#xff0c;本节将带大家深入学习一些 高级设计知识点。这些内容包括&#xff1a; 阻塞赋值&#xff08;&#xff09;与非阻塞赋值&#xff08;<&#xff09;的区别及使用场景&#xff1b; assign 和 always 语句的差异&am…

OpenCV 图形API(61)图像特征检测------检测图像边缘的函数Canny()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用Canny算法在图像中查找边缘。 该函数在输入图像中查找边缘&#xff0c;并使用Canny算法在输出映射&#xff08;edges&#xff09;中标记它们…

ubantu中下载编译安装qt5.15.3

操作步骤如下&#xff1a; 克隆 Qt 仓库&#xff1a; git clone https://code.qt.io/qt/qt5.git cd qt5 切换到 Qt 5.15.3 标签&#xff1a; git checkout v5.15.3-lts-lgpl 初始化子模块&#xff1a; perl init-repository 配置和编译 Qt&#xff1a; ./configure -prefix $H…

毕业论文设计基本内容和要求:

毕业设计基本内容和要求&#xff1a; 研究内容 调查了解LAMP架构和PHP开发&#xff1b; 学习百度旅游调用的其他产品线服务并熟悉请求接口&#xff1b; 学习社区业务层规范&#xff1b; 设计并实现旅游主要模块&#xff1b; 技术指标 熟悉企业中流程运转的方式&#xff0c;…

【大语言模型】大语言模型(LLMs)在工业缺陷检测领域的应用

大语言模型&#xff08;LLMs&#xff09;在工业缺陷检测领域的应用场景正在快速扩展&#xff0c;结合其多模态理解、文本生成和逻辑推理能力&#xff0c;为传统检测方法提供了新的技术路径。以下是该领域的主要应用场景及相关技术进展&#xff1a; 1. 多模态缺陷检测与解释 视…

【AI插件开发】Notepad++ AI插件开发1.0发布和使用说明

一、产品简介 AiCoder是一款为Notepad设计的轻量级AI辅助插件&#xff0c;提供以下核心功能&#xff1a; 嵌入式提问&#xff1a;对选中的文本内容进行AI分析&#xff0c;通过侧边栏聊天界面与AI交互&#xff0c;实现多轮对话、问题解答或代码生成。对话式提问&#xff1a;独…

第2讲:R语言中的色彩美学——科研图表配色指南

目录 一、背景导引:科研图表为何需要“配色讲究”? 二、色彩基础认知:别让“红绿盲”错过你的科研成果 三、R语言中的配色库全景图 四、案例演示与代码实战 🎨案例1:ggplot2 + viridis 配色的热图 🎨案例2:MetBrewer 中的印象派色彩 五、技巧点拨:如何为SCI图…

基于Django的个性化股票交易管理系统

本项目基于Python3.6、Django2.1、MySql8.0&#xff08;最好不要使用5.6&#xff0c;字符集等方面均不兼容&#xff0c;否则导入数据库会出错&#xff09;与股票信息工具包TuShare实现。 创建或激活对应Python开发环境 这里使用了conda来管理环境&#xff0c;强烈推荐&#xf…

超越GPT-4?下一代大模型的技术突破与挑战

超越GPT-4&#xff1f;下一代大模型的技术突破与挑战 引言&#xff1a;大模型的演进历程 人工智能领域近年来最引人注目的发展莫过于大型语言模型(Large Language Models, LLMs)的快速进步。从GPT-3到GPT-4&#xff0c;再到如今各种宣称"超越GPT-4"的模型不断涌现&…

Js 之点击下拉搜索Ajax-Bootstrap-Select

一、效果图 二、文档 https://gitcode.com/gh_mirrors/aj/Ajax-Bootstrap-Select/tree/master 三、示例代码 引入插件js、css <link rel"stylesheet" href"{php echo MODULE_URL}template/lib/bootstrap-select/css/bootstrap-select.min.css"> <…

无线监控系统分类全解析:搭配视频融合平台EasyCVR开启高效监控

随着技术的发展&#xff0c;无线监控系统在家庭、小型企业、特定行业以及室外恶劣环境中的应用越来越广泛。本文将介绍几种常见的无线监控系统&#xff0c;分析其优缺点&#xff0c;并结合EasyCVR视频融合平台的功能&#xff0c;探讨如何优化无线监控系统的性能和应用。 一、主…

WebRTC服务器Coturn服务器中的通信协议

1、概述 作为WebRTC服务器&#xff0c;coturn通信协议主要是STUN和TURN协议 STUN&TURN协议头部都是20个字节,用 Message Type来区分不同的协议 |------2------|------2------|------------4------------|------------------------12-------------------------|-----------…

Vue Transition 组件详解:让元素动起来

文章目录 一、为什么需要 Transition 组件&#xff1f;二、核心工作原理三、基础用法&#xff1a;6个过渡类名四、进阶用法五、 JavaScript 钩子函数六、过渡模式&#xff08;Mode&#xff09;七、列表过渡&#xff08;TransitionGroup&#xff09;八、与第三方动画库结合&…

【Redis】有序集合类型Sortedset 常用命令详解

此类型和 set 一样也是 string 类型元素的集合&#xff0c;且不允许重复的元素 不同的是每个元素都会关联一个double类型的分数&#xff0c;redis正是通过分数来为集合中的成员进行从小到大的排序 有序集合的成员是唯一&#xff0c;但分数(score)却可以重复 1. zadd - 添加 语法…

微信小程序 van-dropdown-menu

点击其他按钮&#xff0c;关闭van-dropdown-menu下拉框 DropdownMenu 引入页面使用index.wxmlindex.scssindex.ts(重点)index.ts(全部) DropdownMenu 引入 在app.json或index.json中引入组件 "usingComponents": {"van-dropdown-menu": "vant/weapp…

C 语言内存分配方法及优缺点

在 C 语言开发中&#xff0c;内存分配的方式主要有三种&#xff1a;静态内存分配、栈内存分配和堆内存分配。每种分配方式都有其独特的特点、适用场景以及优缺点。 静态内存分配 静态内存分配是在编译时就确定好内存的分配&#xff0c;它主要用于定义全局变量和静态局部变量。…

第二大脑-个人知识库

原文链接:https://i68.ltd/notes/posts/20250407-llm-person-kb/ Quivr-第二大脑一样的个人助手&#xff0c;利用AI技术增强个人生产力 将 GenAI 集成到您的应用程序中的个性化 RAG,专注于您的产品而非 RAG项目仓库:https://github.com/QuivrHQ/quivr Star:37.7k官网:https:/…

A. Ambitious Kid

time limit per test 1 second memory limit per test 256 megabytes Chaneka, Pak Chaneks child, is an ambitious kid, so Pak Chanek gives her the following problem to test her ambition. Given an array of integers [A1,A2,A3,…,AN][A1,A2,A3,…,AN]. In one o…

SQL进阶知识:八、性能调优

今天介绍下关于性能调优的详细介绍&#xff0c;并结合MySQL数据库提供实际例子。 性能调优是数据库管理中的一个重要环节&#xff0c;尤其是在处理高并发和大数据量的应用场景时。MySQL提供了多种工具和方法来优化数据库性能。以下是关于MySQL性能调优的详细介绍&#xff0c;以…

NVLink、UALink 崛起,PCIe Gen6 如何用 PAM4 迎战未来?

现在数字经济发展地相当快速&#xff0c;像Cloud、现在火红的AI、大数据这些新技术都需要在数据中心里运行更多运算&#xff0c;伴随而来的是更快的数据传输速度的需求。 在数据中心&#xff0c;有很多条数据传输路径&#xff0c;举例 &#xff1a; Server 和Storage之间&…