手机网络象棋开发(1): 服务器类Server介绍

为了更好的理解手机网络游戏的架构和开发技巧,本人在他人手机网络象棋的基本上,进一步进行网络通信部分的修改和优化,采用socket方式进行数据通信。

以下是server的Server.java的简介。

此类主要负责:
1. 游戏共用数据的初始化
   playerMap.clear()  玩家容器的清空
   Desk[]  遍历数组,赋控制

2. 启动serversocket, 等待client连接

3. 连接客户端后,将socket作为参数,启动独立线程独立读写、逻辑业务(第二篇重点描述)

具体代码如下:
/**
 * 
 */
package net.tuolian.newserver;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

/**
 * @author sean
 * 
 * @since 2009/06/18
 * 
 * 1.create serversocket 
 * 2. wait for new connection
 * 3. start thread to handle data and logic
 * 4.
 *
 */
public class Server {
	
	static int port=9999;
	static ServerSocket server;
	
	static final int DESKNUM = 10;			//总共游戏桌子数量

	public static int playerId = 1;			//默认玩家id为1

	public static Map<Integer, Player> playerMap = new HashMap<Integer, Player>();  //玩家容器
	
	public static int counter = 0;				//客户端连接累计数,即玩家id的依据

	static Desk[] desks = new Desk[10];			//桌子数组
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 初始化
		
		init();
		
		try {
			server = new ServerSocket(port);
			System.out.println("服务器端已启动:" + port);
			
			while(true){
				System.out.println("ready to accept new client");
				Socket socket = server.accept();
				System.out.println("accepted a client: " + socket.getRemoteSocketAddress());
				
				//此处需要修改,目前每个客户端登录,启动专门线程,耗费资源
				new Network(socket).start();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally{
			if( server != null){
				try {
					server.close();
					server = null;
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		}
		
		
	}
	
	private static void init() {
		// TODO 服务器server的初始化动作,playerMap情况, 桌子情况
		
		//初始化工作
		playerMap.clear();
		
		for (int i = 0; i < DESKNUM; i++) {
			desks[i] = new Desk();
			desks[i].setID(i);
		}
	}

	/**
	 * 发送消息类
	 * 主要工作就是发送到队列
	 * 由发送线程去除队列中消息,进行依次发送
	 * 
	 * @param player
	 * @param m
	 *
	 */
	public static void sendMessage(Player player, String message) {
		// TODO 改写sendMessage方法,按照msg方式进行封装,并且压入消息队列中
		int cmdType = Message.GAME_RESP;
		Message msg = new Message(cmdType, message);
		msg.setPlayerId(player.getID());
		player.data.push(msg);
		System.out.println("游戏中消息发送完毕:"+ msg.getMessage());
	}
}

你可能感兴趣的:(java,游戏,.net,工作,socket)