基于Netty的一个WeoSocket通信服务器与客户端代码(非JS代码)

咳咳,在这里呢,小轩就不多说什么是WebSocket的,还有呢,小轩为什么不给出JS-Client代码?网上太多代码可以用了。小轩这里的WebSocket客户端是非JS客户端,因为小轩的项目后台逻辑要与WebSocket服务器通信,所以才搞了个客户端出来。不多说,先上成果图。

  1. 启动WebSocket服务器

  2. 启动项目(客户端1)

  3. 使用ws-js客户端与服务器建立连接(客户端2)

  4. 调用项目接口,由客户端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 启动类

服务端的处理

  1. WebSocketUrl为ws://localhost:9999/oa/web_socket/{uri} 其中{uri}用来接收业务参数
  2. 如果服务端接收的消息是文本消息,则返回给客户端的内容为:你发的消息是:+ 原消息内容
  3. 如果是二进制数据,则会对其进行解码,编解码使用的是MessagePack工具。若想自己开发自己的业务逻辑,可以将handlerWebSocketFrame方法抽出到接口中,根据不同的业务走自己的业务逻辑。在源码中,服务端和客户端使用同一个实体类。进行简易的点对点通信。详见WebSocketMessageEntity实体类。

客户端的处理

  1. 在源码中,客户端连接的是本地服务器,连接成功后进行WebSocket通信。url为:ws://127.0.0.1:9999/web_socket/${userName}其中 userName为用户名。即我自己的业务参数。
  2. 连接成功后,将userName的Channel保留。当需要给服务端发送消息时,根据用户名获取自己与服务器已连接的通道,进行消息传输。
  3. 现在客户端的处理逻辑是发送二进制数据,指定服务端将消息发送给哪个客户端。如果有自己的业务逻辑,可根据服务端业务进行相应的修改。

测试用例

  1. 启动服务端。
  2. 将客户端代码集成在已有项目中(此处我集成在了一个基于tomcat应用服务器的web项目)
  3. 启动客户端(此处,我将项目以一个用户的身份与服务端进行通信system_manage)
  4. 通过web项目的登陆入口,将一个个用户与服务端进行连接(项目中的前端页面,使用js直接与服务端通信,但触发点是登陆系统之后)
  5. 用户A发送消息给用户B

到目前为止,仍然没有看到客户端的作用对吧。不急,向下看。

当Web服务器处理了一些业务,需要给当前用户A发送消息通推送,可以在后台直接调用客户端发送消息给用户的方法,此时,就用到客户端了。

WEB后台调用client发送消息的方法,以上面提到的system_manage身份发送消息给指定用户。消息以二进制数据到达服务端,服务端有写好的业务逻辑,将消息解码后,回写数据给用户A(没错,用户A就是通过js与服务端建立连接的前台用户)当然,这里也可以做到给所以在线用户发送消息。这里就不多说了。原理是一样的。

项目源码

博文路径

联系方式

基于Netty的一个WeoSocket通信服务器与客户端代码(非JS代码)的更多相关文章

  1. 手写一个类SpringBoot的HTTP框架:几十行代码基于Netty搭建一个 HTTP Server

    本文已经收录进 : https://github.com/Snailclimb/netty-practical-tutorial (Netty 从入门到实战:手写 HTTP Server+RPC 框架 ...

  2. 如何在一个网站或者一个页面,去书写你的JS代码

    // JavaScript Document //如何在一个网站或者一个页面,去书写你的JS代码: //1.js的分层(功能) : jquery(tools) 组件(ui) 应用(app), mvc( ...

  3. netty实现消息中心(二)基于netty搭建一个聊天室

    前言 上篇博文(netty实现消息中心(一)思路整理 )大概说了下netty websocket消息中心的设计思路,这篇文章主要说说简化版的netty聊天室代码实现,支持群聊和点对点聊天. 此demo ...

  4. 手把手教你基于Netty实现一个基础的RPC框架(通俗易懂)

    阅读这篇文章之前,建议先阅读和这篇文章关联的内容. [1]详细剖析分布式微服务架构下网络通信的底层实现原理(图解) [2][年薪60W的技巧]工作了5年,你真的理解Netty以及为什么要用吗?(深度干 ...

  5. 基于netty实现rpc框架-spring boot客户端

    上篇讲了RPC服务端的实现.原理就是解析netty通道数据拿到类.方法及入参等信息,然后通过java反射机制调用本地接口返回结果.没有用到很复杂的技术. 这篇我们将客户端的实现.说白了客户端的任务很简 ...

  6. 基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇

    基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇 前提 最近对网络编程方面比较有兴趣,在微服务实践上也用到了相对主流的RPC框架如Spring Cloud Gateway底层也切换 ...

  7. 一款基于Netty开发的WebSocket服务器

    代码地址如下:http://www.demodashi.com/demo/13577.html 一款基于Netty开发的WebSocket服务器 这是一款基于Netty框架开发的服务端,通信协议为We ...

  8. [年薪60W分水岭]基于Netty手写Apache Dubbo(带注册中心和注解)

    阅读这篇文章之前,建议先阅读和这篇文章关联的内容. 1. 详细剖析分布式微服务架构下网络通信的底层实现原理(图解) 2. (年薪60W的技巧)工作了5年,你真的理解Netty以及为什么要用吗?(深度干 ...

  9. 一个基于netty的websocket聊天demo

    这里,仅仅是一个demo,模拟客户基于浏览器咨询卖家问题的场景,但是,这里的demo中,卖家不是人,是基于netty的程序(我就叫你uglyRobot吧),自动回复了客户问的问题. 项目特点如下: 1 ...

随机推荐

  1. Android 12(S) 图形显示系统 - SurfaceFlinger的启动和消息队列处理机制(四)

    1 前言 SurfaceFlinger作为Android图形显示系统处理逻辑的核心单元,我们有必要去了解其是如何启动,初始化及进行消息处理的.这篇文章我们就来简单分析SurfaceFlinger这个B ...

  2. plsql 将游标读取到table中

    -- 将游标中的数据 读取到table中 根据部门编号获得emp所有信息. declare cursor c(no emp.deptno%type)is select * from emp where ...

  3. 微服务架构 | 7.2 构建使用 JWT 令牌存储的 OAuth2 安全认证

    目录 前言 1. JWT 令牌存储基础知识 1.1 JSON Web Token 2. 构建使用 JWT 令牌存储的 OAuth2 服务器 2.1 引入 pom.xml 依赖文件 2.2 创建 JWT ...

  4. Spring Cloud Alibaba Nacos 服务注册与发现功能实现!

    Nacos 是 Spring Cloud Alibaba 中一个重要的组成部分,它提供了两个重要的功能:服务注册与发现和统一的配置中心功能. 服务注册与发现功能解决了微服务集群中,调用者和服务提供者连 ...

  5. 用了这么久 Linux ,才知道这些概念。。。

    Linux 和 UNIX 中的文件系统是一个以 / 为根的树状式文件结构,/ 是 Linux 和 UNIX 中的根目录,同样它也是文件系统的起点.所有的文件和目录都位于 / 路径下,包括我们经常听到的 ...

  6. 300iq Contest 1 C Cool Pairs

    为了构造时恰好取到 \(k\) 对时的方便,可以考虑将 \(a\) 设为互不相同的 \(n\) 个数,这样对每个 \(b\) 的取值对答案的贡献就是可以通过调整变成任意值的. 因为要尽可能造成贡献,因 ...

  7. new Date时间格式转换方法

    平时经常会使用到时间转换,组件库已经有很多组件可以自动生成时间类型了,但是底层的封装方法还是得有 获取当前时间 new Date()  或者自己拥有一个毫秒时间 方法如下 /** * title: 时 ...

  8. Java-在数组中遍历出最值

    在操作数组时,经常需要获取数组中元素的最值. 代码 public class Example31{ public static void main(String[] args){ int[] arr= ...

  9. sublime运行错误

      这是由于没有保存文档导致   说明: [Finished in 19.4s with exit code 1]-表示执行时间 [shell_cmd: python3 -u "/Volum ...

  10. swpu新生赛ctf wp

    WEB:gift_F12 没啥好说的 直接F12得了 NSSCTF{We1c0me_t0_WLLMCTF_Th1s_1s_th3_G1ft} RE 简简单单的解密 import base64, url ...