查看: 1761|回复: 0
打印 上一主题 下一主题

在SmartFoxServer上自定义公聊和私聊 2

[复制链接]

5552

主题

2

听众

8万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
11

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2012-3-20 14:45:23 |只看该作者 |倒序浏览
一,首先先写一个服务器端扩展的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
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-7-14 01:27 , Processed in 0.060706 second(s), 28 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部