package netty.server.coder; import java.net.SocketAddress; import java.nio.charset.Charset; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.channel.Channel; /** * @author hankchen * 2012-2-4 下午01:57:33 */ public class ProtocolUtil { /** * 编码报文的数据部分 * @param encode * @param values * @return */ public static ChannelBuffer encode(int encode,Map<String,String> values){ ChannelBuffer totalBuffer=null; if (values!=null && values.size()>0) { totalBuffer=ChannelBuffers.dynamicBuffer(); int length=0,index=0; ChannelBuffer [] channelBuffers=new ChannelBuffer[values.size()]; ///Charset charset=XLCharSetFactory.getCharset(encode); Charset charset= Charset.forName("UTF-8"); for(Entry<String,String> entry:values.entrySet()){ String key=entry.getKey(); String value=entry.getValue(); ChannelBuffer buffer=ChannelBuffers.dynamicBuffer(); buffer.writeInt(key.length()); buffer.writeBytes(key.getBytes(charset)); buffer.writeInt(value.length()); buffer.writeBytes(value.getBytes(charset)); channelBuffers[index++]=buffer; length+=buffer.readableBytes(); } for (int i = 0; i < channelBuffers.length; i++) { totalBuffer.writeBytes(channelBuffers[i]); } } return totalBuffer; } /** * 解码报文的数据部分 * @param encode * @param dataBuffer * @return */ public static Map<String,String> decode(int encode,ChannelBuffer dataBuffer){ ConcurrentMap<String,String> dataMap=new ConcurrentHashMap<String, String>(); if (dataBuffer!=null && dataBuffer.readableBytes()>0) { int processIndex=0,length=dataBuffer.readableBytes(); //Charset charset=XLCharSetFactory.getCharset(encode); Charset charset= Charset.forName("UTF-8"); while(processIndex<length){ /** * 获取Key */ int size=dataBuffer.readInt(); byte [] contents=new byte [size]; dataBuffer.readBytes(contents); String key=new String(contents, charset); processIndex=processIndex+size+4; /** * 获取Value */ size=dataBuffer.readInt(); contents=new byte [size]; dataBuffer.readBytes(contents); String value=new String(contents, charset); dataMap.putIfAbsent(key, value); processIndex=processIndex+size+4; } } return dataMap; } /** * 获取客户端IP * @param channel * @return */ public static String getClientIp(Channel channel){ /** * 获取客户端IP */ SocketAddress address = channel.getRemoteAddress(); String ip = ""; if (address != null) { ip = address.toString().trim(); int index = ip.lastIndexOf(':'); if (index < 1) { index = ip.length(); } ip = ip.substring(1, index); } if (ip.length() > 15) { ip = ip.substring(Math.max(ip.indexOf("/") + 1, ip.length() - 15)); } return ip; } }