代码改变世界

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 clientOutputStreams;
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 checkboxList;
int nextNum;
Vector listVector = new 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 trackList =null;
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;}

}