package com.eatook.neatook;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.nio.ByteOrder;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelEvent;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelHandler;
import org.jboss.netty.channel.group.ChannelGroup;
import org.jboss.netty.channel.group.DefaultChannelGroup;
public class PadServerHandler extends SimpleChannelHandler {
private static final Logger logger = Logger
.getLogger(PadServerHandler.class.getName());
static final ChannelGroup channels = new DefaultChannelGroup();
static Map<String, Integer> padversionManager = new HashMap<String, Integer>();
static Map<String, Integer> padId = new HashMap<String, Integer>();
/**
* 此构造方法主要用途: 启动一个timer来做数据库和客户端的版本检查和更新
*/
public PadServerHandler() {
Timer timer = new Timer();
if (padversionManager != null) {
timer.schedule(new TimerTask() {
@Override
public void run() {
try {
/**
* 1. 取得数据库的lastVersion 2. 遍历保存的clientList, 如果
* 某个ClientList.lastVersion < lastVersion 3.
* 直接push一条新的信息. 客户端的返回处理在messageRecieved中。 4.
* 如果不用更新,就直接检查客户端是否在线。如果超时,就报警。
* 数据包格式:长度+消息类型+版本号+ipad编号+处理流水号
*/
byte[] msgBody = null;
for (Channel c : channels) {
// 获取连接上来的客户端的ip
String ipport = c.getRemoteAddress().toString();
String ip = ipport.substring(0, ipport.length() - 6);
// 获取客户端的版本并+1,为推送做准备
if (padversionManager.get(ip) != null) {
int currentVersion = padversionManager.get(ip) + 1;
// 获取客户端当前版本的下一版的json
String json = new VersionChecker()
.VersionCheck(ip);
// 判断是否为空
if (json != null) {
// 构造body
msgBody = json.getBytes();
}
// 算长度
int msgLen = msgBody.length + 16;
// 判断是否已经是最新版本,如果不是则推送给客户端
if (!"no new version".equals(json)) {
ChannelBuffer buf = ChannelBuffers.buffer(
ByteOrder.LITTLE_ENDIAN, msgLen);
buf.writeInt(msgLen);// 长度
buf.writeInt(MsgTypeEnum.CHECKVERSION);// 消息类型
buf.writeInt(currentVersion);// 版本号
buf.writeInt(0);// ipad编号
buf.writeBytes(msgBody);// 主要数据
c.write(buf);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}, 1000, 5000);// 程序启动1秒后开始执行,每次间隔5秒
}
}
@Override
public void handleUpstream(ChannelHandlerContext ctx, ChannelEvent e)
throws Exception {
if (e instanceof ChannelStateEvent) {
logger.info(e.toString());
}
super.handleUpstream(ctx, e);
}
@Override
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)
throws Exception {
logger.info(e.toString());
channels.add(ctx.getChannel());
}
@Override
public void channelDisconnected(ChannelHandlerContext ctx,
ChannelStateEvent e) throws Exception {
// Unregister the channel from the global channel list
// so the channel does not receive messages anymore.
/**
* 客户端失去连接报警,并做数据库记录处理
*/
String ipport = e.getChannel().getRemoteAddress().toString();
String ip = ipport.substring(0, ipport.length() - 6);
// TODO 报警
System.out.println(e.getChannel().getRemoteAddress()
+ ": miss connection");
// 连接url
String url = "http://192.168.1.109/eatook-api/jsondevice.php?function"
+ "=addMobileDeviceError&md_id="// ipadID
+ 1 + "&description="// 描述
+ 2 + "&user_password=" + "a";
URL U = new URL(url);
URLConnection connection = U.openConnection();
connection.connect();
// 获得结果
BufferedReader in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line = "";
String result = "";
while ((line = in.readLine()) != null) {
result += line;
}
in.close();
// TODO 数据调用结果
System.out.println(result);
// 输出
channels.remove(e.getChannel());
padversionManager.remove(ip);
padId.remove(ip);
}
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
// Convert to a String first.
Object o = e.getMessage();
ChannelBuffer m = null;
// 用ip构造HashMap的key
String ipport = e.getRemoteAddress().toString();
String ip = ipport.substring(0, ipport.length() - 6);
if (o instanceof ChannelBuffer) {
m = (ChannelBuffer) o;
}
if (m != null) {
@SuppressWarnings("unused")
int len = m.readInt();
int msgType = m.readInt();
int lastVersion = m.readInt();
int ipadId = m.readInt();
// 如果是版本check的回复:将内存中对应的版本号更新
if (msgType == MsgTypeEnum.RESP_CHECKVERSION) {
padversionManager.remove(ip);
padversionManager.put(ip, lastVersion);
System.out.println(ip + ":" + lastVersion);
}
// 接受开始时客户端传来的当前客户端版本
if (msgType == MsgTypeEnum.CLIENTVERSION) {
// 记录连接上来的ipad的版本号
padversionManager.put(ip, lastVersion);
// 记录连接上来的ipad的编号
padId.put(ip, ipadId);
// 回写数据,保证连接畅通
e.getChannel().write(m);
System.out.println(ip + ":" + lastVersion);
}
}
System.out.println(e.getMessage());
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
logger.log(Level.WARNING, "Unexpected exception from downstream.",
e.getCause());
e.getChannel().close();
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
netty-java开发的网络通信服务
共40个文件
class:13个
java:12个
jar:9个
4星 · 超过85%的资源 需积分: 10 134 下载量 61 浏览量
2011-09-25
20:15:34
上传
评论 2
收藏 2.85MB ZIP 举报
温馨提示
jboss公司开发netty包确实不错....开发很快速...就是有一点得注意:接受的信息是大端模式的!!!
资源推荐
资源详情
资源评论
收起资源包目录
neatook.zip (40个子文件)
neatook
.project 383B
src
client.bat 81B
com
eatook
neatook
PadClientBean.java 353B
PadServer.java 1KB
PadClientPipelineFactory.java 857B
DbConnector.java 984B
MsgTypeEnum.java 326B
PadServerHandler.java 6KB
PadClient.java 4KB
test
EatookNotificationCenterTest.java 1KB
Tables.java 1KB
PadServerPipelineFactory.java 746B
PadClientHandler.java 3KB
VersionChecker.java 1KB
lib
ezmorph-1.0.5.jar 84KB
mysqldriver.jar 388KB
json-lib-2.4-jdk15.jar 155KB
commons-logging-1.1.jar 52KB
commons-collections-3.2.1.jar 562KB
commons-beanutils-core-1.7.0.jar 165KB
netty-3.2.5.Final.jar 774KB
commons-lang-2.3.jar 240KB
.settings
org.eclipse.jdt.core.prefs 629B
.classpath 970B
bin
client.bat 81B
com
eatook
neatook
PadClientPipelineFactory.class 1KB
PadClientHandler.class 4KB
PadServer.class 1KB
MsgTypeEnum.class 495B
PadServerHandler$1.class 3KB
test
EatookNotificationCenterTest.class 1KB
PadServerPipelineFactory.class 883B
PadServerHandler.class 6KB
DbConnector.class 2KB
PadClient.class 4KB
PadClientBean.class 602B
VersionChecker.class 2KB
Tables.class 3KB
padserver.bat 67B
netty-3.2.5.Final.jar 774KB
共 40 条
- 1
_風吹亂暸
- 粉丝: 9
- 资源: 28
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页