聊天室服务器端软件源代码
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.*;
class ServerThread extends Thread
{
int sPort;
ServerSocket sSocket;
ServerFrame frame;
TextArea sStatus;
Vector Client;
Vector messages;
BroadCast BroadCastWriter;
CleanDeadConnect Cleaner;
public ServerThread(ServerFrame f)
{
Client=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("服务器已启动端口6633/n");
sStatus.append("<<<<<<<<<<<<等待连机>>>>>>>>>>");
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()+"已连机 /n");
sStatus.append("目前连机人数:"+ClientThread.ConnectNumber+"/n");
synchronized(Client)
{
Client.addElement(cThread);
}
}catch(IOException e)
{
System.out.println("服务器发生故障:"+e.toString());
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("建立IO通道失败 ");
System.exit(3);
}
m="新伙伴"+getClientName()+"加入了!/n";
m=m+"当前在线人数为:"+ConnectNumber+"/n/n";
}
public String getClientName()
{
return cSocket.getInetAddress().getHostName();
}
public String getClientAddress()
{
return cSocket.getInetAddress().getHostAddress();
}
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.Client)
{
sThread.Client.removeElement(this);
}
break;
}
else
{
Message=Message+""+getClientName()+":"+getClientAddress()+"/n";
Message=Message+"/n";
sThread.messages.addElement(Message);
}
}
}
}catch(IOException e)
{
break;
}
}
}
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.Client)
{
for(int i=0;i<sThread.Client.size();i++)
{
c=(ClientThread)sThread.Client.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(1000);
}catch(InterruptedException e)
{}
synchronized(sThread.Client)
{
for(int i=0;i<sThread.Client.size();i++)
{
temp=(ClientThread)sThread.Client.elementAt(i);
if(!temp.isAlive())
{
ClientThread.ConnectNumber--;
m=temp.getClientAddress()+":"+temp.getClientName();
m=m+"已离开 当前在线人数 "+ClientThread.ConnectNumber+"/n";
sThread.frame.ServerStatus.append(m);
synchronized(sThread.messages)
{
sThread.messages.addElement(m);
}
sThread.Client.removeElementAt(i);
}
}
}
}
}
}
public class ServerFrame extends Frame implements ActionListener
{
int ScreenWidth,ScreenHeight;
Button CloseServer;
TextArea ServerStatus;
ServerThread sThread;
public ServerFrame()
{
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);
this.setResizable(false);
this.setVisible(true);
this.setTitle("聊天服务器");
sThread=new ServerThread(this);
sThread.start();
}
public static void main(String args[])
{
new ServerFrame();
}
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
}