Javax Websocket 由于非法 UTF-8 序列而关闭

2024-03-02

我正在使用 javax.websocket API 用 Ja​​va 编写一个 Websocket 客户端,并且org.glassfish.tyrus作为实施。

通常一切正常,但有时,当我收到非常大的字符串时,连接会以神秘的“非法 UTF-8 序列”作为关闭原因关闭。

log.info("Ws closed cuz: " 
   + reason.getCloseCode() + " , " 
   + reason.getReasonPhrase() + " , " 
   + reason.toString());

Output:

INFO: Ws closed cuz: NOT_CONSISTENT , Illegal UTF-8 Sequence ,
CloseReason[1007,Illegal UTF-8 Sequence]

我猜测字符串太大,或者字符串包含与 UTF-8 不兼容的任何字符。

有没有办法获得有关导致此问题的实际字符串/数据包/帧的更多信息?或者,是否有办法告诉 tyrus 忽略任何编码问题,只将原始字符串传递给我并让我处理它?

如果没有,是否还有另一个 java websockets 客户端,它负责通过套接字传输字符串的基本工作,并且不进行任何验证,而只是让我处理响应?

感谢任何反馈。


以下只是猜测。

(1) 在服务器端,大字符串被分割成一个文本框架和一个或多个后续的延续框架。从技术上讲,将原始大字符串转换为字节数组,然后将字节数组拆分为多个子字节数组。子数组被一一设置为帧(=每一帧包含一个子字节数组)。

(2) 虽然不能保证每个子字节数组都是有效的UTF-8序列,但有效性检查要么在服务器端要么在客户端进行。如果是这样,那就是 Tyrus 的 bug。

WebSocketListener http://takahikokawasaki.github.io/nv-websocket-client/com/neovisionaries/ws/client/WebSocketListener.html of nv-websocket-客户端 https://github.com/TakahikoKawasaki/nv-websocket-client具有帧粒度的回调方法,例如onFrame, onTextFrame, onContinuationFrame和其他(请注意onTextMessage and onTextFrame是不同的),因此您可以检查那里每个帧的字节数组。

WebSocket websocket = new WebSocketFactory()
    .createSocket("ws://...")
    .addListener(new WebSocketAdapter() {
        @Override
        public void onFrame(WebSocket ws, WebSocketFrame frame) {
            // If the frame is a text frame with FIN bit cleared, or
            // if the frame is a continuation frame.
            if ((frame.isTextFrame() && frame.getFin() == false) ||
                frame.isContinuationFrame()) {
                // The payload of the frame. There is no guarantee
                // that this byte array is a valid UTF-8 sequence.
                byte[] payload = frame.getPayload();

                // Check whether the payload is a valid UTF-8 sequence
                // if you want to.
                checkPayload(payload);
            }
        }
    })
    .connect();

你为什么不使用nv-websocket-客户端 https://github.com/TakahikoKawasaki/nv-websocket-client检查您的 WebSocket 连接中发生了什么?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javax Websocket 由于非法 UTF-8 序列而关闭 的相关文章

随机推荐

  • Resharper - 说服管理层[重复]

    这个问题在这里已经有答案了 可能的重复 Reshaper 的业务案例 https stackoverflow com questions 2298308 business case for resharper 我刚刚毕业 正在为我的第一家公
  • 如何知道 MPMoviePlayerController 正在 Iphone OS 3.0 中播放

    我需要知道 MPMoviePlayerController 是否在特定时刻正在播放 在 iphone 3 0 中 它不会触发 MPMoviePlayerContentPreloadDidFinishNotification 有谁知道有什么解
  • IIS 自动启动未禁用空闲超时

    我在 Windows Azure Web 角色上设置 ASP NET 自动启动 我在 Windows Server 2012 上使用 ASP NET 4 5 和 IIS 8 我基本上是跟着那些指示 http www iis net lear
  • C++ 模板 template (双模板?)

    我想建立一个Stack类 因此用户将能够选择他想要使用哪个容器来实现Stack 例如 List Vector 部分代码 stack h ifndef STACK H define STACK H template
  • 设置H2密码

    在嵌入式模式下工作时如何设置自己的密码来访问 h2 如果有人感到困惑 谈论访问数据库的 root 密码 在 Eclipse 中 密码分配似乎是在创建数据库连接时发生的 这反过来又启动了模式创建过程 我们在其中提供用户名和密码 即使这是真的
  • 如何在更改密码时触发 Firebase 中的云功能?

    当用户更改密码时 我试图触发 Firebase 云功能 无论是 更改密码 firebase auth currentUser 更新密码 新密码 或通过重置它 firebase auth 发送密码重置电子邮件 电子邮件 由于我没有在任何地方存
  • 现代 C++ 中比较 double/float 是否相等的现代实践 [重复]

    这个问题在这里已经有答案了 if std abs double1 double2 lt std numeric limits
  • Powershell 编码默认输出

    我在 TFS 构建中运行的 powershell 脚本遇到以下问题 这两个问题都与 TFS 无关 可以使用简单的 powershell 命令行窗口重现 1 与TFS完全无关 看来 Powershell 在管道方面不喜欢德语元音变音 1a 这
  • 来自 XElement 的内部文本? [复制]

    这个问题在这里已经有答案了 我很难从 XElement 的内部文本中获取正确的值 首先 这是我正在使用的 XML 这是我们工作流程中某个流程产生的生产数据的副本 换句话说 我无法更改 XML 只能解析它 我想要获取其内部文本的元素内部包含看
  • 使用 JavaScript 从 Amazon Cognito API 中详尽选择所有用户的安全且可扩展的方法是什么?

    我是一个小团队的一员 在一个相当小的网站上工作 该网站拥有用户帐户 此时大约有100名用户 我们正在使用 Amazon Cognito 进行用户管理 我们的网站上有一个摘要页面 其中显示所有用户和各种属性的列表 表格 然而 有一个硬性限制
  • 使用 Go 和 Cloudformation 部署 AWS Lambda

    我正在自动部署基于 Go 的 AWS Lambda 但遇到了问题 我的 AWS 无服务器模板是 AWSTemplateFormatVersion 2010 09 09 Transform AWS Serverless 2016 10 31
  • 鼠标滚轮在容器内滚动 - 捕获事件

    我有一个带有内部可滚动 DIV 的页面 当我将鼠标悬停在它上面并尝试用鼠标滚轮滚动它时 该 DIV 的内容会根据需要滚动 而主页保持不变 但是当我到达 DIV 滚动区域的底部时 整个页面开始滚动 我尝试在该 div 上设置事件处理程序 但是
  • 如何在松散耦合的应用程序中将状态信息传递到 GUI

    我第一次尝试使用依赖注入来松散地耦合一个新应用程序 我的问题是如何将状态信息传递回用户 在过去 所有代码都塞进 GUI 中 虽然非常混乱且难以维护 但非常容易 课程的安排是这样的 请不要检查我的 UML 技能 它们不存在 如果我们走右手边
  • Google AMP 脚本与 jquery window.scroll 冲突

    我正在尝试遵循 Google 建议的 AMP 指南 ampproject org https www ampproject org 但是一旦我添加了他们的 js 脚本 jQuery 滚动就停止工作 有谁知道为什么以及如何解决它 AMP HT
  • 如何在 VS 单元测试中包含示例数据文件?

    我想要针对示例 XML 文件运行单元测试 我应该如何将这些文件暴露给单元测试 我尝试过使用内容构建操作 但我无权访问应用程序上下文 因此 GetContentStream 已退出 我知道我可以将 DataContext 用于 SQL 数据库
  • Setter 目标名称无法识别

    我是 WPF 的初学者 我尝试使用 DataTrigger 编写 WPF 部分 这里需要逻辑 If the variable iBottleCount gt 10 then make the background of a label gr
  • 我何时以及为什么应该清理 XCode 中的构建

    每隔一段时间 解决 XCode 中严重问题的方法就是点击 Product Clean 这似乎会清除一些缓存 问题就会消失 但它实际上在做什么 更重要的是 我应该什么时候这样做 在处理核心数据时似乎更频繁地需要它 但我并没有真正跟踪它 作为一
  • 基于比较的排序技术的局限性

    大多数需要对数据进行排序的场景都会选择比较排序 合并排序 快速排序 插入排序和其他比较排序等技术可以处理不同的数据类型 并且效率的下限为 O nLog n 我的问题是 基于比较的排序技术有任何限制吗 有哪些场景会使用非比较排序技术 chee
  • 将两个现有地块合并为一个地块

    我还没有真正尝试过任何方法来做到这一点 但我想知道是否有一种方法可以将已经存在的两个图合并到一个图中 任何投入将不胜感激 这是一个完整的最小工作示例 它介绍了从多个图中提取和组合数据所需的所有步骤 import numpy as np im
  • Javax Websocket 由于非法 UTF-8 序列而关闭

    我正在使用 javax websocket API 用 Ja va 编写一个 Websocket 客户端 并且org glassfish tyrus作为实施 通常一切正常 但有时 当我收到非常大的字符串时 连接会以神秘的 非法 UTF 8