如何做一个国产数据库一
如何做一个国产数据库二
如何做一个国产数据库三
如何做一个国产数据库四
如何做一个国产数据库五
如何做一个国产数据库六

server端协议定义

再次强调一下我们的protocol 应用层的协议,其中协议第一个字节的前两位如下所示
//1字节 2位
//00 发布数据
//01 订阅数据
//10 心跳数据
//11 返回数据
所以服务端在接收到头部字节结束后,可以知道客户端时订阅客户端还是发布了

 int on_headers_complete(void* param) {//client_t* pclient = (client_t*)param;printf("the header len is %d\n", pclient->recvlen);//printf("the id is %04x\n", getid(pclient));client_t* cl = (client_t*)param;//得到头部字节char head = cl->head[0];char type = head >> 6;switch (type){case 0x00://00 发布数据//放入发布列表cout << "publish" << endl;break;case 0x01://01 订阅数据//放入订阅列表cout << "subscribe" << endl;break;case 0x02://10 心跳数据cout << "heartbeat" << endl;break;}return 0;}

接下去,就可以把订阅和发布客户端分别放到不同的队列里面去了,暂时不讲这些,先讲如何使用java做我们的订阅客户端,java最常用的就是netty,下面我们使用netty来做一个客户端。以下是tcpclient.java

import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.channel.ChannelPipeline;
public class TcpClient {// 要请求的服务器的ip地址private String ip;// 服务器的端口private int port;public TcpClient(String ip, int port){this.ip = ip;this.port = port;}// 请求端主题private void action() throws InterruptedException {EventLoopGroup bossGroup = new NioEventLoopGroup();Bootstrap bs = new Bootstrap();bs.group(bossGroup).channel(NioSocketChannel.class).option(ChannelOption.SO_KEEPALIVE, true).handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel socketChannel) throws Exception {              ChannelPipeline p = socketChannel.pipeline();p.addLast(new MessageDecodeClient(255, 6, 1));// 处理来自服务端的响应信息socketChannel.pipeline().addLast(new TcpClientHandle());}});// 客户端开启ChannelFuture cf = bs.connect(ip, port).sync();byte[] respByte = new byte[6];//....以下为协议写入省略,请注意自行写出,若有问题,可以探讨// 发送客户端的请求cf.channel().writeAndFlush(Unpooled.copiedBuffer(respByte));// 等待直到连接中断cf.channel().closeFuture().sync();      }public static void main(String[] args) throws InterruptedException {new TcpClient("127.0.0.1", 8054).action();}}

以下为解码函数

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;/*** @author qianbo 协议重写成java*/
public class MessageDecodeClient extends LengthFieldBasedFrameDecoder {private static final int hsize = 6;public MessageDecodeClient(int maxFrameLength, int lengthFieldOffset, int lengthFieldLength) {super(maxFrameLength, lengthFieldOffset, lengthFieldLength);}@Overrideprotected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {if (in == null) {return null;}if (in.readableBytes() < hsize) {return null;}in.markReaderIndex();byte magic = in.readByte(); //头部字节0x69byte titlelen = in.readByte(); //四字节大端ID号码int dataLength = in.readIntLE();dataLength += titlelen;if (in.readableBytes() < dataLength) {in.resetReaderIndex();return null;}//钱波 :根据协议加上titlelen 和 数据lenbyte[] data = new byte[dataLength]; in.readBytes(data);String body = new String(data, "UTF-8");return body;}
}

处理的TcpClientHandle .java

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;public class TcpClientHandle extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {//  empty//可做一些工作}/** 建立连接时,返回消息*/@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {System.out.println("连接的客户端地址:" + ctx.channel().remoteAddress());ctx.writeAndFlush("客户端"+ InetAddress.getLocalHost().getHostName() + "成功与服务端建立连接! \n");super.channelActive(ctx);}/*** 客户端断开*/@Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {System.out.println("channelInactive");}/*** 异常*/@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {cause.printStackTrace();}}

以上为主要的框架,读者可以根据基础自行写出,后面我也会补充写完整,希望能给您有所启发。

如何做一个国产数据库(七) 网络传输 java做订阅客户端相关推荐

  1. 如何做一个国产数据库(六) 网络传输 nodejs做测试客户端

    如何做一个国产数据库一 如何做一个国产数据库二 如何做一个国产数据库三 如何做一个国产数据库四 如何做一个国产数据库五 网络实战服务器 我们再四中说过使用tcp进行协议的链接,对我们所定义的协议如果有 ...

  2. 如何做一个国产数据库(三)

    一和二 如何做一个国产数据库一 如何做一个国产数据库二 1.数据结构重新定义 再次重新定义数据结构 typedef struct sdata {uint32_t index;char vardata[ ...

  3. 如何做一个国产数据库(二)

    如果做一个国产数据库一链接 承接上文,继续 1.重新定义数据结构 typedef struct sdata {uint32_t index;char vardata[128]; }sdata;type ...

  4. 如何做一个国产数据库(四)

    网络 这次要用到网络了,存储的时候我们都使用网络来输入输出,当然,像本机是可以使用进程间通信的,不过为了简单,我们此次都使用tcp协议. 协议 此次使用libuv来做网络的传输,我们首先定一个协议,做 ...

  5. 如何做一个国产数据库系统(一)

    做国产数据库之二 做一个国产数据库 做一个数据库系统真的是要懂的是基础,各种基础,网络,文件系统,操作系统,性能,测试,各方面都要懂 使用基本方法 索引文件+数据文件+ B+ 树 ,hash空间 如图 ...

  6. 动手做一个自组网的网络 - 操作系统内核

    动手做一个自组网的网络 - 操作系统内核 动手做一个自组网的网络 - 项目介绍 动手做一个自组网的网络 - 硬件开发板 动手做一个自组网的网络 - 操作系统内核 动手做一个自组网的网络 - 网络协议栈 ...

  7. [VB.NET]想做一个小界面,不知用什么做

    <script type="text/javascript"></script> <script type="text/javascript ...

  8. 想做一个成功的女性,首先要做一个好女人

    第一,我觉得一个好女人,一个真正最后通过一生的努力能够达到一个目标的女人,她是一个幸福的女人.所以说我觉得要做一个好女人.做一个幸福的女人,首先是要做一个有爱的女人. 因为只有爱她才是生命的核心,才是 ...

  9. 同r做一个窗口_怎样在触摸屏上做一个自定义的弹出窗口?

    在触摸屏的应用中,一些故障.警告等提示信息通常是使用系统的报警窗口来实现.系统的报警窗口通常只有故障/警告的编号.日期时间及报警信息等内容,并且可以被折叠.这种千篇一律的报警窗口有时候并不能满足项目的 ...

最新文章

  1. 全球智能驾驶产业全景图
  2. 我的面试标准:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架!...
  3. SaltStack安装Redis-第十篇
  4. 图片压缩工具optipng/jpegoptim安装
  5. 如何将网格式报表打印成其它样式
  6. UE4_下载源码并编译
  7. Delphi 2007 先睹为快
  8. 秒杀或游戏让电脑时间与阿里淘宝时间同步的完整方法
  9. CF909B Segments
  10. ps抠图基础篇:最常用的四种抠图方法
  11. CAD三维图形转化成二维图形的过程具体的步骤
  12. POI中设置Excel单元格格式样式(居中,字体,边框,背景色、列宽、合并单元格等)
  13. clickhouse建表异常 DB::Exception: No macro ‘shard‘ in config
  14. throws和throw的作用
  15. 苹果平板可以用html么,哪些苹果平板可以用苹果笔
  16. 数据库学习:数据模型
  17. LED模拟与数字调光
  18. 5g的云计算机,三家运营商怎样看待云计算和5G的关系?
  19. 30天自制操作系统:第十天 叠加处理
  20. 《精益数据分析》第十章:商业模式三免费移动应用

热门文章

  1. 什么是Azure Data Lake
  2. Python3 爬虫(一)-- 简单网页抓取
  3. 京东到家 415同城购物节开启中百仓储武汉门店单日破千单
  4. Model 3车主对FSD套件不满意 德国法院下令特斯拉回购汽车
  5. 因虚假广告,顺丰被罚!
  6. Redmi K50系列年后登场:最高搭载天玑9000+2K直屏
  7. 苹果允许员工公开讨论薪资引热议...
  8. 造假暴赚260亿的资本“大忽悠”,终于倒下了
  9. 华为P50 Pro+最新渲染图曝光:双环形相机模组内有乾坤
  10. 华为HarmonyOS 2.0 手机开发者Beta版发布