JAVA制作聊天室(服务器)

JAVA制作聊天室(服务器)
最近一个朋友的女儿,由于考试题目是这个(2006年1月的题目),让帮忙做个聊天室,写完后,看看代码中有线程,套接字等技术,整理下,给有需要的朋友!

 

/*服务器主程序(myServer.java)*/
package itbaby.jchat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;


public class myServer
{
  static ArrayList clients = new ArrayList();
  static ArrayList onlineUser = new ArrayList();
  static ArrayList onlineIP = new ArrayList();
  public myServer()
  {
  }

  public static void cleanupListenList()
    {
 /*
 检查当前在线的用户数,在线程中被调用
 */
        for (int i = clients.size()-1; i > -1; i--){
            myServerThread client = (myServerThread) clients.get(i);
            if ( ! client.isAlive() )
            {
                String sBye = "再见 " + (String)onlineUser.get(i);
                client.kill();
                clients.remove(i); //移除一个断开的线程
                onlineUser.remove(i);
                onlineIP.remove(i);
                myServerThread.SendToAllUser();//更新在线用户
                myServerThread.SendToAll(sBye);//显示再见消息
                System.out.println("连接断开...");
            }
        }


    }

    public static  void main( String argv[] ) throws IOException
    {
      ServerSocket listener = new ServerSocket(2005);
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      PrintWriter out = new PrintWriter(System.out,true);

      System.out.println("Running...");
      System.out.println("Port:2005");
      myUserRefresh myURef = new myUserRefresh();
      myURef.start();

      while (true)
      {
        Socket client = listener.accept();//等待客户端连接
        myServerThread myClientThread = new myServerThread(client); //有连接进入,开始执行一个线程
        myClientThread.start();
        myServer.clients.add(myClientThread);    //记录有效的线程
        myServer.cleanupListenList();
      }

    }

}

 

 


/*聊天的线程处理程序(myServerThread.java)*/
package itbaby.jchat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.*;


public class myServerThread extends Thread
{
  private Socket Client;
  boolean stillRunning = true;
  public PrintWriter pout;

  public myServerThread(Socket _client)
  {
    Client = _client;
  }

  public void kill()
  {
    stillRunning = false;
  }

  public static void SendToAll(String sMsg)//公聊
  {
    for(int i=0;i<myServer.clients.size();i++)
    {
      myServerThread th = (myServerThread)myServer.clients.get(i);
      th.pout.println(sMsg + " ("+ th.getTime() +")");
    }
  }

  public void SendToPrivate(String sPrivateUser,String sMsg)//私聊
  {
    for(int i=0;i<myServer.clients.size();i++)
    {
      String sIP = (String)myServer.onlineIP.get(i);
      String sUs = (String)myServer.onlineUser.get(i);
      String sUser = sUs + "("+sIP+")";
      if(sPrivateUser.trim().equals(sUser.trim()))
      {
        myServerThread th = (myServerThread)myServer.clients.get(i);
        th.pout.println("PrivateMessage:" +sMsg + " ("+ th.getTime() +")");
        break;
      }
    }

  }


  public static void SendToAllUser()//所有在线用户列表数据
  {
    String sUser = "";
    int iCount = myServer.clients.size();
    for(int i=0;i<iCount;i++)
    {
      String sIP = (String)myServer.onlineIP.get(i);
      String sUs = (String)myServer.onlineUser.get(i);
      sUser = sUser + sUs + "(" + sIP + ")|";
    }

    for(int i=0;i<iCount;i++)
    {
      myServerThread th = (myServerThread)myServer.clients.get(i);
      th.pout.println("cmd:userlist"+sUser);
    }

  }

 

  public String getTime()
  {
    //String sTime = "";
    java.text.DateFormat format1 = new java.text.SimpleDateFormat("hh:mm:ss");
    java.util.Date currentTime_2 = new java.util.Date();
    String sTime=format1.format(currentTime_2);

    return sTime;
  }


  public String getClientIP()
  {
    return (Client.getInetAddress()).toString();
  }

  public void run()
  {
    try
    {
      //(Client.getInetAddress()).toString() );
      InputStream in =  Client.getInputStream();
      InputStreamReader textIn = new InputStreamReader(in);
      BufferedReader textLineIn = new BufferedReader(textIn);
      OutputStream out = Client.getOutputStream();
      pout = new PrintWriter(out,true);


      while(stillRunning)
      {

          String someText = textLineIn.readLine();
          if (someText.length() != 0)
          {
            if (someText.indexOf("cmd:welcome") != -1)
     { //欢迎消息
              String sUser = someText.substring(11, someText.length());
              this.SendToAll("Welcome " + sUser + " from " + this.getClientIP());

              myServer.onlineIP.add(this.getClientIP());
              myServer.onlineUser.add(sUser);

              //发送用户列表数据
              myServerThread.SendToAllUser();
            }
            else if (someText.indexOf("sendto:") != -1)
            { //私聊
              String sUser = someText.substring(7, someText.indexOf(")") + 1);
              someText = someText.substring(someText.indexOf(")") + 1,
                                            someText.length());
              pout.println("PrivateMessage:" + someText + " (" + this.getTime() + ")"); //自己发送的,自己回显聊天语句
              this.SendToPrivate(sUser, someText); //接受人,显示聊天语句
            }
            else myServerThread.SendToAll(someText); //发送公共聊天消息

          }
        }

    }
    catch (IOException e)
    {
      System.out.println( "I/O Error They probably left " + e);
    }

  }

}

 

 


/*刷新用户*/
package itbaby.jchat;


public class myUserRefresh extends Thread
{
  public myUserRefresh() {
  }

  public void run()
  {
    while(true)
    {
      myServer.cleanupListenList();
    }
  }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值