Skip to content
/ websocket-server Public template

A WebSocket server based on SpringBoot and Netty

License

Notifications You must be signed in to change notification settings

kkua/websocket-server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

websocket-server

使用Spring Boot和netty,实现WebSocket服务。构建此项目需要使用JDK 1.8

消息格式

服务器和客户端采用二进制消息进行通信,其结构如下图 消息结构

使用说明

1. 继承OnlineObject

每个客户端(即用户)连接到服务器时,都会生成一个对象,它是OnlineObject的子类对象,通过不同的类来区分不同的用户类型如区分未登录和已登录用户。所以首先根据需要实现一到多个OnlineObject的子类

2.初始化OnlineObjectManager

调用OnlineObjectManagerinit方法初始化。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());
    }

});

3.RequestHandler注解

@RequestHandler用于修饰处理请求的方法,注解的值是请求id(消息结构图中的msgId字段)。RequestDispatcher根据msgId自动通过反射调用相应的方法。这些方法的参数列表的类型是OnlineObjectOnlineObject子类类型(必要,下文使用arg1表示)和MessageHandlerContext(可选,下文使用arg2表示)。一个msgId可以有多个不同的arg1类型RequestHandler方法,但如果arg1为限定为OnlineObject类型则所有的对应msgId的请求都会分发给该方法,此时不能再其他有处理该msgId的RequestHandler。通过arg2可以获得请求消息的数据,也可以生成响应消息数据(之后调用OnlineObjectresponse方法将响应消息数据发送给客户端)。@RequestHandler必须位于在@Controller类中,其他的类使用该注解没有效果。

4.配置RequestDispatcher(非必须的配置)

当收到消息的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不会调用这些接口。

About

A WebSocket server based on SpringBoot and Netty

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages