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