聊天室服务器端软件源代码

聊天室服务器端软件源代码

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);
 }
}               

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值