⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simplemultichatserver.java

📁 在一個多人連線伺服器中
💻 JAVA
字号:
package onlyfun.caterpillar.simplenet.multichat;

import java.io.*;
import java.net.ServerSocket;
import java.util.*;

public class SimpleMultiChatServer {
	private ServerSocket serverSocket;
    private List clientList;
    
    public SimpleMultiChatServer(int serverPort) throws IOException {
    	serverSocket = new ServerSocket(serverPort);
    	clientList = new ArrayList();
    	log("multi chat server start up....");
    }
    
    // Wait for next client.
    // If there's one, add it to the client list and start a subServer thread for it.
    public void waitForNextClient() throws IOException {
    	SimpleMultiChatSubServer subServer = 
    		new SimpleMultiChatSubServer(serverSocket.accept(), this);
    	addSubServer(subServer);
    	Thread thread = new Thread(subServer);
    	thread.setDaemon(true);
    	thread.start();
    }
        
    public void removeDeadConnections() {
    	Iterator iterator = clientList.iterator();
    	List deadConnections = new ArrayList();
    	SimpleMultiChatSubServer subServer;
    	
    	while(iterator.hasNext()) {
    		subServer = (SimpleMultiChatSubServer) iterator.next();
    		if(subServer.isClosed())
    			deadConnections.add(subServer);
    	}
    	
    	removeSubServers(deadConnections);
    }

    public Iterator getClientList() {
    	removeDeadConnections();
    	return clientList.iterator();
    }
    
    // Remove the client According to the client number
    public void removeClientAccordingTo(int number) {
    	SimpleMultiChatSubServer subServer = (SimpleMultiChatSubServer) clientList.get(number);
    	shutdownSubServer(subServer);
    	clientList.remove(number);
    	log(subServer.getName() + ": removed");
    }
    
    // Broadcast
    public void broadCastToClient(String message) {
    	Iterator iterator = clientList.iterator();
    	SimpleMultiChatSubServer subServer;
    	while(iterator.hasNext()) {
    		subServer = (SimpleMultiChatSubServer) iterator.next();
    	    subServer.sendMessageToClient(message);
    	}
    	log(message);
    }
    
    // Shutdown all subServers first.
    // Then shutdown the multi chat server.
    public void shutdown() {
    	Iterator iterator = clientList.iterator();
    	SimpleMultiChatSubServer subServer;
    	while(iterator.hasNext()) {
    		subServer = (SimpleMultiChatSubServer) iterator.next();
    		shutdownSubServer(subServer);
    	}
    	
    	removeSubServers(clientList);
    	
    	try {
            serverSocket.close();
    	}
    	catch(IOException e) {
    		log("server shutdown: " + e);
    	}  
    	
    	log("multi chat server shutdown ok...");
    }
    
    public Object log(Object o) {
    	System.out.println(o);
    	return null;
    }
    
    private void addSubServer(SimpleMultiChatSubServer subServer) {
    	clientList.add(subServer);
    	log(subServer.getName() + ": added");
    }
    
    private void removeSubServers(List subServers) {
    	Iterator iterator = subServers.iterator();
    	SimpleMultiChatSubServer subServer;
    	while(iterator.hasNext()) {
    		subServer = (SimpleMultiChatSubServer) iterator.next();
    	    log(subServer.getName() + ": removed");
    	}
    	
    	clientList.removeAll(subServers);
    }
    
    private void shutdownSubServer(SimpleMultiChatSubServer subServer) {
    	// The multi chat server's hascode is necessary for notify a subServer
    	// that this is a main server's command.
    	subServer.sendMessageToClient(this.hashCode() + ":quit");
    	subServer.shutdown();
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -