?? xmlsocketserver.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 + -