局域网聊天室 -ChatServer
生活随笔
收集整理的這篇文章主要介紹了
局域网聊天室 -ChatServer
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
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;
/**
* 服務(wù)器類, 無限循環(huán)等待客戶端的連接, 并創(chuàng)建線程響應(yīng)客戶端
* @author 劉優(yōu)
*
*/
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(可以根據(jù)用戶名直接定位到writer)
??? private static HashMap<Socket,String> socketClientMap;??????????? // SOCKET,客戶MAP
??? private static Vector<String []> blackUsers;????????????????????????? ?// 用戶黑名單對(duì)應(yīng)關(guān)系 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;??????????????????????????????????????????????????? // 服務(wù)器運(yùn)行標(biāo)志
??? private boolean started;??????????????????????????????????????????????????????????????? // 服務(wù)器啟動(dòng)標(biāo)志
??? public ChatServer(int port) throws IOException {
??????? this.port = port;
??????? started = false;??????????????????????????????????????????? // 運(yùn)行標(biāo)志
??? }
??? /**
???? * 修改服務(wù)器端口號(hào), 會(huì)導(dǎo)致服務(wù)重起
???? * @param port
???? */
??? public void setPort(int port) {
??????? this.port = port;
??????? if (started) {
??????????? stop();
??????? }
??????? try {
??????????? start();??????????????????????????????????????????????? // 啟動(dòng)服務(wù)器
??????? } catch (IOException e) {
??????????? e.printStackTrace();
??????? }
??? }
??? /**
???? * 初始化服務(wù)器
???? *
???? */
??? 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>();
??? }
??? /**
???? * 啟動(dòng)服務(wù)器線程
???? * @throws IOException
???? */
??? public void start() throws IOException {
??????? init();
??????? Thread serverThread = new Thread(this);??????????????????? // 新建一個(gè)線程來運(yùn)行服務(wù)器
??????? serverThread.start();
??????? started = true;
??? }
??? /**
???? * 重起服務(wù)器
???? * @throws IOException
???? */
??? public void restart() throws IOException {
??????? if (started) {
??????????? stop();??????????????????????????????????????????????? // 如果已經(jīng)啟動(dòng), 則關(guān)閉后再重起
??????? }
??????? start();
??? }
??? /**
???? * 停止服務(wù)器, 清空所有集合
???? *
???? */
??? 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;
??? }
??? /**
???? * 啟動(dòng)服務(wù)器RUN方法
???? */
??? public void run() {
??????? try {
??????????? server = new ServerSocket(port);??????????????????????? // 創(chuàng)建SERVERSOCKET 服務(wù)器主對(duì)象
??????? } 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();??????????????????????????? // 監(jiān)聽客戶端連接請(qǐng)求
??????????????? clients.add(socket);
??????????????? System.out.println("client : " + socket.getInetAddress() + " attempt to enter the chat room"); // 打印客房信息...
??????????????? // 啟動(dòng)一個(gè)服務(wù)器端應(yīng)答線程響應(yīng)客戶端. 并把服務(wù)器的各種集合共享,使之能訪問其他線程
??????????????? ServerResponseThread response = new ServerResponseThread(socket,clientWriterMap,socketClientMap,blackUsers,clientTypeMap,threadMap);
??????????????? allThreads.add(response);
??????????????? response.setAllClientsThreadVector(allThreads);
??????????????? response.setClientSocketVector(clients);
??????????????? response.start();??????????????????????????????????? // 啟動(dòng)響應(yīng)線程
??????????? }
??????????? catch (SocketException ee) {
??????????????? System.out.println("server is down");??????????????? // 關(guān)閉服務(wù)器的提示
??????????? }
??????????? 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!");
??????? }
??? }
}
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;
/**
* 服務(wù)器類, 無限循環(huán)等待客戶端的連接, 并創(chuàng)建線程響應(yīng)客戶端
* @author 劉優(yōu)
*
*/
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(可以根據(jù)用戶名直接定位到writer)
??? private static HashMap<Socket,String> socketClientMap;??????????? // SOCKET,客戶MAP
??? private static Vector<String []> blackUsers;????????????????????????? ?// 用戶黑名單對(duì)應(yīng)關(guān)系 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;??????????????????????????????????????????????????? // 服務(wù)器運(yùn)行標(biāo)志
??? private boolean started;??????????????????????????????????????????????????????????????? // 服務(wù)器啟動(dòng)標(biāo)志
??? public ChatServer(int port) throws IOException {
??????? this.port = port;
??????? started = false;??????????????????????????????????????????? // 運(yùn)行標(biāo)志
??? }
??? /**
???? * 修改服務(wù)器端口號(hào), 會(huì)導(dǎo)致服務(wù)重起
???? * @param port
???? */
??? public void setPort(int port) {
??????? this.port = port;
??????? if (started) {
??????????? stop();
??????? }
??????? try {
??????????? start();??????????????????????????????????????????????? // 啟動(dòng)服務(wù)器
??????? } catch (IOException e) {
??????????? e.printStackTrace();
??????? }
??? }
??? /**
???? * 初始化服務(wù)器
???? *
???? */
??? 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>();
??? }
??? /**
???? * 啟動(dòng)服務(wù)器線程
???? * @throws IOException
???? */
??? public void start() throws IOException {
??????? init();
??????? Thread serverThread = new Thread(this);??????????????????? // 新建一個(gè)線程來運(yùn)行服務(wù)器
??????? serverThread.start();
??????? started = true;
??? }
??? /**
???? * 重起服務(wù)器
???? * @throws IOException
???? */
??? public void restart() throws IOException {
??????? if (started) {
??????????? stop();??????????????????????????????????????????????? // 如果已經(jīng)啟動(dòng), 則關(guān)閉后再重起
??????? }
??????? start();
??? }
??? /**
???? * 停止服務(wù)器, 清空所有集合
???? *
???? */
??? 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;
??? }
??? /**
???? * 啟動(dòng)服務(wù)器RUN方法
???? */
??? public void run() {
??????? try {
??????????? server = new ServerSocket(port);??????????????????????? // 創(chuàng)建SERVERSOCKET 服務(wù)器主對(duì)象
??????? } 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();??????????????????????????? // 監(jiān)聽客戶端連接請(qǐng)求
??????????????? clients.add(socket);
??????????????? System.out.println("client : " + socket.getInetAddress() + " attempt to enter the chat room"); // 打印客房信息...
??????????????? // 啟動(dòng)一個(gè)服務(wù)器端應(yīng)答線程響應(yīng)客戶端. 并把服務(wù)器的各種集合共享,使之能訪問其他線程
??????????????? ServerResponseThread response = new ServerResponseThread(socket,clientWriterMap,socketClientMap,blackUsers,clientTypeMap,threadMap);
??????????????? allThreads.add(response);
??????????????? response.setAllClientsThreadVector(allThreads);
??????????????? response.setClientSocketVector(clients);
??????????????? response.start();??????????????????????????????????? // 啟動(dòng)響應(yīng)線程
??????????? }
??????????? catch (SocketException ee) {
??????????????? System.out.println("server is down");??????????????? // 關(guān)閉服務(wù)器的提示
??????????? }
??????????? 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!");
??????? }
??? }
}
轉(zhuǎn)載于:https://www.cnblogs.com/pauliuyou/archive/2008/07/10/1239927.html
總結(jié)
以上是生活随笔為你收集整理的局域网聊天室 -ChatServer的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Silverlight, B/S or
- 下一篇: Gridview行随鼠标变色