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

📄 xmlsocketserver.java

📁 flash lite 的手机游戏开发的代码 实现xmlsocket通信的c/s
💻 JAVA
字号:

/*
 * Pasi Manninen 21.4.2007
 * http://ptm.fi
 */

// import necessary libraries for communication
import java.util.*;
import java.io.*;
import java.net.*;

// XMLSocketSetver class handels server and all communication
public class XMLSocketServer {
    private Map clients;          // clients
    private ServerSocket server;  // this server
    private int id;               // number of clients
    
    // constructor - initialize class properties and start server
    public XMLSocketServer(int port) {
        clients = new HashMap();
        id = 0;
        startServer(port);
    }

    // start XMLSocket server
    private void startServer(int port) {        
        try {
            // starting server
            server = new ServerSocket(port);
            System.out.print("Server is started to listen to port : " + port + "\n");
            // waiting for connections
	    while(true) {
                // waiting for a new connection
                Socket socket = server.accept();
                // make a new Client
                id++;
		Client client = new Client(this, socket, Integer.toString(id));
                // add new client to HashMap
                clients.put(Integer.toString(id), client);
                // start new client thread - start listen to socket
                client.start();	
                // send client's unique ID to Flash Lite client
                client.send("<message>id</message><id>" + id + "</id>\0");
                System.out.println("new client id : " + id);	
            }
        } catch(IOException ioe) {
            System.out.print("Problem with starting server!");
            killServer();
        } 
    }

    // handle new message from client
    public synchronized void broadcastMessage(String message) {
        System.out.println("New message - broadcastMessage: " + message); 
	// split XML data to array - what message has send (login, chat, game, ....)
	String data[] = message.split("(<[a-z/]*>){1,2}");
	if (data[1].equals("login")) login(data);                 // login
	else if (data[1].equals("chat")) sendMsg(message+"\0");   // normal chat in lobby
	else sendMessageToOpponent(data[2],message);              // all other messages are to opponent
    }

    // send message to opponent's client (challenge, accept, reject, startGame, newMove)
    public void sendMessageToOpponent(String id, String message){
        Client client = (Client) clients.get(id);
        client.send(message+"\0");
    }

    // new user login to server
    public void login(String[] data){
	Client tmpClient = (Client) clients.get(data[2]);
	tmpClient.setLoginName(data[3]);
	System.out.println("New login: " + data[3] + " id: "+ data[2]);
	sendMsg("<func>login</func><msg>"+ data[3] +" logged in</msg>\0");
	// send user list to clients
	sendUserList();
    }

    // send user's list to client
    public void sendUserList(){
	System.out.println("Send user list to client");
	String users = "<func>users</func><users>";
	Collection coll = clients.keySet();
	Iterator iter = coll.iterator();
	while (iter.hasNext()) {
	    Client tmpClient = (Client) clients.get(iter.next());
	    if (!tmpClient.isIngame()) {
		users += "<user id='"+tmpClient.returnId()+"'>" + tmpClient.getLoginName() + "</user>";
	    }
	}
	users += "</users>\0";
	sendMsg(users);
    }

    // send message to all client's
    public void sendMsg(String message) {
	Collection coll = clients.values();
	Iterator iter = coll.iterator();
	while (iter.hasNext()) {
	    Client client = (Client) iter.next();
	    if (!client.isIngame()) client.send(message);
	}
    }


    // all starts here - create XMLSocket object
    public static void main(String args[]) {
        // is there port in args
        if(args.length == 1) {
            XMLSocketServer myCS = new XMLSocketServer(Integer.parseInt(args[0]));
        } else {
            // show command how to start server
            // now XMLSocketServer is compiled with GCJ (so it is executable)
	    System.out.println("Usage: ./XMLSocketServer port");
	    // if it is compiled with Javac then use commanded line
            //System.out.println("Usage: java XMLSocketServer port");
        }
    }

    // stop server
    private void killServer() {
	try {
	    // close server
	    server.close();
	} catch (IOException ioe) {
	    System.out.println("Server cannot stopped.");
	}
    }

    // remove client from server
    public void removeClient(String id) {
	System.out.println("Remove client id: " + id);
	// remove client from clients HashTable
	Client client = (Client) clients.get(id);
	clients.remove(id);
	sendMsg("<func>left</func><msg>"+client.getLoginName()+" left</msg>");
	sendUserList();
    }

}

⌨️ 快捷键说明

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