服务端

import java.io.*;
import java.util.*;
import java.net.*;public class MusicServer {ArrayList<ObjectOutputStream> clientOutputStreams;public static void main(String[] args) {new MusicServer().go();}public class ClientHandler implements Runnable{Socket clientSocket;ObjectInputStream in;public ClientHandler(Socket s){try {clientSocket = s;in = new ObjectInputStream(clientSocket.getInputStream());  //getInputstream要抛出异常}catch(Exception ex){ex.printStackTrace();}}public void run(){Object o1 = null;Object o2 = null;try{while((o1 = in.readObject()) != null){//readObject存在异常o2 = in.readObject();System.out.println("read two objects");tellEveryone(o1,o2);}}catch(Exception ex){}}}//关闭内部类public void go(){clientOutputStreams = new ArrayList<ObjectOutputStream>();  //忘记new这个会导致抛出nullpoint异常try{ServerSocket serverSocket = new ServerSocket(5000); //监听4242端口(存在io异常)while(true) {Socket socket = serverSocket.accept(); //接受客户端的连接ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream()); //存在io异常clientOutputStreams.add(os);  //将客户端的输出流保存起来Thread t = new Thread(new ClientHandler(socket));t.start();}}catch(Exception ex){ex.printStackTrace();}}public void tellEveryone(Object o1,Object o2){//利用迭代器和集合向所有客户端发送信息Iterator it = clientOutputStreams.iterator();while(it.hasNext()){try{ObjectOutputStream out = (ObjectOutputStream)it.next();out.writeObject(o1);  //io异常out.writeObject(o2);  //io异常}catch(Exception ex){}}}
}

客户端

import java.awt.*;
import javax.swing.*;
import java.io.*;
import javax.sound.midi.*;
import java.util.*;
import java.awt.event.*;
import java.net.*;
import javax.swing.event.*;public class BeatBoxFinal {JFrame theFrame;JPanel mainPanel;JList incomingList;JTextField userMessage;ArrayList<JCheckBox> checkBoxList;  //存放256个勾选框int nextNum;Vector<String> listVector = new Vector<String>(); //动态数组存放读取到的音频的名字String userName;ObjectOutputStream out;ObjectInputStream in;HashMap<String, boolean[]> otherSeqsMap = new HashMap<String, boolean[]>(); //音频信息存储在map中根据key查询Sequencer sequencer;Sequence sequence;Sequence mySequence = null;Track track;String[] instrumentNames = {"Bass Drum", "Closed Hi-Hat", "Open Hi-Hat", "Acoustic Share", "Crash Cymbal", "Hand Clap", "High Tom", "Hi Bongo", "Maracas", "Whistle", "Low Conga", "Cowbell", "Vibraslap", "Low-mid Tom","High Agogo", "Open Hi Conga"};int[] instruments = {35, 42, 46, 38, 49, 39, 50, 60, 70, 72, 64, 56, 58, 47, 67, 63};public static void main(String[] args) {new BeatBoxFinal().startUp(args[0]);}public void startUp(String name) {userName = name;try {Socket socket = new Socket("127.0.0.1", 5000);out = new ObjectOutputStream(socket.getOutputStream());in = new ObjectInputStream(socket.getInputStream());Thread remote = new Thread(new RemoteReader());remote.start();} catch (Exception ex) {System.out.println("couldn't connect - you'll have to play alone");}setUpMidi();buildGui();}public void buildGui() {theFrame = new JFrame("Cyber BeatBox");theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);BorderLayout layout = new BorderLayout();JPanel background = new JPanel(layout);background.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); //格组件的间距checkBoxList = new ArrayList<JCheckBox>();Box buttonBox = new Box(BoxLayout.Y_AXIS);  //box布局的容器JButton start = new JButton("start");start.addActionListener(new MyStartListener());buttonBox.add(start);JButton stop = new JButton("Stop");stop.addActionListener(new MyStopListener());buttonBox.add(stop);JButton upTempo = new JButton("Tempo up");upTempo.addActionListener(new MyUpTempoListener());buttonBox.add(upTempo);JButton downTempo = new JButton("Tempo Down");downTempo.addActionListener(new MyDownTempoListener());buttonBox.add(downTempo);JButton sendIt = new JButton("sendIt");sendIt.addActionListener(new MySendListener());buttonBox.add(sendIt);userMessage = new JTextField();buttonBox.add(userMessage);//收到信息后的ListincomingList = new JList();incomingList.addListSelectionListener(new MyListSelectionListener());incomingList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); //限制用户只能选择一个JScrollPane theList = new JScrollPane(incomingList); //滚轮中有一个listbuttonBox.add(theList);incomingList.setListData(listVector); //从动态数组里获得信息Box nameBox = new Box(BoxLayout.Y_AXIS);for (int i = 0; i < 16; i++)nameBox.add(new Label(instrumentNames[i]));background.add(BorderLayout.EAST, buttonBox);background.add(BorderLayout.WEST, nameBox);theFrame.getContentPane().add(background);GridLayout grid = new GridLayout(16, 16); //16x16组件格局grid.setVgap(1); //组件竖直距离1grid.setHgap(2); //横距为2mainPanel = new JPanel(grid);background.add(BorderLayout.CENTER, mainPanel);for (int i = 0; i < 256; i++) {JCheckBox c = new JCheckBox();c.setSelected(false); //默认关闭checkBoxList.add(c);mainPanel.add(c);}theFrame.setBounds(50, 50, 300, 300);theFrame.pack();theFrame.setVisible(true);}public void setUpMidi() {try {sequencer = MidiSystem.getSequencer();sequencer.open();sequence = new Sequence(Sequence.PPQ, 4);track = sequence.createTrack();sequencer.setTempoInBPM(120);} catch (Exception ex) {ex.printStackTrace();}}public void buildTrackAndStart() {ArrayList<Integer> trackList = null;sequence.deleteTrack(track);track = sequence.createTrack(); //创造新的trackfor (int i = 0; i < 16; i++) {trackList = new ArrayList<Integer>();for (int j = 0; j < 16; j++) {JCheckBox jc = (JCheckBox) checkBoxList.get(i + j * 16);if (jc.isSelected()) {int key = instruments[i];trackList.add(key);} else {trackList.add(null);}}makeTracks(trackList);}track.add(makeEvent(192, 9, 1, 0, 15));try {sequencer.setSequence(sequence);sequencer.setLoopCount(sequencer.LOOP_CONTINUOUSLY);sequencer.start();sequencer.setTempoInBPM(120);} catch (Exception ex) {ex.printStackTrace();}}public void makeTracks(ArrayList list){Iterator it = list.iterator();for(int i=0;i<16;i++){Integer num = (Integer)it.next();if(num != null){int numKey = num.intValue();track.add(makeEvent(144,9,numKey,100,i));track.add(makeEvent(128,9,numKey,100,i+1));}}}public MidiEvent makeEvent(int comd,int chan,int one,int two,int tick){MidiEvent event = null;try{ShortMessage a = new ShortMessage();a.setMessage(comd,chan,one,two);event = new MidiEvent(a,tick);}catch(Exception ex){ex.printStackTrace();}return event;}class MyStartListener implements ActionListener{public void actionPerformed(ActionEvent a){buildTrackAndStart();}}class MyStopListener implements ActionListener{public void actionPerformed(ActionEvent a){sequencer.stop();}}class MyUpTempoListener implements ActionListener{public void actionPerformed(ActionEvent event){float tempoFactor = sequencer.getTempoFactor();sequencer.setTempoFactor((float)(tempoFactor*1.03));}}class MyDownTempoListener implements ActionListener{public void actionPerformed(ActionEvent event){float tempoFactor = sequencer.getTempoFactor();sequencer.setTempoFactor((float)(tempoFactor*0.97));}}class MySendListener implements ActionListener{public void actionPerformed(ActionEvent event){boolean[] checkboxState = new boolean[256];for(int i=0;i<256;i++){JCheckBox check = (JCheckBox)checkBoxList.get(i);if(check.isSelected())checkboxState[i] = true;elsecheckboxState[i] = false;}String messageToSend = null;try{out.writeObject(userName+nextNum+":"+userMessage.getText());out.writeObject(checkboxState);}catch(Exception ex){System.out.println("Sorry dude.Could not send it to the server.");}userMessage.setText("");}}class MyListSelectionListener implements ListSelectionListener{public void valueChanged(ListSelectionEvent le){if(!le.getValueIsAdjusting()){//为了不得到两次事件String selected = (String)incomingList.getSelectedValue();if(selected != null){boolean[] selectedState = (boolean[])otherSeqsMap.get(selected);//根据key在map中寻到信息changeSequence(selectedState);sequencer.stop();buildTrackAndStart();}}}}//多线程随时接受服务器发来的信息class RemoteReader implements Runnable{boolean[] checkBoxState = null;String nameToShow = null;Object obj = null;public void run(){try {while ((obj = in.readObject()) != null) {System.out.println("got an object from server");System.out.println(obj.getClass());nameToShow = (String) obj;checkBoxState = (boolean[]) in.readObject();otherSeqsMap.put(nameToShow, checkBoxState); //放入map存储listVector.add(nameToShow); //把key加入动态数组incomingList.setListData(listVector); //重新设置list}}catch(Exception ex){}}}class MyPlayMineListener implements ActionListener{public void actionPerformed(ActionEvent event){if(mySequence != null)sequence = mySequence;}}public void changeSequence(boolean[] checkboxState){for(int i=0;i<256;i++){JCheckBox checkBox = (JCheckBox)checkBoxList.get(i);if(checkboxState[i])checkBox.setSelected(true);elsecheckBox.setSelected(false);}}}

BeatBox终极版——Head first java 650相关推荐

  1. 阿里巴巴的“双11”高并发秒杀终极版教程(Java语言设计)

    一. 秒杀系统架构设计都有哪些关键点? 说实话,作为一名程序员,我的技术能力也在公司业务的快速增长过程中得到了历练,并积累了一些大流量高并发网站架构设计和优化的经验,尤其是针对"秒杀&quo ...

  2. 京东的“618”高并发秒杀终极版教程(Java 语言设计)

    一. 秒杀系统架构设计都有哪些关键点? 说实话,作为一名程序员,我的技术能力也在公司业务的快速增长过程中得到了历练,并积累了一些大流量高并发网站架构设计和优化的经验,尤其是针对"秒杀&quo ...

  3. 一份我们团队Java开发的开发规范,参考了阿里巴巴Java开发手册终极版v1.3.0

    编程规约 For variable name, always use English with lowerCamelCase. space in comment: bad example: Sugge ...

  4. Java学习必备书籍推荐终极版!

    很早就想把JavaGuide的书单更新一下了,昨晚加今天早上花了几个时间对之前的书单进行了分类和补充完善.虽是终极版,但一定还有很多不错的 Java 书籍我没有添加进去,会继续完善下去.希望这篇文章对 ...

  5. Java面试通关要点汇总集【终极版】

    原文地址:梁桂钊的博客 博客地址:blog.720ui.com 年前,我整理的 Java面试通关要点汇总集 获得了很多读者的肯定,谢谢大家支持.事实上,笔者结合自己过往的面试经验,整理了一些核心的知识 ...

  6. 阿里巴巴Java开发手册1.3.0(终极版)

    <阿里巴巴开发手册>是一份专业性很强的读物,出版目的是为了帮助开发人员更好地提高研发效率,作者用自己多年的开发经验,为所有在进阶路上的程序员朋友指点迷津.很多程序员拿到之后会以此为参考去对 ...

  7. 《阿里巴巴Java开发手册(终极版)》

    今天<阿里巴巴Java开发手册(终极版)>出炉-- 1.新版本历程 10月份阿里会出炉针对开发规范开发的IDE插件,值得期待! 2.新版本下载地址: https://pan.baidu.c ...

  8. Github下载热榜,阿里最新出品Java面试核心讲(终极版)

    程序员面试背八股,可以说是现在互联网开发岗招聘不可逆的形式了,其中最卷的当属Java!(网上动不动就是成千上百道的面试题总结)你要是都能啃下来,平时技术不是太差的话,面试基本上问题就不会太大. 这时候 ...

  9. 阿里巴巴Java开发手册终极版网页版v1.3.0

    前言 一 .编程规约 ( 一 ) 命名风格 ( 二 ) 常量定义 ( 三 ) 代码格式 ( 四 ) OOP规约 ( 五 ) 集合处理 ( 六 ) 并发处理 ( 七 ) 控制语句 ( 八 ) 注释规约 ...

最新文章

  1. linux 修改时区_如何在 Ubuntu 20.04 上设置或者修改时区
  2. C++ 注册表取值 按行读取txt文件 时间差天数 格林威治时间转标准时间
  3. SpringBoot 模版渲染
  4. primeNG DataTable中Templating ng-template标签报错
  5. 使用.NET Core 2.1的Azure WebJobs
  6. UNIX网络编程——fcntl函数
  7. 实时获取滚动条的高度_适用于星上快速处理的雷达高度计有效波高反演技术
  8. 微信小程序的剪贴板 +复制剪贴,在淘宝中打开就可以获取到商品
  9. python程序的装修【文件可执行权限】【__name__】
  10. →箭头符号大全复制_WORD特殊符号大全lpar;直接复制即可rpar;
  11. MySQL: GTID简介,gtid_executed和gtid_purged概念
  12. WhatsApp创始人:从领救济到身价68亿
  13. 建模软件MAYA最详细的教程介绍来了
  14. PHP判断字符串是否含有特殊字符(亲测有效)
  15. Live800:在线客服系统如何为客服减负?
  16. 用matlab解决多重共线性问题,多重共线性和非线性回归的问题
  17. 论文笔记Improving Multi-hop Knowledge Base Question Answering by Learning Intermediate Supervision Signa
  18. NCC eclipse启动配置
  19. 大数据量查询解决方案
  20. python 图片库_最新PHP+Python开源版在线浏览美女图片美女套图源码带数据库

热门文章

  1. 用python写数据库的主从怎么写_scrapy 读写数据库
  2. js月份的计算公式_JS根据生日月份和日期计算星座的简单实现方法
  3. 可自建中继服务器的远程桌面软件: RustDesk
  4. CentOS系统服务器加固,Centos7 安全加固
  5. 使用EasyExcel将本地excel数据读取后导入mysql数据库中
  6. 使用exe4j打包Java桌面程序为exe
  7. 逃离一线城市程序员的Plan B
  8. 【Java语言】请输入任意一个三位数,输出个位 , 十位 , 和百位,输入:123,输出:3,2,1
  9. 如何使用加密锁加密自己程序
  10. 猿大师播放器有哪些不同的版本,分别适合哪些不同需求的场景?