- 最后登录
- 2014-10-23
- 注册时间
- 2011-7-19
- 阅读权限
- 90
- 积分
- 81303
 
- 纳金币
- -1
- 精华
- 11
|
一,首先先写一个服务器端扩展的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 |
|