一个粗糙的,发上来都以为很羞耻的,使用vue ,netty 基于websocket的 即时通信系统。
github: github.com/wangkeshan9…
site: http://47.105.88.240:8080/前端
private String command;
private String traceId;
private Object data;
复制代码
command 表示数据包指令类型,
由于websocket协议是全双工,并不能像http协议同样一问一答的形式,因此对于client,在原生协议上没法连接一个request和一个response,因此使用traceId来判断,
data为数据vue
若是是一问一答的须要traceId 的应答模式,则对req,以及对应的回调方法打包进队列,若是resp回应,则回调处理
若是是单向的,则根据command 来找到注册的处理方法处理java
handler:git
pipeline.addLast(new IMIdleStateHandler()); //空闲链接处理,超时则关闭
pipeline.addLast(new HttpServerCodec());//http协议编解码器
pipeline.addLast(new HttpObjectAggregator(65536)); //聚合 htp requet中的chunk内容,
pipeline.addLast(new ChunkedWriteHandler());//聚合response中的大量数据内容
pipeline.addLast(new WebSocketServerCompressionHandler());//处理websocket的扩展以及判断协议升级
pipeline.addLast(new WebSocketServerProtocolHandler(WEBSOCKET_PATH, null, true));//会自动添加websocket握手handler,握手完成会添加websocket的编解码器
pipeline.addLast(new HttpStaticFileServerHandler());//静态页面服务,
pipeline.addLast(new WebSocketFrameHandler()); //业务流程的开始
复制代码
业务方法举例:github
@Command(ADD_FRIENDS)
public class AddFriendsService extends BaseService<AddFriendReq, AddFriendResp> {
@Override
AddFriendResp process(MsgContext context, AddFriendReq addFriendReq) {
UserService.addFriend(addFriendReq.getUserId(), addFriendReq.getAddId());
//响应被添加者
UserInfo userInfo = UserService.getUserInfo(addFriendReq.getUserId());
Packet p = new Packet(ADD_NOTIRY, null, new AddFriendNotify(userInfo.getUserId(), userInfo.getUserName()));
UserInfo addedUserInfo = UserService.getUserInfo(addFriendReq.getAddId());
send(addedUserInfo.getChannel(), p);
return new AddFriendResp("SUCCESS", "SUCCESS", addedUserInfo.getUserId(), addedUserInfo.getUserName());
}
}
复制代码
@Command为自定义注解,标注处理的command类型,泛型为req,resp的类型,web
前端: vue ui直接打包 后端: java -jar -Dfront_dir=E:\code\Netty_IM\front\im_ui\dist -Dport=8080 netty_im-1.0.jar front_dir 为前端目录 portchrome
其实看起来彻底就是个粗糙的玩具,列一些后续能够继续作的方向吧,虽然我这么懒估计也不会去作json