HeadFirstJava 中BeatBoxFinal理解(服务器端不明白了好长时间现在有点思路)
2018-02-10 23:40 Lyp_02 阅读(190) 评论(0) 收藏 举报1.创建客户端,服务器
2.客户端有产生线程 判断有没有来自服务器的输入
3.服务器有产生线程 判断有没有客户端访问(程序看不明白serverSock. 是等待 accept方法一直到客户端启动并向服务器发出请求为止一直在等待。)
不收到accept(),不会执行到下面代码
4.一个clientOutputStreams 的ArrayList 存储所有的客户端套接字,用来服务器群发给客户端。
内容关键书上都有的,自己看书不仔细,心不在焉,宁愿多纠结,自己瞎猜,也不愿意求助书本,好好看看,方法问题多着呢。
还是没有耐心,从简单到复杂,遇到复杂干脆臆想放弃,方法要改改。
5.本地连接报超时 java.net.ConnectException: Connection timed out: connect
6.控制台javac 无法加载主类
7.客户端服务器 无法通讯-----原因是服务器启动要等待一段时间 用cmd检查netstat -na 看看对应的本地连接是不是Established.
代码:
MusicServer.java
import java.io.;
import java.net.;
import java.util.*;
public class MusicServer {
ArrayList
Socket clientSocket;
public static void main(String[] args){
new MusicServer().go();
}
public class ClientHandler implements Runnable {
ObjectInputStream in;
Socket clientSocket;
public ClientHandler(Socket socket){
try{
clientSocket = socket;
in =new ObjectInputStream(clientSocket.getInputStream());
}catch(Exception ex){
ex.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
Object o2= null;
Object o1 =null;
try{
while((o1 = in.readObject())!=null){
o2=in.readObject();
System.out.println("Read two objects");
tellEveryone(o1,o2);
}
}catch(Exception ex){
ex.printStackTrace();
}
}
}
public void go(){
clientOutputStreams = new ArrayList<ObjectOutputStream>();
try{
ServerSocket serverSock =new ServerSocket(4242);
while(true){
Socket clientSocket = serverSock.accept();
ObjectOutputStream out =new ObjectOutputStream(clientSocket.getOutputStream());
clientOutputStreams.add(out);
Thread t =new Thread(new ClientHandler(clientSocket));
t.start();
System.out.println("got a connection");}
}catch(Exception ex){ ex.printStackTrace();}
}
public void tellEveryone(Object one,Object two){
Iterator it = clientOutputStreams.iterator();
while(it.hasNext()){
try{
ObjectOutputStream out =(ObjectOutputStream) it.next();
out.writeObject(one);
out.writeObject(two);
}catch(Exception ex){ ex.printStackTrace();}
}
}
}
BeatBoxFinal.java 代码
mport 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
int nextNum;
Vector
String userName;
ObjectOutputStream out;
ObjectInputStream in;
HashMap<String,boolean[]> otherSeqsMap = new HashMap<String,boolean[]>();
Sequencer sequencer;
Sequence sequence;
Sequence mySequence = null;
Track track;
String[] instrumentNames = {"Bass Drum","Closed Hi-Hat","Open Hi-Hat","Acoustic Snare",
"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("Lyp");
}
public void startUp(String name){
userName = name;
try{
Socket sock= new Socket("127.0.0.1",4242);
out = new ObjectOutputStream(sock.getOutputStream());
in =new ObjectInputStream(sock.getInputStream());
Thread remote = new Thread(new RemoteReader());
remote.start();
}catch(Exception ex){
ex.printStackTrace();
System.out.println("couldn't connect - you'll have to play alone.");
}
setUpMidi();
buildGUI();
}
public void buildGUI(){
theFrame = new JFrame("Cyber BeatBox");
BorderLayout layout = new BorderLayout();
JPanel background = new JPanel(layout);
background.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
checkboxList = new ArrayList
Box buttonBox = new Box(BoxLayout.Y_AXIS);
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);
incomingList = new JList();
incomingList.addListSelectionListener(new MyListSelectionListener());
incomingList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane theList = new JScrollPane(incomingList);
buttonBox.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);
grid.setVgap(1);
grid.setHgap(2);
mainPanel = 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
sequence.deleteTrack(track);
track = sequence.createTrack();
for (int i=0;i<16;i++){
trackList = new ArrayList
for(int j=0;j<16;j++){
JCheckBox jc =(JCheckBox) checkboxList.get(j+(16*i));
if(jc.isSelected()){
int key =instruments[i];
trackList.add(new Integer(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 e){ e.printStackTrace();}
}
public class MyStartListener implements ActionListener{
public void actionPerformed(ActionEvent a){
buildTrackAndStart();
}
}
public class MyStopListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
sequencer.stop();
}
}
public class MyUpTempoListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
float tempoFactor = sequencer.getTempoFactor();
sequencer.setTempoFactor((float)(tempoFactor*1.03));
}
}
public class MyDownTempoListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
float tempoFactor = sequencer.getTempoFactor();
sequencer.setTempoFactor((float)(tempoFactor*0.97));
}
}
public class MySendListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
boolean[] checkboxState = new boolean[256];
for (int i =0;i<256;i++){
JCheckBox check =(JCheckBox) checkboxList.get(i);
if(check.isSelected()){
checkboxState[i] = true;
}
}
String messageToSend =null;
try{
System.out.println("Now is writeObject in out");
out.writeObject(userName + nextNum++ + ": " +userMessage.getText());
out.writeObject(checkboxState);
}catch(Exception ex){
ex.printStackTrace();
System.out.println("Sorry dude.Could not send it to the server.");
}
userMessage.setText("");
}
}
public class MyListSelectionListener implements ListSelectionListener{
public void valueChanged(ListSelectionEvent e){
if(!e.getValueIsAdjusting()){
String selected =(String) incomingList.getSelectedValue();
if (selected !=null){
boolean[] selectedState =(boolean[]) otherSeqsMap.get(selected);
changeSequence(selectedState);
sequencer.stop();
buildTrackAndStart();
}
}
}
}
public class RemoteReader implements Runnable{
boolean[] checkboxState =null;
String nameToShow =null;
Object obj = null;
@Override
public void run() {
// TODO Auto-generated method stub
try{
while((obj =in.readObject())!=null){
System.out.println("got an object from server");
System.out.println(obj.getClass());
String nameToShow =(String) obj;
checkboxState = (boolean[]) in.readObject();
otherSeqsMap.put(nameToShow, checkboxState);
listVector.add(nameToShow);
incomingList.setListData(listVector);
}
}catch(Exception ex){ ex.printStackTrace();}
}
}
public class MyPlayMineListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (mySequence !=null){
sequence =mySequence;
}
}
}
public void changeSequence(boolean[] checkboxState){
for(int i=0;i<256;i++){
JCheckBox check =(JCheckBox) checkboxList.get(i);
if(checkboxState[i]){
check.setSelected(true);
}else{
check.setSelected(false);
}
}
}
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 e){e.printStackTrace();}
return event;}
}
浙公网安备 33010602011771号