精华内容
下载资源
问答
  • tcp send函数发送的最大长度可以超过65535字节吗?.pdf
  • 背景:在写代码的过程中有一个非常非常复杂的方法,里面很多的业务逻辑,经过了很多代人的修改,有需要有需要对他进行修改,结果在修改的时候报错,方法达到65535字节的限制,如下图所示: 由于java使用...

    背景:在写代码的过程中有一个非常非常复杂的方法,里面很多的业务逻辑,经过了很多代人的修改,有需要有需要对他进行修改,结果在修改的时候报错,方法达到65535字节的限制,如下图所示:

     

    由于java使用UNICODE标准字符集,为16位,因此一共能表示2的16次方个字符,即65535个。
    由于java虚拟机的限制,在java中变量、方法的代码长度是不能大于65535字节的。

    在网上查阅资料主要有一下四种处理方式:

    1. 数据库

    这是最为传统的,也是大多数人第一想到到的办法了。

    2. 文件

    这其实是替代数据库的另一种方法了。

    3. 类

    将复杂的类细化为多个类。

    4. 方法

    将复杂的方法细化为多个方法。

    在我们日常搬代码的过程中,要注意公共的代码提取出来做公共方法做调用,尽量减少重复的代码,但有的业务场景太多太多,导致一个方法里面代码太长,需要根据具体的情景判断。

     

    展开全文
  • 查了很多资料,终于弄出来了,大于65535字节的没有测试,但是小于65535的测试通过下面是C#代码,其他代码根据此代码修改即可public static byte[] PackData(string message) { byte[] contentBytes = null;...
    网上搜了一下WebSocket的合包函数,发现不能直接使用。查了很多资料,终于弄出来了,大于65535字节的没有测试,但是小于65535的测试通过
    下面是C#代码,其他代码根据此代码修改即可
    public static byte[] PackData(string message) {
                byte[] contentBytes = null;
                byte[] temp = Encoding.UTF8.GetBytes(message);
                LogWrite("内容长度:" + temp.Length);
                if (temp.Length < 126) {
                    contentBytes = new byte[temp.Length + 2];
                    contentBytes[0] = 0x81;
                    contentBytes[1] = (byte)temp.Length;
                    Array.Copy(temp, 0, contentBytes, 2, temp.Length);
                } else if (temp.Length < 0xFFFF) {
                    contentBytes = new byte[temp.Length + 4];
                    contentBytes[0] = 0x81;
                    contentBytes[1] = 126;
                    contentBytes[2] = (byte)(temp.Length >>8);
                    contentBytes[3] = (byte)(temp.Length & 0xFF);
                    Array.Copy(temp, 0, contentBytes, 4, temp.Length);
                } else {
                    contentBytes = new byte[temp.Length + 10];
                    contentBytes[0] = 0x81;
                    contentBytes[1] = 127;
                    contentBytes[2] = 0;
                    contentBytes[3] = 0;
                    contentBytes[4] = 0;
                    contentBytes[5] = 0;
                    contentBytes[6] = (byte)(temp.Length >>24);
                    contentBytes[7] = (byte)(temp.Length >>16);
                    contentBytes[8] = (byte)(temp.Length >>8);
                    contentBytes[9] = (byte)(temp.Length & 0xFF);
                    Array.Copy(temp, 0, contentBytes, 10, temp.Length);
                }

                return contentBytes;
            }
    展开全文
  • Java方法体的字节数不能超过65535字节的原因是什么,还有方法参数不能超过255个是因为什么?
  • 由于java虚拟机的限制,在java中变量、方法的代码长度是不能大于65535字节的,针对此问题我总结了相关的解决办法。1. 数据库这是最为传统的,也是大多数人第一想到到的办法了。2. 文件这其实是替代数据库的另一种...

    由于java使用UNICODE标准字符集,为16位,因此一共能表示2的16次方个字符,即65535个。
     
    

    由于java虚拟机的限制,在java中变量、方法的代码长度是不能大于65535字节的,针对此问题我总结了相关的解决办法。

    1. 数据库

    这是最为传统的,也是大多数人第一想到到的办法了。

    2. 文件

    这其实是替代数据库的另一种方法了。

    3. 类

    将复杂的类细化为多个类。

    4. 方法

    将复杂的方法细化为多个方法。

    其实,介绍这四种方案并不是我本篇想要说的重点,而是要从程序性能的角度来诉述。有时一些相对静态的数据,虽然可以保存在数据库或文件里,但数据库和文件都要涉及到连接、io等性能问题,可能有人会说,我可以将静态数据预加载(即只获取一次,然后存入到静态变量里),但是数据量较大的数据都存入静态变量里,带来的就是系统对内存资源的消耗,在我看来同样是有取舍的。

    而如果放入到类或方法里,就能很好解决上述问题。java文件之间的调用,速度的瓶颈已经降低到了JVM级别,无论从速度上还是能耗上都会令你满意,从读取速度上,他绝对比读取数据库快很多。从能耗上,我们不必再将大量的数据放到静态变量里了,什么时候用什么时候new即可。

    条条大路通罗马,解决问题总是有着很多方法的,因此不要仅仅局限于“常理”,灵活运用技术才是成长的捷径。各位以后不放试试将一些数据以类或方法的形式去存储。

    在我即将发布第四版的日期工具类中,就是一个很好的例子。大家可以参考参考,细细品味其中的各种优点(速度、性能、能耗、耦合性等)。

    版权声明:本文为博主原创文章,未经博主允许不得转载。


    展开全文
  • 我一直在从各种文件中读取Java字节码,以帮助我理解该项目的.class文件,在该项目中,我需要与没有源代码且文档不多的第三方库集成. 出于我自己的娱乐,我在我的maven存储库中运行了Apache BCEL库,以查看在哪里使用了...

    我一直在从各种文件中读取Java字节码,以帮助我理解该项目的.class文件,在该项目中,我需要与没有源代码且文档不多的第三方库集成.

     

    出于我自己的娱乐,我在我的maven存储库中运行了Apache BCEL库,以查看在哪里使用了稀有的类和方法属性,例如类型注释,以及原因.

    我偶然发现了一个特定的jar的问题,该jar无法解码常量字段之一-特别是CONSTANT_Utf8_info.该库是icu4j-2.6.1.jar(com.ibm.icu:icu4j),特别是LocaleElements_zh__PINYIN.class文件. Apache BCEL失败(并且我自己尝试使用符合JVMS 8和9的快速字节码读取器)时遇到了同样的问题,即他们错误地读取了此常量,然后读取了下一个字节,该字节的值被视为错误的常量标签(0x3C / 60) .

    快速检查我是否可以在IDE中使用该类失败(无法解析符号).使用十六进制编辑器调查实际的字节码表明,该偏移量(0x1AC)处的常量是Utf8常量(tag = 0x01),长度为0x480E.向前移动文件中的该数量确实在该位置具有字节0x3C.直观地查看文件,我可以看到所讨论的常量在位置0x149BD处结束,这使字符串的实际长度为0x1480E(实际上是位置0x1AC的前三个字节).根据JVM类文件规范,这当然是不可能的,对于Utf8常量,最大长度为0xFFFF或65535.该类文件非常旧-版本46或Java 1.2.

    我仔细研究了该规范,并尝试了其他可能的实现方式(越来越严格)来解析此常量,但它无法解析该常量,或者破坏了对其他有效Utf8常量的读取.

    然后我的问题是,我错过了什么,还是编译器错误?在这种情况下,我的第二个问题是,这种情况一开始是怎么发生的-编译器往往会进行相对彻底的检查.最后,Java编译器通常如何管理长度超过65535字节的字符串文字?

    最佳答案

    既然您说过“类文件已经很旧了-版本46或Java 1.2”,则确实有可能由于当时的编译器在超出限制时不拒绝代码而简单地破坏了类文件.

     

    查看JDK-4309152 : # Compiler silently generates bytecode that exceeds VM limits

     

    The compiler does not properly enforce certain limits on the number or size
    of various classfile components. This results in code that appears to compile
    successfully, but fails at runtime during verification.

    These were originally reported as separate bugs, which have now been closed
    as duplicates of this one. The original bug numbers are included with each
    item below.

    1. There is a 64k limit on UTF-8 encoded strings. (4071592)

    据报道此错误已在1.3.1_10中修复,因此适合时间范围.

    请注意,所引用的错误#4071592涉及在尝试在1.2.0和更早版本中写入过大的字符串时引发UTFDataFormatException,但是#4303354报告在1.3.0中静默生成了无效的字符串.因此,如果有问题的类文件是由javac生成的,则它必须位于1.3.0和1.3.1_10版本之间,并带有-target 1.2.

    自修复以来,如果某些构造超出类文件/ JVM限制,则编译器的标准行为是生成编译器错误.


    Inm小程序商店

     

    Inm小程序商店收录了最新,最热门的微信小程序和微信小游戏,是国内内容最丰富的集小程序游戏、小程序分发、小程序推广为一体的综合性小程序门户网站之一。


    Vultr中文网

     

    最低 $2.5/月 的VPS, 稳定, 可靠

    展开全文
  • 那么, TCP包同样被IP包包住, 表面上看, 好像是TCP包不能超过65535字节, 所以send函数不能超过65535字节, 可实际呢?  先说结果, 实际上, 如果send函数的长度过大, 那么会分为多个tcp包来发, 如下: ...
  • 由于java虚拟机的限制,在java中变量、方法的代码长度是不能大于65535字节的,针对此问题我总结了相关的解决办法。 1. 数据库 这是最为传统的,也是大多数人第一想到到的办法了。 2. 文件 这其实是替代数据库的...
  • TCP的发送窗口为65535字节。试问:一可能达到的最大吞吐量是多少?信道的利用率是多少? 由发送时延=数据长度/信道带宽=655358bit/1Gb/s=0.5242810-3s=0.52428ms 来回的传播时延=10ms2=20ms 总时延=20.52428ms 所以...
  • Java单个方法代码长度不能多于65535字节,否则编译会出错!用sun的编译器是编译不过的。eclipse的编译器虽然能编译,但是编译的时候会出错,不过最后还是老老实实地给我生成了个.class文件。C:...
  • 一、假设 1、假设你工作了好多年,Java用的6的一批 2、假设偶然的机会,你遇到的大字符串的处理 3、假设你没有留意过String支持的最大长度 4、假设有一天,你无意中通过...String str = "[1]假设超过了65535.....
  • 打开tomcat Servers的web.xml配置文件 找到这段代码 &amp;lt;servlet&amp;gt; &amp;lt;servlet-name&amp;gt;jsp&amp;lt;/servlet-name&amp;gt; &.../servlet-class&
  • 网传udp传输单次sendto()数据需小于64kb,即65536个字节? 于是我想实测一番 测试结果: 单次传输65507字节正常: 超过65507字节报错: 参考文章:用实际程序来测试udp sendto函数的最大发包大小------为...
  • 字节

    2020-05-19 11:29:08
    字节 一个字节=8位(bit) 1个字节是8位,二进制8位:xxxxxxxx 范围从 00000000-11111111,表示0到255。...无符号(2字节) 0到65535 有符号(2字节) -32768到32765 无符号(4字节) 0到4294967295
  • ​ 1,mysql一条记录最大不能超过65535字节!(字段的长度加起来,不能超过这个值) ​ 2,长度单位是字符数,与编码是相关的! ​ 测试发现只有一个字段,而且是单字节字符集,还是不能是65535,原因是? ​ ...
  • !...图中pipe size = 8 * 512 bytes = 4kb = 4096 bytes 然而在测试的时候,一共发了65535个数据才堵住,这差别也太大了?? ![图片说明](https://img-ask.csdn.net/upload/201710/27/1509096883_230717.png)
  • 最大值是: 2^16 - 1 = 65535字节 2、因为是UDP,65535字节除去IP头的20个字节,除去UDP头的8个字节,那么: 最大可发送字节:2^16 - 1 - 20 - 8 字节 实际测试发送65507字节: #include <
  • 首先这是个误区,,TCP报文段并...长度 65495字节 是由于 数据报的长度是由 两个字节的标识决定的,其最大长度为65535字节,然后又需要封装TCP报头(至少20字节) 和ip头(至少20字节) 所以最大长度为65495字节 ...
  • 65507 字节 = 65535 - 20 - 8,是一个理论值。
  • 字节串和字节数组 字节串bytes (也叫字节序列) 作用:  存储以字节为单位的数据  字节串是不可变的字节序列  字节字节是由8个位(bit)组成的数据单位,是计算机进行数据管理的单位 字节是用 0 ~ 255 范围...
  • 4字节int 需要用2字节发送出去。数据不会超过65535 java要怎么弄? java 里有ushort 这种东西吗?可以直接发送2字节short 的。 我现在有一个数字是0xFFFF 要怎么用short 发出去呢? 简单点就是 int a=65535 ; ...
  • 转载地址 字段长度 ...  65535 http://www.cnblogs.com/zhoujinyi/p/3178558.html 总结:  1. 字段的长度指的是 无论是1个数字,字母,汉字,都1   CREATE TABLE `test` ( `id` int(10) uns
  • 两个字节,如果写入一个大于65535的数? Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiBase/html/delphi_20061220165725103.html 正常情况下FFFF为65535,如何突破呢? 突破不了了,想办法改成四个字节...
  • 我们知道, IP包的最大长度为65535个字节, 于是很多初学者会误解, 以为这65535字节的IP包数据, 是直接被数据链路层套上帧头和帧尾巴的。比如, 下图就容易让人产生一个极大的误解: 这幅图的最大误人子弟之...
  • 一、 字节串bytes1.1 什么是字节串作用 存储以字节为单位的数据 说明 1.字节串是不可变的字节序列 2.字节是0~255的整数 3.字节串存的是整数 创建空字节串的字面值 b = b’’ b绑定空字符串 可单引号、双引号、三...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 83,123
精华内容 33,249
关键字:

65535字节