使用Spring Boot和netty,实现WebSocket服务。构建此项目需要使用JDK 1.8
每个客户端(即用户)连接到服务器时,都会生成一个对象,它是OnlineObject的子类对象,通过不同的类来区分不同的用户类型如区分未登录和已登录用户。所以首先根据需要实现一到多个OnlineObject的子类
调用OnlineObjectManager的init方法初始化。init方法的原型为void init(Class<? extends OnlineObject> newlyConnectedObjectClass, PoolableFactory<? extends OnlineObject>... factories),newlyConnectedObjectClass是客户端刚连接到服务器时使用的类型,factories参数是一个或多个PoolableFactory<? extends OnlineObject>对象;PoolableFactory是一个抽象类,所有继承了OnlineObject的类都实例化该泛型抽象类,除非该类没有实际被使用。子类必须使用对象池管理。例如
OnlineObjectManager.getInstance().init(User.class, new PoolableFactory<User>() {
@Override
public PooledObject<User> makeObject() throws Exception {
return new DefaultPooledObject<User>(new User());
}
});@RequestHandler用于修饰处理请求的方法,注解的值是请求id(消息结构图中的msgId字段)。RequestDispatcher根据msgId自动通过反射调用相应的方法。这些方法的参数列表的类型是OnlineObject或OnlineObject子类类型(必要,下文使用arg1表示)和MessageHandlerContext(可选,下文使用arg2表示)。一个msgId可以有多个不同的arg1类型RequestHandler方法,但如果arg1为限定为OnlineObject类型则所有的对应msgId的请求都会分发给该方法,此时不能再其他有处理该msgId的RequestHandler。通过arg2可以获得请求消息的数据,也可以生成响应消息数据(之后调用OnlineObject的response方法将响应消息数据发送给客户端)。@RequestHandler必须位于在@Controller类中,其他的类使用该注解没有效果。
当收到消息的msgId没有对应的RequestHandler方法或RequestHandler方法执行时出现异常,RequestDispatcher会调用RequestDispatcherBehavior中的接口进行异常处理。调用RequestDispatcher.setDispatcherBehavior来设置这些异常处理流程。例如
RequestDispatcher.setDispatcherBehavior(new RequestDispatcherBehavior() {
@Override
public void requestHasNoCorHandler(OnlineObject object, MessageHandlerContext ctx) {
// TODO 发现请求没有对应处理方法时
}
@Override
public void onHandlerException(Method handler, OnlineObject object, MessageHandlerContext ctx,
Exception e) {
// TODO RequestHandler异常处理
}
});这个配置不是必须的,当没有配置RequestDispatcher时,出现相应的情况时RequestDispatcher不会调用这些接口。