package org.jzy.shudu; import org.jzy.shudu.Server; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; import java.util.Vector; import java.util.logging.Level; import org.apache.log4j.Logger; public class ServerThread extends Thread { private static final Logger log = Logger.getLogger(ServerThread.class); Socket client; DataInputStream dis; boolean isRun = true; String uname = ""; int map[][] = new int[9][9]; boolean counterFlag=true; public ServerThread(Socket client) { try { this.client = client; dis = new DataInputStream(client.getInputStream()); } catch (Exception ex) { ex.printStackTrace(); } } @Override public void run() { while (isRun) { try { int command = dis.readInt(); log.info(command); switch (command) { //发送用户名 case Flag.COMMAND_SEND_USERNAME: String clientName = dis.readUTF(); uname = clientName; DataOutputStream dos = new DataOutputStream( client.getOutputStream()); dos.writeInt(Flag.COMMAND_SEND_USERLIST); dos.writeInt(Server.clints.size()); for (int i = 0; i < Server.clints.size(); i++) { ServerThread st = (ServerThread) Server.clints .get(i); dos.writeUTF(st.uname); } for (int i = 0; i < Server.clints.size(); i++) { ServerThread st = (ServerThread) Server.clints .get(i); if (!uname.equals(st.uname)) { DataOutputStream dos1 = new DataOutputStream( st.client.getOutputStream()); dos1.writeInt(Flag.COMMAND_SEND_NEWUSER); dos1.writeUTF(uname); } } Server.sendToAll("用户" + uname + "加入聊天室"); break; //私聊 case Flag.COMMAND_SEND_CHAT_PRIVATE: String toname = dis.readUTF(); String msg = dis.readUTF(); Server.sendToClient(toname, uname + "悄悄对你说: " + msg); break; //公聊 case Flag.COMMAND_SEND_CHAT_PUBLIC: msg = dis.readUTF(); log.info("公聊: "+msg); Server.sendToAll(uname + " 对大家说: " + msg); break; //游戏大厅列表 case Flag.COMMAND_GAME_ROOM: msg = dis.readUTF(); for (int i = 0; i < Server.clints.size(); i++) { ServerThread st = (ServerThread) Server.clints .get(i); DataOutputStream dos2 = new DataOutputStream( st.client.getOutputStream()); dos2.writeInt(Flag.COMMAND_GAME_ROOM); dos2.writeUTF(msg); } break; //发送地图 case Flag.COMMAND_GAME_CREATEMAP: for (int i = 0; i < map.length; i++) { //结收地图 System.out.println(); for (int j = 0; j < map[i].length; j++) { map[i][j] = dis.readInt(); System.out.print(map[i][j] + "\t"); } } for (int k = 0; k < Server.clints.size(); k++) { ServerThread st = (ServerThread) Server.clints .get(k); DataOutputStream dos3 = new DataOutputStream( st.client.getOutputStream()); dos3.writeInt(Flag.COMMAND_GAME_CREATEMAP); for (int i = 0; i < map.length; i++) { //发送地图 // System.out.println(); for (int j = 0; j < map[i].length; j++) { dos3.writeInt(map[i][j]); // System.out.print(map[i][j] + "\t"); } } } break; //退出游戏大厅 case Flag.COMMAND_GAME_EXITROOM: String liveName = dis.readUTF(); for (int i = 0; i < Server.clints.size(); i++) { ServerThread st = (ServerThread) Server.clints .get(i); DataOutputStream dos2 = new DataOutputStream( st.client.getOutputStream()); dos2.writeInt(Flag.COMMAND_GAME_EXITROOM); dos2.writeUTF(liveName); } break; //开始游戏 case Flag.COMMAND_GAME_GAMESTART: boolean play=dis.readBoolean(); for (int i = 0; i < Server.clints.size(); i++) { ServerThread st = (ServerThread) Server.clints .get(i); DataOutputStream dos2 = new DataOutputStream( st.client.getOutputStream()); dos2.writeInt(Flag.COMMAND_GAME_GAMESTART); dos2.writeBoolean(play); } break; case Flag.COMMAND_GAME_ANSER: String userName=dis.readUTF(); for (int i = 0; i < Server.clints.size(); i++) { ServerThread st = (ServerThread) Server.clints .get(i); DataOutputStream dos2 = new DataOutputStream( st.client.getOutputStream()); dos2.writeInt(Flag.COMMAND_GAME_ANSER); dos2.writeUTF(userName); } //游戏结束 case Flag.COMMAND_GAME_GAMECOMPLETE: String outName=dis.readUTF(); counterFlag=dis.readBoolean(); //设置计时器终止标志 for (int i = 0; i < Server.clints.size(); i++) { ServerThread st = (ServerThread) Server.clints .get(i); DataOutputStream dos2 = new DataOutputStream( st.client.getOutputStream()); dos2.writeInt(Flag.COMMAND_GAME_GAMECOMPLETE); dos2.writeUTF(outName); } break; //游戏计时 case Flag.COMMAND_GAME_TIMECOUNT: int time = 0; while (counterFlag) { try { Thread.sleep(1000); } catch (InterruptedException ex) { ex.printStackTrace(); } time++; for (int i = 0; i < Server.clints.size(); i++) { ServerThread st = (ServerThread) Server.clints .get(i); DataOutputStream dos2 = new DataOutputStream( st.client.getOutputStream()); dos2.writeInt(Flag.COMMAND_GAME_TIMECOUNT); dos2.writeInt(time); } } break; } } catch (Exception ex) { ex.printStackTrace(); Server.clints.remove(this); isRun = false; for (int i = 0; i < Server.clints.size(); i++) { try { ServerThread st = (ServerThread) Server.clints .get(i); DataOutputStream dos1 = new DataOutputStream( st.client.getOutputStream()); dos1.writeInt(Flag.COMMAND_SEND_USERLOGOUT); dos1.writeUTF(uname); } catch (Exception e) { e.printStackTrace(); } } Server.sendToAll("用户" + uname + "离开聊天室"); } } } }
package org.jzy.shudu; import java.awt.MenuItem; import org.jzy.shudu.Flag; import java.io.DataInputStream; import java.io.ObjectInputStream; import java.net.Socket; import java.util.Timer; import java.util.TimerTask; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import org.apache.log4j.Logger; public class ClientThread extends Thread { private static final Logger log = Logger.getLogger(ClientThread.class); public int[][] serverMap = new int[9][9]; Socket client; DataInputStream dis; JList onlineUserLIst; JList msgList; JList gameRoom; JLabel gameTimer; ShuDuJFrame sdf; MapPanel mapPanel; JButton createGame; public ClientThread(Socket client, JList onlineUserLIst, JList msgList, JList gameRoom, JLabel gameTimer, ShuDuJFrame sdf, MapPanel mapPanel, JButton createGame) { try { this.client = client; this.onlineUserLIst = onlineUserLIst; this.msgList = msgList; this.gameRoom = gameRoom; this.gameTimer = gameTimer; this.sdf = sdf; this.mapPanel = mapPanel; this.createGame = createGame; dis = new DataInputStream(client.getInputStream()); } catch (Exception ex) { ex.printStackTrace(); } } @Override public void run() { while (true) { try { int command = dis.readInt(); switch (command) { // 发送用户列表 case Flag.COMMAND_SEND_USERLIST: int ucounter = dis.readInt(); for (int i = 0; i < ucounter; i++) { String name = dis.readUTF(); DefaultListModel model = (DefaultListModel) onlineUserLIst .getModel(); model.addElement(name); } break; //�聊天������������������ case Flag.COMMAND_CHAT: String msg = dis.readUTF(); DefaultListModel model = (DefaultListModel) msgList.getModel(); model.addElement(msg); break; //��新用户 case Flag.COMMAND_SEND_NEWUSER: String newUName = dis.readUTF(); model = (DefaultListModel) onlineUserLIst.getModel(); model.addElement(newUName); break; //用户离线 case Flag.COMMAND_SEND_USERLOGOUT: String logoutName = dis.readUTF(); model = (DefaultListModel) onlineUserLIst.getModel(); model.removeElement(logoutName); model = (DefaultListModel) gameRoom.getModel(); model.removeElement(logoutName); break; //游戏大厅列表 case Flag.COMMAND_GAME_ROOM: String roomUser = dis.readUTF(); model = (DefaultListModel) gameRoom.getModel(); model.addElement(roomUser); createGame.setEnabled(false); break; //创建地图 case Flag.COMMAND_GAME_CREATEMAP: for (int i = 0; i < serverMap.length; i++) { for (int j = 0; j < serverMap[i].length; j++) { serverMap[i][j] = dis.readInt(); } } mapPanel.map = serverMap; for (int i = 0; i < 9; i++) { //清空playmap中保存的上次地图,以供下次使用(初始化) for (int j = 0; j < 9; j++) { mapPanel.playmap[i][j]=0; } } if (mapPanel.play) { //保护生成的地图,使他不能被用户改变 mapPanel.playsk = new ShuDu(); mapPanel.playmap = new int[9][9]; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { mapPanel.playmap[i][j] = mapPanel.map[i][j]; } } // mapPanel.playsk.initMap(mapPanel.playmap); } mapPanel.repaint(); break; //离开游戏 case Flag.COMMAND_GAME_EXITROOM: String livetName = dis.readUTF(); model = (DefaultListModel) gameRoom.getModel(); model.removeElement(livetName); model = (DefaultListModel) msgList.getModel(); model.addElement(livetName + " 离开游戏大厅!"); JOptionPane.showMessageDialog(mapPanel, livetName + " 离开游戏大厅"); break; //游戏计时 case Flag.COMMAND_GAME_TIMECOUNT: final int time = dis.readInt(); String timeCount = "用时:" + time + "秒"; gameTimer.setText(timeCount); break; //游戏开始 case Flag.COMMAND_GAME_GAMESTART: boolean play = dis.readBoolean(); JOptionPane.showMessageDialog(mapPanel, "游戏开始"); mapPanel.play = play; break; //游戏结束 case Flag.COMMAND_GAME_GAMECOMPLETE: String userName = dis.readUTF(); JOptionPane.showMessageDialog(mapPanel, userName + " 完成游戏"); break; case Flag.COMMAND_GAME_ANSER: String liveName = dis.readUTF(); JOptionPane.showMessageDialog(mapPanel, liveName + " 投降退出游戏"); } } catch (Exception ex) { ex.printStackTrace(); } } } }
资源下载(源代码)地址:http://down.51cto.com/data/871394