ChatServer.java

原创 2007年10月05日 22:47:00
package chatroom;
import java.io.*;
import java.net.*;
import java.util.*;
//服务器端主类
public class ChatServer {
 public static void main (String args[]){
  //与服务器端相关的变量申明
  ServerSocket server=null;
  Socket clinent=null;
  Hashtable peopleList =new Hashtable();
  //循环监听来自客户端的请求
  while(true){
   //初始化服务器套接字,并指定了端口号
   try{
    server=new ServerSocket(6666);
   }catch(IOException e){
    System.out.println("正在监听");
   }
   //取得一个客户端套接字的连接,并向控制台输出用户的IP
   try{
    clinent =server.accept();
    InetAddress address=clinent.getInetAddress();
    System.out.println("用户的IP:"+address);
   }catch(IOException e){
   }
   //如果取得一个客户端套接字的连接,就为该客户端专门开一个线程
   if(clinent!=null){
    Server_thread peopleThread=new Server_thread(clinent,peopleList);
    peopleThread.start();
   }
   else
    continue;
  }
 }
}
//服务器端为每个客户端开的线程类
class Server_thread extends Thread{
 //成员变量的申明
 String name=null,sex=null;
 Socket socket=null;
 File file=null;
 DataOutputStream out=null;
 DataInputStream in=null;
 Hashtable peopleList=null;
 //构造方法
 Server_thread(Socket t,Hashtable list){
  peopleList=list;
  socket=t;
  try{
   in=new DataInputStream(socket.getInputStream());
   out=new DataOutputStream(socket.getOutputStream());
  }catch(IOException e){}
 }
 //当线程开始执行的时候会自动调用run()
 public void run(){
  //循环监听来自客户端的信息
  while(true){
   String s=null;
   try{
    s=in.readUTF();//等待客户端发来的信息(阻塞本线程,直到收到消息)
    if(s.startsWith("昵称:")){//如果用户提交了登录信息
     name=s.substring(s.indexOf(":")+1,s.indexOf("性"));//截取用户信息中的昵称
     sex=s.substring(s.lastIndexOf(":"));//截取性别
     boolean boo=peopleList.containsKey(name);//检查用户已经登录
     //如果用户还没有登录
     if(boo==false){
      peopleList.put(name, this);//把当前线程加到散列表中去
      out.writeUTF("可以聊天:");//响应客户端
      Enumeration e=peopleList.elements();//获得所有的服务器端线程
      while(e.hasMoreElements()){
       Server_thread th=(Server_thread)e.nextElement();
       th.out.writeUTF("聊天者:"+name+"性别"+sex);//将登录者的基本信息通知所有在线用户,增加用户列表
       if(th!=this)
        out.writeUTF("聊天者:"+th.name+"性别"+th.sex);//将其他在线用户的信息发给当前客户端,以增加用户列表
      }
     }else{
      //不能以相同的昵称登录
      out.writeUTF("不可以聊天:");
     }
    //通知所有客户端公共聊天内容改变
    }else if(s.startsWith("公共聊天内容:")){
     System.out.print("hahahaha4");
     String msg=s.substring(s.indexOf(":")+1);
     Enumeration e=peopleList.elements();//获得所有的服务器端线程
     while(e.hasMoreElements()){
      Server_thread th=(Server_thread)e.nextElement();
      th.out.writeUTF("公共聊天内容:"+msg);
     }
                //通知所有客户端有用户离开
    }else if(s.startsWith("用户离开:")){
     Enumeration e=peopleList.elements();//获得所有的服务器端线程
     while(e.hasMoreElements()){
      try{
       Server_thread th=(Server_thread)e.nextElement();
       if(th!=this&&th.isAlive()){
        th.out.writeUTF("用户离线"+name);
       }
      }catch(IOException ee){}
     }
     peopleList.remove(name);
     socket.close();
     System.out.println(name+"客户离开了");
     break;
    //得到私聊内容并转发给私聊对象 
    }else if(s.startsWith("私人聊天内容:")){
     String msg=s.substring(s.indexOf(":")+1,s.indexOf("#"));
     String toPeople=s.substring(s.indexOf("#")+1);
     Server_thread toThread=(Server_thread)peopleList.get(toPeople);
     if(toThread!=null){
      toThread.out.writeUTF("私人聊天内容:"+msg);
     }else{
      out.writeUTF("私人聊天内容:"+toPeople+"已经离线");
     }
    }
   }catch(IOException eee){
    Enumeration e=peopleList.elements();//获得所有的服务器端线程
    while(e.hasMoreElements()){
     try{
      Server_thread th=(Server_thread)e.nextElement();
      if(th!=this&&th.isAlive()){
       th.out.writeUTF("用户离线"+name);
      }
     }catch(IOException ee){}
    }
    peopleList.remove(name);
    try{
     socket.close();
    }catch(IOException eeee){}
    System.out.println(name+"客户离开了1");
    break;
   }
  }
 }

相关文章推荐

网络聊天室chatserver.java

  • 2008年11月27日 22:45
  • 26KB
  • 下载

ChatServer(21)

/** *Title:ChatServer *Description:1、这里的改进方法是将接收端和数据端分开。从而避免了当一个客户端连上以后,因为已经用过accept(),          ...

聊天系统ChatServer

import java.io.*;import java.net.*;import java.util.*; public class ChatServer {boolean started = fa...

ChatServer

  • 2007年10月28日 11:02
  • 120KB
  • 下载

Java 三层架构ssh

简单的说: struts 控制用的 hibernate 操作数据库的 spring 用解耦的 详细的说: STRUTS 在 SSH 框架中起控制的作用 , 其核心是 Co...

网络聊天 chatClient 、chatServer

  • 2012年05月28日 13:29
  • 12.8MB
  • 下载

chatserver andchatcliet

  • 2009年03月25日 13:21
  • 218KB
  • 下载

基于java的坦克大战实例

原创性声明 此博文的出处 为 http://blog.csdn.net/zhujunxxxxx/article/details/39251241如果进行转载请注明出处。本文作者原创,邮箱zhujun...

ChatServer

  • 2012年12月08日 09:48
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ChatServer.java
举报原因:
原因补充:

(最多只允许输入30个字)