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.pswp.cn/bicheng/78567.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78567.shtml
英文地址,請注明出處:http://en.pswp.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之間&…