基于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. IoC容器-Bean管理(bean生命周期)

    1,生命周期 即从对象创建到对象销毁的过程 2,bean生命周期 (1)通过构造器创建bean实例(无参数构造) (2)为bean的属性设置值和对其他bean的引用(调用set方法) (3)调用bea ...

  2. ElementUI常遇到的一些问题

    一.form 下面只有一个 input 时回车键刷新页面 原因是:触发了表单默认的提交行为,给el-form 加上 @submit.native.prevent 就行了. <el-form in ...

  3. python 小兵(1)

    变量规则 1.只能以数字,字母,下划线命名 2.不能使用数字开头 3.不能使用python关键字 4.不建议用拼音或中文 5区分大小写 6推荐使用驼峰,下划线 全部大写是常量 注释 # 单行注释 (当 ...

  4. Matplotlib 3.0 秘籍·翻译完成

    原文:Matplotlib 3.0 Cookbook 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. 在线阅读 ApacheCN 面试求职交 ...

  5. NOIP2018 Day2T3 保卫王国

    首先不考虑强制要求的话是一个经典问题,令 \(f_{i, 0 / 1}\) 为 \(i\) 选或不选时以 \(i\) 为根的子树的最优答案.那么就有转移 \(f_{u, 0} = \sum f_{v, ...

  6. docker简介及安装(1)

    Docker简介 软件开发中最为麻烦的事情可能就是配置环境了.由于用户使用的操作系统具有多样性,即便使用跨平台的开发语言(如Java和Python)都不能保证代码能够在各种平台下都可以正常的运转,而且 ...

  7. Worms

    474B Worms time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  8. c++ 聚合/POD/平凡/标准布局 介绍

    目录 前言 聚合 POD(Plain Old Data) 平凡类型(TrivialType) 要求 平凡可复制(TrivialCopyable) 要求 对于某些函数的补充说明 平凡拷贝构造函数 符合条 ...

  9. iptTable规范

    规范之HTML 先在当前页面放入几个表格设置按钮的html(样式可能需重新调整) <div class="bottom_nav1 ta_l" style="padd ...

  10. 使用 Spring Cloud Jaeger 进行分布式跟踪

    在本文中,学习如何实现 Jaeger(基于 OpenTracing 和 Spring Boot 应用程序)以及如何使用 Jaeger UI 可视化跟踪. 介绍 在本文中,我们将探讨如何使用 Jaege ...