数据结构和算法, 我还没明白

永远的C

博客园 首页 新随笔 联系 订阅 管理
package com.chat.server;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.HashMap;
import java.util.Vector;


/**
* 服务器类, 无限循环等待客户端的连接, 并创建线程响应客户端
*
@author 刘优
*
*/
public class ChatServer implements Runnable {

   
private ServerSocket server;                                              // serversocket
    private int port;                                                                // 端口
    private static Vector<Socket> clients;                                 // 客户端socket集合
    private static HashMap<String,PrintWriter> clientWriterMap;        // 客户,字符流输出流MAP(可以根据用户名直接定位到writer)
    private static HashMap<Socket,String> socketClientMap;            // SOCKET,客户MAP
    private static Vector<String []> blackUsers;                           // 用户黑名单对应关系 String[1] 是 String[0]的黑名单中的用户
    private static HashMap<String,Boolean> clientTypeMap;            // 客户,客户端类型MAP 客户端的类型有Window和telnet用户
    private static Vector<ServerResponseThread> allThreads;            // 所有的线程集合
    private static HashMap<String,ServerResponseThread> threadMap;  // 用户名,线程Map
    private boolean serverRunning;                                                    // 服务器运行标志
    private boolean started;                                                                // 服务器启动标志

   
public ChatServer(int port) throws IOException {
       
this.port = port;
        started
= false;                                            // 运行标志
    }

   
/**
     * 修改服务器端口号, 会导致服务重起
     *
@param port
    
*/
   
public void setPort(int port) {
       
this.port = port;
       
if (started) {
            stop();
        }
       
try {
            start();                                               
// 启动服务器
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

   
/**
     * 初始化服务器
     *
    
*/
   
private void init() {
        clients
= new Vector<Socket>();
        clientWriterMap
= new HashMap<String,PrintWriter>();
        socketClientMap
= new HashMap<Socket,String>();
        blackUsers
= new Vector<String []>();
        clientTypeMap
= new HashMap<String,Boolean>();
        serverRunning
= true;
        allThreads
= new Vector<ServerResponseThread>();
        threadMap
= new HashMap<String,ServerResponseThread>();
    }

   
/**
     * 启动服务器线程
     *
@throws IOException
    
*/
   
public void start() throws IOException {
        init();
        Thread serverThread
= new Thread(this);                    // 新建一个线程来运行服务器
        serverThread.start();
        started
= true;
    }
   
/**
     * 重起服务器
     *
@throws IOException
    
*/
   
public void restart() throws IOException {
       
if (started) {
            stop();                                               
// 如果已经启动, 则关闭后再重起
        }
        start();
    }

   
/**
     * 停止服务器, 清空所有集合
     *
    
*/
   
public void stop() {
        serverRunning
= false;
       
if (allThreads != null) {
           
for (int i = 0; i < allThreads.size(); ++i) {
                allThreads.get(i).stopService();
            }
            allThreads.clear();
            allThreads
= null;
        }
       
if (server != null) {
           
try {
                server.close();
            }
catch (IOException e) {
                e.printStackTrace();
            }
        }
       
if (clients != null) {
            clients.clear();
            clients
= null;
        }
       
if (clientWriterMap != null) {
            clientWriterMap.clear();
            clientWriterMap
= null;
        }
       
if (socketClientMap != null) {
            socketClientMap.clear();
            socketClientMap
= null;
        }
       
if (blackUsers != null) {
            blackUsers.clear();
            blackUsers
= null;
        }
       
if (clientTypeMap != null) {
            clientTypeMap.clear();
            clientTypeMap
= null;
        }
        started
= false;
    }

   
/**
     * 启动服务器RUN方法
    
*/
   
public void run() {
       
try {
            server
= new ServerSocket(port);                        // 创建SERVERSOCKET 服务器主对象
        } catch (IOException e) {
            e.printStackTrace();
        }
       
while (serverRunning) {
            System.out.println(
"server is running at port : " + port);
            Socket socket;
           
try {
               
if (server == null) {
                    System.out.println(
"server is null");
                   
break;
                }
                socket
= server.accept();                            // 监听客户端连接请求
                clients.add(socket);
                System.out.println(
"client : " + socket.getInetAddress() + " attempt to enter the chat room"); // 打印客房信息...
               
// 启动一个服务器端应答线程响应客户端. 并把服务器的各种集合共享,使之能访问其他线程
                ServerResponseThread response = new ServerResponseThread(socket,clientWriterMap,socketClientMap,blackUsers,clientTypeMap,threadMap);
                allThreads.add(response);
                response.setAllClientsThreadVector(allThreads);
                response.setClientSocketVector(clients);
                response.start();                                   
// 启动响应线程
            }
           
catch (SocketException ee) {
                System.out.println(
"server is down");                // 关闭服务器的提示
            }
           
catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

   
public void kickOff(String user) {
        ServerResponseThread thread
= threadMap.get(user);
       
//System.out.println("thread " + thread);
        if (thread != null) {
            thread.kickOff();
            System.out.println(
"user " + user + " has been kicked...");
        }
       
else {
            System.out.println(
"user " + user + " not on line!");
        }
    }
}
posted on 2008-07-10 13:03  Pauliuyou  阅读(349)  评论(0编辑  收藏  举报