import java.net.*;
import java.util.*;
import java.io.*;
public class ChatServer
{
public static void main(String[] args)
{
Hashtable<String,DataOutputStream> userList = new Hashtable<String,DataOutputStream>();
DataInputStream dis;
DataOutputStream dos;
String name;
try
{
ServerSocket ss = new ServerSocket(9978);
while(true)
{
Socket s = ss.accept();
dis = new DataInputStream(s.getInputStream());
dos = new DataOutputStream(s.getOutputStream());
name = dis.readUTF();
userList.put(name,dos);
new Server(name,userList,dis,dos).start();
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
class ClientInformation
{
public static int num = 0;
public static String desknum[] = new String[10];
public static String name[] = new String[10];
public static String headicon[] = new String[10];
}
class Server extends Thread
{
private Hashtable<String,DataOutputStream> userList;
private DataInputStream dis;
private DataOutputStream dos;
private DataOutputStream dos2;
private String name;
private String name2;
private String info;
private String iconstring;
private String iconstring2;
private String desknum;
private String desknum2;
private boolean judue = false;
public Server(String name,Hashtable<String,DataOutputStream> userList,DataInputStream dis, DataOutputStream dos)
{
this.name = name;
this.dis = dis;
this.userList = userList;
this.dos = dos;
}
public void run()
{
try
{
if(ClientInformation.num > 0)
{
String s = String.valueOf(ClientInformation.num);
try{
dos.writeUTF("comein");
dos.writeUTF(s);
for(int i = 0; i < ClientInformation.num; ++i)
{
dos.writeUTF(ClientInformation.desknum[i]);
dos.writeUTF(ClientInformation.name[i]);
dos.writeUTF(ClientInformation.headicon[i]);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
transimitMessage(name+"进入大厅","服务器信息 ");
while(true)
{
info = dis.readUTF();
if(info.equals("exit")){
DataOutputStream dos = (DataOutputStream)(userList.get(name));
dos.close();
dis.close();
userList.remove(name);
Collection doses = userList.values();
if(judue)
{
for(int i = 0; i < ClientInformation.num; ++i)
{
if(name == ClientInformation.name[i])
{
String Temp;
Temp = ClientInformation.desknum[i];
ClientInformation.desknum[i] = ClientInformation.desknum[ClientInformation.num - 1];
ClientInformation.desknum[ClientInformation.num - 1] = Temp;
Temp = ClientInformation.name[i];
ClientInformation.name[i] = ClientInformation.name[ClientInformation.num - 1];
ClientInformation.name[ClientInformation.num - 1] = Temp;
Temp = ClientInformation.headicon[i];
ClientInformation.headicon[i] = ClientInformation.headicon[ClientInformation.num-1];
ClientInformation.headicon[ClientInformation.num - 1] = Temp;
ClientInformation.num--;
break;
}
}
for(Object o:doses)
{
dos = (DataOutputStream)o;
try{
dos.writeUTF("exit");
dos.writeUTF(desknum);
}catch(Exception e){
e.printStackTrace();
}
}
}
transimitMessage(name+"退出大厅","服务器信息 ");
break;
}
else if(info.equals("sit"))
{
String OutPutString;
desknum = dis.readUTF();
iconstring = dis.readUTF();
int DeskNum = Integer.parseInt(desknum);
if(DeskNum <= 10)
{
OutPutString = String.valueOf(DeskNum);
desknum2 = String.valueOf(DeskNum + 10);
}
else
{
OutPutString = String.valueOf(DeskNum - 10);
desknum2 = OutPutString;
}
transimitMessage_sit(name+"进入"+OutPutString+"号桌子","服务器信息 ");
}
else if(info.equals("move"))
{
name2 = dis.readUTF();
int H_YS =dis.readInt();
int H_XS = dis.readInt();
int B_YS = dis.readInt();
int B_XS = dis.readInt();
boolean Rule = dis.readBoolean();
transimitMessageMove(H_YS, H_XS, B_YS, B_XS, Rule);
}
else if(info.equals("Chat"))
{
name2 = dis.readUTF();
String Chat = dis.readUTF();
dos2 = userList.get(name2);
try
{
dos2.writeUTF("Chat");
dos2.writeUTF(Chat);
}
catch(Exception e)
{
e.printStackTrace();
}
}
else if(info.equals("Start"))
{
name2 = dis.readUTF();
dos2 = userList.get(name2);
try
{
dos2.writeUTF("Start");
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void transimitMessage(String msg,String SeverInf)
{
Collection doses = userList.values();
DataOutputStream dos;
for(Object o:doses)
{
dos = (DataOutputStream)o;
try
{
dos.writeUTF(SeverInf+":"+msg);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
public void transimitMessage_sit(String msg,String SeverInf)
{
try
{
Collection doses = userList.values();
DataOutputStream Dos;
int ZNum = ClientInformation.num;
int DeskNum = Integer.parseInt(desknum);
boolean Otherplayer = false;
boolean JudgeDN = true;
for(int i = 0; i < ZNum; ++i)
{
if(desknum.equals(ClientInformation.desknum[i]))
{
JudgeDN = false;
break;
}
else if(desknum2.equals(ClientInformation.desknum[i]))
{
Otherplayer = true;
name2 = ClientInformation.name[i];
iconstring2 = ClientInformation.headicon[i];
dos2 = userList.get(name2);
}
}
if(JudgeDN)
{
if(Otherplayer)
{
if(judue != true && name != name2)
{
try
{
dos.writeUTF("play");
dos.writeUTF(name2);
dos.writeUTF(iconstring2);
dos2.writeUTF("play");
dos2.writeUTF(name);
dos2.writeUTF(iconstring);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
for(Object o:doses)
{
Dos = (DataOutputStream)o;
try
{
Dos.writeUTF(SeverInf+": "+msg);
Dos.writeUTF(info);
String Numstring = desknum;
Dos.writeUTF(Numstring);
Dos.writeUTF(name);
Dos.writeUTF(iconstring);
}
catch(Exception e)
{
e.printStackTrace();
}
}
if(judue == true)
{
for(int i = 0; i < ZNum; ++i)
{
if(name == ClientInformation.name[i])
{
ClientInformation.desknum[i] = desknum;
ClientInformation.name[i] = name;
ClientInformation.headicon[i] = iconstring;
}
}
}
else
{
ClientInformation.desknum[ClientInformation.num] = desknum;
ClientInformation.name[ClientInformation.num] = name;
ClientInformation.headicon[ClientInformation.num] = iconstring;
ClientInformation.num++;
judue = true;
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void transimitMessageMove(int H_YS, int H_XS, int B_YS, int B_XS, boolean Rule)
{
dos2 = userList.get(name2);
try
{
dos2.writeUTF("Move");
dos2.writeInt(H_YS);
dos2.writeInt(H_XS);
dos2.writeInt(B_YS);
dos2.writeInt(B_XS);
dos2.writeBoolean(Rule);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
?