//Java网络聊天服务器 import java.io.*; import java.awt.*; import java.net.*; import java.util.*; import java.awt.event.*; public class ServerFrame extends Frame implements ActionListener{ int ScreenWidth,ScreenHeight; Button CloseServer; TextArea ServerStatus; ServerThread sThread; public ServerFrame(){ super("游戏服务器"); ServerStatus = new TextArea(); CloseServer = new Button("关闭服务器"); ServerStatus.setEditable(false); CloseServer.addActionListener(this); add(ServerStatus,BorderLayout.CENTER); add(CloseServer,BorderLayout.SOUTH); ScreenWidth = getToolkit().getScreenSize().width; ScreenHeight = getToolkit().getScreenSize().height; setSize(ScreenWidth/2,ScreenHeight /2); setLocation((ScreenWidth - getWidth())/2, (ScreenHeight - getHeight())/2); setResizable(false); setVisible(true); sThread = new ServerThread(this); sThread.start(); } public static void main(String[] args){ new ServerFrame(); } public void actionPerformed(ActionEvent e){ dispose(); System.exit(0); } } class ServerThread extends Thread{ int sPort; ServerSocket sSocket; ServerFrame frame; TextArea sStatus; Vector Clients; Vector messages; BroadCast BroadCastWriter; CleanDeadConnect Cleaner; public ServerThread(ServerFrame f){ Clients = new Vector(); messages = new Vector(); try{ sPort = 6633; sSocket = new ServerSocket(sPort); }catch(IOException E){ System.out.println("发生异常: "+E); System.out.println("无法建立服务器接口!!"); System.exit(1); } this.frame = f; sStatus = frame.ServerStatus; sStatus.append("游戏服务器已启动../n/n"); sStatus.append(">>>>>等待联机<<<<</n/n"); BroadCastWriter = new BroadCast(this); BroadCastWriter.start(); Cleaner = new CleanDeadConnect(this); Cleaner.start(); } public void run(){ while(true){ try{ Socket cSocket = sSocket.accept(); ClientThread cThread = new ClientThread(cSocket,this); cThread.start(); sStatus.append(cThread.getClientName() + ":"); sStatus.append(cThread.getClientAddress() + "已联机"); sStatus.append("目前联机数" + ClientThread.ConnectNumber +"/n"); synchronized(Clients){ Clients.addElement(cThread); } }catch(IOException E){ System.out.println("发生异常:" + E); System.out.println("建立客户端联机失败!"); System.exit(2); } } } public void finalize(){ try{ sSocket.close(); }catch(IOException E){} sSocket = null; } } class ClientThread extends Thread{ Socket cSocket; PrintStream write; BufferedReader read; ServerThread sThread; TextArea sStatus; String m; public static int ConnectNumber = 0; public ClientThread(Socket cSocket,ServerThread sThread){ this.cSocket = cSocket; this.sThread = sThread; sStatus = sThread.frame.ServerStatus; ConnectNumber++; try{ write = new PrintStream(cSocket.getOutputStream()); read = new BufferedReader( new InputStreamReader(cSocket.getInputStream())); }catch(IOException E){ System.out.println("发生异常:"+ E); System.out.println("建立I/O通道失败!"); System.exit(3); } m = "新伙伴<" + getClientName() + ">加入咯!!!"; m = m + "聊天人数:" + ConnectNumber + "/n/n"; sThread.messages.addElement(m); } public void run(){ while(true){ try{ String Message = read.readLine(); synchronized(sThread.messages){ if(Message != null){ if(Message.equals("bye")){ ConnectNumber--; Message = getClientName() + ":" + getClientAddress() + "已离开"; sStatus.append(Message + " "); sStatus.append("目前联机数:" + ConnectNumber + "/n"); sThread.messages.addElement(Message); synchronized(sThread.Clients){ sThread.Clients.removeElement(this); } break; }else{ Message = "来自" + getClientName() + ":" + getClientAddress() + "/n=>" + Message + "/n"; sThread.messages.addElement(Message); } } } }catch(IOException e){ break; } } } public String getClientName(){ return cSocket.getInetAddress().getHostName(); } public String getClientAddress(){ return cSocket.getInetAddress().getHostAddress(); } public void finalize(){ try{ read.close(); write.close(); cSocket.close(); }catch(IOException E){ } cSocket = null; } } class BroadCast extends Thread{ ClientThread c; ServerThread sThread; String m; public BroadCast(ServerThread sThread){ this.sThread = sThread; } public void run(){ while(true){ try{ Thread.sleep(3000); }catch(InterruptedException E){} synchronized(sThread.messages){ if(sThread.messages.isEmpty()) continue; m = (String)sThread.messages.firstElement(); sThread.messages.removeElement(m); } synchronized(sThread.Clients){ for(int i=0;i<sThread.Clients.size();i++){ c = (ClientThread)sThread.Clients.elementAt(i); c.write.println(m); } } } } } class CleanDeadConnect extends Thread{ ServerThread sThread; ClientThread temp; String m; public CleanDeadConnect(ServerThread sThread){ this.sThread = sThread; } public void run(){ while(true){ try{ Thread.sleep(10000); }catch(InterruptedException E){} synchronized(sThread.Clients){ for(int i=0;i<sThread.Clients.size();i++){ temp = (ClientThread)sThread.Clients.elementAt(i); if(!temp.isAlive()){ ClientThread.ConnectNumber--; m = temp.getClientName() + ":" + temp.getClientAddress(); m = m + "已离开目前联机数:" + ClientThread.ConnectNumber + "/n"; sThread.frame.ServerStatus.append(m); synchronized(sThread.messages){ sThread.messages.addElement(m); } sThread.Clients.removeElementAt(i); } } } } } }