纳金网

标题: 在SmartFoxServer上自定义公聊和私聊 2 [打印本页]

作者: 会飞的鱼    时间: 2012-3-20 14:45
标题: 在SmartFoxServer上自定义公聊和私聊 2
一,首先先写一个服务器端扩展的Java类命名为ublicInfomationExtend 。如下所示
package com.songvery.www;
import java.nio.channels.SocketChannel;

import java.util.LinkedList;
import it.gotoandplay.smartfoxserver.data.Room;

import it.gotoandplay.smartfoxserver.data.User;

import it.gotoandplay.smartfoxserver.data.Zone;

import it.gotoandplay.smartfoxserver.events.InternalEventObject;

import it.gotoandplay.smartfoxserver.extensions.AbstractExtension;

import it.gotoandplay.smartfoxserver.extensions.ExtensionHelper;

import it.gotoandplay.smartfoxserver.lib.ActionscriptObject;
/**

* 自定义聊天信息

* @author songvery

* @version 2011-04-23

*/

public class PublicInfomationExtend extends AbstractExtension{
    private ExtensionHelper helper;

   

    private Zone currentZone;

   

    private String publicMessage="pub";//公共聊天信息

   

    private String privateMessage="pra";//私人聊天信息

   

    LinkedList<SocketChannel> recipients;

   

    public void init(){

        recipients=new LinkedList<SocketChannel>();

        helper=ExtensionHelper.instance();

        currentZone=helper.getZone(this.getOwnerZone());

    }

   

    public void destory(){

      

    }

   

    @Override

    public void handleRequest(String cmd, ActionscriptObject ao, User user,

            int roomId) {

      

      

    }
    /**

     * roomId信息来自哪个房间

     *

     */

    @Override

    public void handleRequest(String cmd, String[] params, User user, int roomId) {
        if(params.length!=0){

            if(cmd.equals(publicMessage)){

                handlePublicMessage(params,user,roomId);

            }else if(cmd.equals(privateMessage)){

                handlePrivateMessage(params,user,roomId);

            }

        }else{

            return;//如果用户传递的聊天信息为空时,服务器端不做任何操作,即params对象为空。

        }

      

    }
    /**

     * 处理私人聊天信息

     * @param params用户名+消息

     * @param user发送信息的用户   

     * @param roomId房间Id

     */

    private void handlePrivateMessage(String[] params, User user, int roomId) {

      

       LinkedList<SocketChannel> privateChannel=new LinkedList<SocketChannel>();

        Room myRoom=currentZone.getRoom(roomId);

        

        //接收信息的用户昵称,是客户端传递过来的

        String recipientsName=params[0];

        

        User acceptUser=myRoom.getUserByName(recipientsName);

        

        //接收信息用户的Sockect通道

        SocketChannel acceptUserChannel=acceptUser.getChannel();

        

        //发送信息用户的Sockect通道

        SocketChannel senderChannel=user.getChannel();

        

        ActionscriptObject response=new ActionscriptObject();

        

        //发送者向接收者发送的聊天信息

        String message=params[1];

        

        int userId=user.getUserId();

        response.put("_cmd", privateMessage);

        response.put("userId", userId);

        response.put("username", user.getName());

        response.put("privateMessages", message);

   

        response.put("acceptUser", acceptUser);

        

        privateChannel.add(senderChannel);

        privateChannel.add(acceptUserChannel);

        

        this.sendResponse(response, roomId, user, privateChannel);

    }
    /**

     * 处理公共聊天信息

     * @param params聊天信息

     * @param user发送信息的用户

     * @param roomId发送信息用户所在的房间

     */

    @SuppressWarnings("unchecked")

    private void handlePublicMessage(String[] params, User user, int roomId) {

      

        //获取发送公共聊天信息的用户所在的房间

        Room myRoom=currentZone.getRoom(roomId);
        //获取房间中所有用户的Socket通道,便于向其它用户发送信息

        LinkedList<SocketChannel> usersChannel=(LinkedList<SocketChannel>)myRoom.getChannellList();

      

        ActionscriptObject response=new ActionscriptObject();
        //用户传递的聊天信息

        String messages=params[0];
        //发送消息用户的ID

        int userId=user.getUserId();

        //发送消息用户的昵称

        String username=user.getName();

      

        response.put("_cmd", publicMessage);

        response.put("userId", userId);

        response.put("username", username);

        response.put("publicMessages", messages);

      

        //如果不向自己发送信息的处理

        //usersChannel.remove(user.getChannel());

      

        //向房间内的所有用户发送聊天信息

        this.sendResponse(response, roomId, null, usersChannel);

    }
    @Override

    public void handleInternalEvent(InternalEventObject io) {

      

    }
}



转自unity3d8.com




欢迎光临 纳金网 (http://go.narkii.com/club/) Powered by Discuz! X2.5