我目前有一个简单的TCP服务器,该服务器调用一个函数,并在每个新的传入数据包上以字节数组的形式将二进制TCP有效负载传递给它,解析它的正确方法是什么?

我试图通过将其切成不同的字节数组并分别进行处理来尝试执行此操作,但是我的数据包中包含一个可变长度的数据类型,无法将其与其他数据分开。 看来这不是我应该做的,而且我认为有更好的方法来做

readVarInt()是一个函数,用于分析可变长度数据类型并返回结果,并且未解析的数据类型的长度在int []数组中。PacketHeader是一个具有大小,id和主体字段,id和大小已被解析的类。并且body字段包含大小和id字节之后的所有其他内容

int[] parsedProtocolVersion = Main.readVarInt(packetHeader.body);

System.out.println(parsedProtocolVersion[0] + ' ' + parsedProtocolVersion[1]);

int[] parsedServerAddressSize = Main.readVarInt( packetHeader.body.subList(parsedProtocolVersion[1], packetHeader.body.size()));

System.out.println("parsed 1 " + parsedServerAddressSize[1] + " " + parsedServerAddressSize[0]);

String parsedServerAddress = String.valueOf(packetHeader.body.subList(parsedServerAddressSize[1], parsedServerAddressSize[0]));

System.out.println("parsed 2");

int parsedServerPort = Integer.parseUnsignedInt((packetHeader.body.subList(parsedServerAddressSize[1]+parsedProtocolVersion[1], parsedServerAddressSize[1]+parsedProtocolVersion[1]+2).toString()));

System.out.println("parsed 3");

int[] parsedNextState = Main.readVarInt(packetHeader.body.subList(parsedServerAddressSize[1]+parsedProtocolVersion[1]+2, packetHeader.body.size()));

System.out.println("parsed 4");

return String.format("%d %s %d %d",parsedProtocolVersion[0], parsedServerAddress, parsedServerPort, parsedNextState[0]);

java 解析数据包_java - 如何在Java中正确解析TCP数据包? - 堆栈内存溢出相关推荐

  1. java如何实取随机数_java - 如何在Kotlin中获取随机数?

    java - 如何在Kotlin中获取随机数? 可以在2个参数之间返回随机整数的通用方法,如ruby,可以使用rand(0..n). 有什么建议吗? 16个解决方案 208 votes 我的建议是In ...

  2. java 字符串转utc时间_java - 如何转换UTC日期字符串并删除Java中的T和Z? - 堆栈内存溢出...

    TL;博士 Instant.parse( "2018-05-23T23:18:31.000Z" ) // Parse this String in standard ISO 860 ...

  3. java canvas 画圆_java – 如何在Android中通过canvas绘制圆?

    我想画画圆.这里是我的代码: [MyActivity.java]: public class MyActivity extends Activity { public void onCreate(Bu ...

  4. java awt 关闭窗口_java – 如何在awt中关闭窗口?

    我在awt中创建一个小的应用程序,当我关闭窗口时,关闭按钮不起作用,但是我已经添加了关闭按钮的功能,之后关闭按钮不起作用- import java.awt.*; import java.applet. ...

  5. java 控件换行_Java – 如何在swing中添加换行符

    我正在为我的迷你游戏添加一个按钮,但我不知道如何换行.我想在按钮和文本之间有一个空格,这里是代码: JPanel panel1 = new JPanel(); JLabel label1 = new ...

  6. java hibernate 自定义排序_java – 如何在hibernate中对关联表进行排序?

    根据JPA规范: The property or field name must correspond to that of a persistent property or field of the ...

  7. java随机产生若干个偶数完成求和_java - 创建随机生成器以生成并计算奇数对偶数 - 堆栈内存溢出...

    我真的非常困惑. 我已经进行过几次网络搜索,但找不到任何可以帮助我解决这一精确作业问题的信息. 涉及:Java,while循环,随机生成数字和扫描仪控制台输入. 我们必须完成main方法中的代码,以便 ...

  8. java中方法未定义_java - Java SE中的未定义方法错误 - 堆栈内存溢出

    我为该问题写了一个代码http://www.spoj.com/problems/PRIME1/ ,该代码的作用是将输入以字符串形式输入,然后将split()拆分为两个整数,并存储在该数组中.然后返回到 ...

  9. java 单元测试 异步_java - 如何使用CountdownLatch对异步代码进行单元测试同步 - 堆栈内存溢出...

    我通过代码修改了公开我使用包保护函数注册的回调,如下所示: public void SomeClass { private final CountDownLatch latch = new Count ...

最新文章

  1. linux源码安装浏览器,Linux系统手动安装Firefox浏览器
  2. python urllib.request 爬虫 数据处理-python爬虫 urllib模块url编码处理
  3. 7.wait和waitpid
  4. 关闭浏览器后退出登录_chdbits打不开了,关闭了吗
  5. B端产品中,Web端表单如何设计
  6. 内部类 java 1614957119
  7. 华策影视:控股股东、实控人等拟合计减持不超4.01%股份
  8. linux下keytool生成证书_Keytool生成https证书步骤0014
  9. xx闪购-商品列表布局设计
  10. 物联网中常用到的DTU到底是什么?
  11. 数据库学习之MySQL (十一)—— 统计函数 COUNT MIN MAX AVG SUM
  12. Windows 10免费升级
  13. matlab 飞机大战小游戏
  14. 如何使用lerna管理你的仓库
  15. RSA非对称加密传输---前端加密解密(VUE项目)
  16. 升学教育过程中:关于收费、退费的规定
  17. 修改csdn博客的名称
  18. 二手车好大风,老平台都推新服务
  19. 新零售门店是什么 新零售门店如何建设 新零售门店案例
  20. NLP+2vec︱认识多种多样的2vec向量化模型

热门文章

  1. 网址收藏 2020.12.11
  2. GDB调试之ptrace实现原理
  3. 总线驱动:Bus driver - USB driver for example
  4. GTK实现:俄罗斯方块小游戏源代码(RussiaCube.c)
  5. 简单php修改mysql数据类型_MySQL入门很简单—MySQL数据类型
  6. latex中怎么设置每一行文字都对齐_排版系列教程 | LaTeX,为学术论文排版而生【浮动体篇】...
  7. Flink当中使用kafka Consumer
  8. C++预处理命令之文件包含和条件编译
  9. web前端基础(13js语法基础)
  10. 源代码src修改为本地图片_20 行 Python 代码批量抓取免费高清图片!