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

📄 eventwriter.java

📁 一套MMORPG手机网络游戏的服务端
💻 JAVA
字号:
/*
 * Created on 2005-4-20
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package com.swing.server.server;

import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

import com.swing.server.common.GameEvent;
import com.swing.server.common.Globals;
import com.swing.server.common.NIOUtils;
import com.swing.server.common.Player;
import com.swing.server.common.Wrap;
import com.swing.server.server.controller.GameController;

/**
 * @author vampire_a
 * 
 * 当每有一个上行信息时,本类被用来对该上行信息进行下行,并不进行广播下行
 */
public class EventWriter extends Wrap {
    /** reference to the GameServer */
    private static GameServer gameServer;

    /**
     * contructor.
     */
    public EventWriter(GameServer gameServer, int numWorkers) {
        EventWriter.gameServer = gameServer;
        initWrap(numWorkers);
    }

    /**
     * note we override the Wrap's run method here doing essentially the same
     * thing, but first we allocate a ByteBuffer for this thread to use
     */
    public void run() {
        
        // 改字符顺序~~~~~~
        ByteBuffer writeBuffer = ByteBuffer
                .allocateDirect(Globals.MAX_EVENT_SIZE);
        // writeBuffer.order(ByteOrder.LITTLE_ENDIAN);

        GameEvent event;
        running = true;
        while (running) {
            try {
                if ((event = eventQueue.deQueue()) != null) {
                    processEvent(event, writeBuffer);
                }
            } catch (InterruptedException e) {
            }
        }
    }

    /**
     * 本游戏中不需要主动广播,而是要等待用户上行后,把存储的信息发给他!!
     * 要改!
     */
    protected void processEvent(GameEvent event, ByteBuffer writeBuffer) {
        NIOUtils.prepBuffer(event, writeBuffer);
        GameController gc = gameServer.getGameControllerByCode(event
                .getGameCode());

        String playerId = event.getPlayerId();
        // Player p = gc.getPlayerById (playerId);
        
        // 针对一个用户,同一时间内只能有一个线程给他发送数据
        // synchronized (p) {
            
            write(gc.getPlayerById(playerId), writeBuffer);
        // }
    }

    /**
     * write the event to the given playerId's channel
     */
    private void write(Player player, ByteBuffer writeBuffer) {
        SocketChannel channel = player.getChannel();
        
        if (channel == null || !channel.isConnected()) {
            log.error("writeEvent: client channel null or not connected");
            return;
        }
            NIOUtils.channelWrite(channel, writeBuffer);
       
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.swing.server.common.Wrap#processEvent(com.swing.server.common.GameEvent)
     */
    protected void processEvent(GameEvent event) {
    }

}// EventWriter

⌨️ 快捷键说明

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