基于Netty的一个WeoSocket通信服务器与客户端代码(非JS代码)
基于Netty的一个WeoSocket通信服务器与客户端代码(非JS代码)
咳咳,在这里呢,小轩就不多说什么是WebSocket的,还有呢,小轩为什么不给出JS-Client代码?网上太多代码可以用了。小轩这里的WebSocket客户端是非JS客户端,因为小轩的项目后台逻辑要与WebSocket服务器通信,所以才搞了个客户端出来。不多说,先上成果图。
启动WebSocket服务器
启动项目(客户端1)
使用ws-js客户端与服务器建立连接(客户端2)
调用项目接口,由客户端1给客户端2发送消息。
这里,小轩可以支持文本消息,也可以支持二进制数据。当然,逻辑写的很简单,就是简单的发送消息。但是可以在此基础上进行业务逻辑的修改,从而达到符合自己的业务需求。
好了,图呢,就先到这里,小轩这边已经在正常使用中。没有视频演示还真是硬伤。
之所以看到tdg_yyx跟连接里面的不一样,是因为在小轩的项目中集成的客户端中加了系统前缀。所以才会有这样的演示图。当然,如果想知道具体再怎么使用的话,依旧可以联系小轩我哦。
例子中的编码解码数据是使用的MsgPack对对象进行了序列化。但是从服务器发给浏览器客户端的时候使用的是文本消息哦。
项目源码已共享至github中,另起了一个新的repository哦。与之前的demo分开了。可以直接拿下来进行修改的哦。
目录结构
|- xpush
|——push-client
|————org.yyx.message.push.client
|——————client // 客户端代码
|——————config // 从yml文件中加载配置的Netty配置类包
|——————entity // 用来在服务器与客户端之间进行传输的实体类包
|——————handler // WebSocket客户端处理包
|——————listener // 用于启动客户端的监听器
|——————util // 此处应该写接口,主要用来做传输消息的逻辑
|————PushClientApplication // SpringBoot 启动类
|——push-server
|————org.yyx.message.push.server
|——————config // 从yml文件中加载配置的Netty配置类包
|——————entity // 用来在服务器与客户端之间进行传输的实体类包
|——————handler // WebSocket服务端处理包
|——————listener // WebSocket服务端监听器
|——————main // 服务端代码
|——————util // 此处应该写接口,主要用来做传输消息的逻辑
|————ServerApplication.java // SpringBoot 启动类
服务端的处理
- WebSocketUrl为ws://localhost:9999/oa/web_socket/{uri} 其中{uri}用来接收业务参数
- 如果服务端接收的消息是文本消息,则返回给客户端的内容为:你发的消息是:+ 原消息内容
- 如果是二进制数据,则会对其进行解码,编解码使用的是MessagePack工具。若想自己开发自己的业务逻辑,可以将handlerWebSocketFrame方法抽出到接口中,根据不同的业务走自己的业务逻辑。在源码中,服务端和客户端使用同一个实体类。进行简易的点对点通信。详见WebSocketMessageEntity实体类。
客户端的处理
- 在源码中,客户端连接的是本地服务器,连接成功后进行WebSocket通信。url为:ws://127.0.0.1:9999/web_socket/${userName}其中 userName为用户名。即我自己的业务参数。
- 连接成功后,将userName的Channel保留。当需要给服务端发送消息时,根据用户名获取自己与服务器已连接的通道,进行消息传输。
- 现在客户端的处理逻辑是发送二进制数据,指定服务端将消息发送给哪个客户端。如果有自己的业务逻辑,可根据服务端业务进行相应的修改。
测试用例
- 启动服务端。
- 将客户端代码集成在已有项目中(此处我集成在了一个基于tomcat应用服务器的web项目)
- 启动客户端(此处,我将项目以一个用户的身份与服务端进行通信system_manage)
- 通过web项目的登陆入口,将一个个用户与服务端进行连接(项目中的前端页面,使用js直接与服务端通信,但触发点是登陆系统之后)
- 用户A发送消息给用户B
到目前为止,仍然没有看到客户端的作用对吧。不急,向下看。
当Web服务器处理了一些业务,需要给当前用户A发送消息通推送,可以在后台直接调用客户端发送消息给用户的方法,此时,就用到客户端了。
WEB后台调用client发送消息的方法,以上面提到的system_manage身份发送消息给指定用户。消息以二进制数据到达服务端,服务端有写好的业务逻辑,将消息解码后,回写数据给用户A(没错,用户A就是通过js与服务端建立连接的前台用户)当然,这里也可以做到给所以在线用户发送消息。这里就不多说了。原理是一样的。
基于Netty的一个WeoSocket通信服务器与客户端代码(非JS代码)的更多相关文章
- 手写一个类SpringBoot的HTTP框架:几十行代码基于Netty搭建一个 HTTP Server
本文已经收录进 : https://github.com/Snailclimb/netty-practical-tutorial (Netty 从入门到实战:手写 HTTP Server+RPC 框架 ...
- 如何在一个网站或者一个页面,去书写你的JS代码
// JavaScript Document //如何在一个网站或者一个页面,去书写你的JS代码: //1.js的分层(功能) : jquery(tools) 组件(ui) 应用(app), mvc( ...
- netty实现消息中心(二)基于netty搭建一个聊天室
前言 上篇博文(netty实现消息中心(一)思路整理 )大概说了下netty websocket消息中心的设计思路,这篇文章主要说说简化版的netty聊天室代码实现,支持群聊和点对点聊天. 此demo ...
- 手把手教你基于Netty实现一个基础的RPC框架(通俗易懂)
阅读这篇文章之前,建议先阅读和这篇文章关联的内容. [1]详细剖析分布式微服务架构下网络通信的底层实现原理(图解) [2][年薪60W的技巧]工作了5年,你真的理解Netty以及为什么要用吗?(深度干 ...
- 基于netty实现rpc框架-spring boot客户端
上篇讲了RPC服务端的实现.原理就是解析netty通道数据拿到类.方法及入参等信息,然后通过java反射机制调用本地接口返回结果.没有用到很复杂的技术. 这篇我们将客户端的实现.说白了客户端的任务很简 ...
- 基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇
基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇 前提 最近对网络编程方面比较有兴趣,在微服务实践上也用到了相对主流的RPC框架如Spring Cloud Gateway底层也切换 ...
- 一款基于Netty开发的WebSocket服务器
代码地址如下:http://www.demodashi.com/demo/13577.html 一款基于Netty开发的WebSocket服务器 这是一款基于Netty框架开发的服务端,通信协议为We ...
- [年薪60W分水岭]基于Netty手写Apache Dubbo(带注册中心和注解)
阅读这篇文章之前,建议先阅读和这篇文章关联的内容. 1. 详细剖析分布式微服务架构下网络通信的底层实现原理(图解) 2. (年薪60W的技巧)工作了5年,你真的理解Netty以及为什么要用吗?(深度干 ...
- 一个基于netty的websocket聊天demo
这里,仅仅是一个demo,模拟客户基于浏览器咨询卖家问题的场景,但是,这里的demo中,卖家不是人,是基于netty的程序(我就叫你uglyRobot吧),自动回复了客户问的问题. 项目特点如下: 1 ...
随机推荐
- mac 更新到big sur 后,parallels虚拟机的一些问题:由于您尚未获得访问其中一些文件的授权,所以您不能恢复“Windows 10
由于您尚未获得访问其中一些文件的授权,所以您不能恢复"Windows 10 Mac上使用PD虚拟机,打开系统时提示"由于您尚未获得访问其中一些文件的授权,所以您不能恢复" ...
- IDEA出现Cannot resolve symbol “xxx“(无法解析符号)的解决办法
1,File->Invalidate Caches/Restart 清除缓存并重启 idea 2,检查pom文件中的依赖关系是否正确 3,maven -> Reimport 4,打开pro ...
- 字的研究(3)fontTools-TrueType轮廓坐标的获取以及基于TrueType的Glyph实例的构建
前言 本文主要介绍如果使用Python第三方库fontTools提取OpenType字体文件中的TrueType轮廓坐标以及如何构建基于TrueType的Glyph实例 TrueType轮廓坐标的获取 ...
- JDBC 操作预编译语句中LIKE模糊匹配怎么用
问题描述 在使用JDBC 预编译执行语句时,遇到一个问题,那就是在含有LIKE的查询语句时,我到底怎么使用匹配符%._呢. 如: SELECT * FROM "+LQ_USERS+" ...
- IntelliJ IDEA 官方网站 http://www.jetbrains.com/idea/
IntelliJ IDEA 官方网站 http://www.jetbrains.com/idea/
- Mysql 返回JSON值属性的函数 (五)
本节中的函数返回JSON值的属性. JSON_DEPTH(json_doc) 返回JSON文档的最大深度.NULL如果参数为,则 返回 NULL.如果参数不是有效的JSON文档,则会发生错误. 一个空 ...
- 修复 WordPress 通过邮箱 找回密码时的链接无效&新用户注册时提示的链接无效
感谢大佬:https://blog.csdn.net/xiaobinqt/article/details/83055058 感谢大佬:https://www.wpdaxue.com/lost-pass ...
- 关于CSP-S2019的一篇游记
怎么讲呢? Day1:7:00左右从家里出发,准备还是做得比较充分,早饭也记得吃了.路上闭目养神了一会儿,7:50左右到了大门附近,和大家再次把一些自认为还是比较重要的数据结构之类的再复习了一下.进去 ...
- 500行代码了解Mecached缓存客户端驱动原理
原创不易,求分享.求一键三连 缓存一般是用来加速数据访问的效率,在获取数据耗时高的场景下使用缓存可以有效的提高数据获取的效率. 比如,先从memcached中获取数据,如果没有则查询mysql中的数据 ...
- 一次Kafka内存泄露排查经过
一.现象 服务部署后内存总体呈上升趋势 二.排查过程 通过go tool pprof收集了三天内存数据 2月11号数据: 2月14号数据: 2月15号数据: 可以看到newPartitionProdu ...