- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
将现有的在 JDK6-8 下运行的 websocket 客户端部署到 Android (API 19) 会使客户端无法将 websocket 帧发送到服务器。
发生正常的 http 升级并且存在 http 连接,但使用 ChannelHandlerContext.writeAndFlush() 发送的任何消息都不会通过网络传输(我已通过服务器上的 Wireshark 确认了这一点)。
//来自 IClientConnection 的实现
public void sendBinaryMessage(FastByteArrayOutputStream 流)抛出异常{ 这个.lock();
try {
if (_logger.isTraceEnabled()) {
System.out.println("Sending binary Message:\n" + HexDump.hexDump(stream.toByteArray(), 20));
}
// recommended use when you already have an existing byte[] is to
// create the ByteBuf using Unpooled, not the PooledByteBufAllocator
ByteBuf buffer = Unpooled.wrappedBuffer(stream.getByteArray(), 0, stream.getSize());
BinaryWebSocketFrame binaryMessage = new BinaryWebSocketFrame(buffer);
String st = StringUtilities.toHexString(buffer.array());
_logger.debug("SENDING AUTH MESSAGE:" + st);
ChannelFuture promise = this.getWebSocket().writeAndFlush(binaryMessage);
promise.await();
_logger.debug("MESSAGE SENT");
} finally {
this.unlock();
}
}
日志输出
I/System.out: 14:24:18.605 [Client-EndpointMonitor-1] DEBUG io.netty.util.NetUtil - Loopback interface: lo (lo, ::1%1)
I/System.out: 14:24:18.615 [Client-EndpointMonitor-1] DEBUG io.netty.util.NetUtil - /proc/sys/net/core/somaxconn: 128
I/System.out: 14:24:18.738 [Client-EndpointMonitor-1] DEBUG io.netty.channel.DefaultChannelId - -Dio.netty.machineId: 90:68:c3:ff:fe:f1:ed:5c (auto-detected)
I/System.out: 14:24:18.751 [Client-EndpointMonitor-1] DEBUG io.netty.util.internal.ThreadLocalRandom - -Dio.netty.initialSeedUniquifier: 0x63ddb0bd5ba71d45
I/System.out: 14:24:18.835 [Client-EndpointMonitor-1] DEBUG io.netty.buffer.ByteBufUtil - -Dio.netty.allocator.type: unpooled
I/System.out: 14:24:18.842 [Client-EndpointMonitor-1] DEBUG io.netty.buffer.ByteBufUtil - -Dio.netty.threadLocalDirectBufferSize: 0
I/System.out: 14:24:18.850 [Client-EndpointMonitor-1] DEBUG io.netty.buffer.ByteBufUtil - -Dio.netty.maxThreadLocalCharBufferSize: 16384
I/System.out: 14:24:19.127 [NettyClient-NIO-1] DEBUG io.netty.buffer.AbstractByteBuf - -Dio.netty.buffer.checkAccessible: true
D/com.thingworx.sdk.android.activity.ThingworxActivity: Waiting for initial connection...
I/System.out: 14:24:19.135 [NettyClient-NIO-1] DEBUG io.netty.buffer.AbstractByteBuf - -Dio.netty.buffer.checkBounds: true
I/System.out: 14:24:19.145 [NettyClient-NIO-1] DEBUG io.netty.util.ResourceLeakDetectorFactory - Loaded default ResourceLeakDetector: io.netty.util.ResourceLeakDetector@2bea8c32
I/System.out: 14:24:19.595 [NettyClient-NIO-1] DEBUG com.thingworx.communications.client.connection.netty.NettyClientConnectionFactory - Adding compression handler to pipeline
I/System.out: 14:24:19.606 [NettyClient-NIO-1] DEBUG io.netty.handler.codec.compression.ZlibCodecFactory - -Dio.netty.noJdkZlibDecoder: true
I/System.out: 14:24:19.615 [NettyClient-NIO-1] DEBUG io.netty.handler.codec.compression.ZlibCodecFactory - -Dio.netty.noJdkZlibEncoder: false
D/com.thingworx.sdk.android.activity.ThingworxActivity: Waiting for initial connection...
I/System.out: 14:24:20.501 [NettyClient-NIO-1] DEBUG com.thingworx.communications.client.connection.netty.ThingworxClientConnectionHandler - WebSocket Channel is connected [is open: true]
D/com.thingworx.sdk.android.activity.ThingworxActivity: Waiting for initial connection...
I/System.out: 14:24:21.144 [NettyClient-NIO-1] DEBUG io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker13 - WebSocket version 13 client handshake key: AAX2bRU+jf63Fhyik0HAEg==, expected response: DOFv14sfAg0+tQcv2kuDguaF1Sw=
I/System.out: 14:24:21.190 [NettyClient-NIO-1] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.maxCapacityPerThread: 4096
I/System.out: 14:24:21.198 [NettyClient-NIO-1] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.maxSharedCapacityFactor: 2
I/System.out: 14:24:21.205 [NettyClient-NIO-1] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.linkCapacity: 16
I/System.out: 14:24:21.213 [NettyClient-NIO-1] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.ratio: 8
I/System.out: 14:24:21.830 [NettyClient-NIO-1] DEBUG com.thingworx.communications.client.connection.netty.ThingworxClientConnectionHandler - [ClientHandler: 911311818] Client websocket handshake is complete
I/System.out: 14:24:21.847 [Client-EndpointMonitor-1] INFO com.thingworx.communications.client.endpoints.ClientCommunicationEndpoint - Preparing new Connection Authentication Request: DispatchingClientEndpoint [id: 0, isConnected: false, open connections: 0, max connections: 1]
I/System.out: 14:24:21.864 [Client-EndpointMonitor-1] DEBUG com.thingworx.communications.common.endpoints.CommunicationEndpoint - Sending connection authentication message, waiting for response [sync key: 1, message: AuthRequestMessage [requestId: 1, endpointId: -1, sessionId: -1, method: AUTHREQUEST]]
D/com.thingworx.sdk.android.activity.ThingworxActivity: Waiting for initial connection...
D/com.thingworx.sdk.android.activity.ThingworxActivity: Waiting for initial connection...
I/System.out: 14:24:22.694 [Client-EndpointMonitor-1] DEBUG com.thingworx.communications.client.connection.netty.NettyClientConnection - SENDING AUTH MESSAGE:011400000001ffffffffffffffff0001066170704b65792461626630333663322d373030392d343436322d386139362d363033366565376562613533
D/com.thingworx.sdk.android.activity.ThingworxActivity: Waiting for initial connection...
I/Choreographer: Skipped 206 frames! The application may be doing too much work on its main thread.
I/System.out: 14:24:26.794 [Client-EndpointMonitor-1] DEBUG com.thingworx.communications.client.connection.netty.NettyClientConnection - MESSAGE SENT
请注意,MESSAGE SENT 是从 writeAndFlush() 返回 true 时的 promise 返回的
就预期结果而言,我希望二进制 websocket 消息通过网络发送出去,但它从来没有这样做过。
最佳答案
我有一个答案。
事实证明,在我的 ChannelFuture promise 中出现了一个类加载异常。因为没有记录类加载异常,对我来说就像没有发送我的消息一样。
这是个异常(exception):
Caused by: io.netty.handler.codec.EncoderException: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/jcraft/jzlib/Deflater;
at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:107)
at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:716)
at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:708)
at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:791)
at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:701)
现在很清楚,必须禁用 websocket 压缩(至少在短期内)以允许发送 websocket 流量。
我没有正确处理 promise 返回状态。
public void waitForChannelCompletion(ChannelFuture future, String operationMessage) throws IOException {
future.awaitUninterruptibly();
// Now we are sure the future is completed.
if (future.isDone()) {
if (future.isCancelled()) {
String errorMsg = String.format("Netty IO Operation has been cancelled [operation: %s]", operationMessage);
throw new IOException(errorMsg);
} else if (future.isSuccess() == false) {
String errorMsg = String.format("Netty IO Operation failed [operation: %s]", operationMessage);
throw new IOException(errorMsg, future.cause());
}
} else {
// future should be done, otherwise there's a problem
String errorMsg = String.format("Netty IO Operation is not done [operation: %s]", operationMessage);
throw new IOException(errorMsg);
}
}
ChannelFuture promise = this.getWebSocket().writeAndFlush(binaryMessage);
waitForChannelCompletion(promise,"MESSAGE SENT");
希望这能让其他人免于遇到类似的问题。
关于android - Netty websocket 客户端在 Android 设备上运行时从不发送 websocket 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57777035/
iphone设备UDID、iphone设备ID和iphone设备Token之间有什么区别? 通常,当我们使用苹果推送通知服务时,会使用 iPhone 设备 token 。 但我的目标只是识别唯一的 i
我们使用 firebase 从服务器向 Android 和 IOS 设备发送通知,并且我们使用旧版 FCM 发送通知。但是当我们的应用程序在后台时,通知由系统本身处理,因此我们无法通过应用程序处理它。
在 Google 上搜索后,我发现人们说只能通过“MFi 程序”将 iOS 设备与非 iOS 设备连接起来。这是真的吗? 我的项目主要集中于直接通过蓝牙与Arduino设备发送和接收信息。 iOS和非
所以我有一个通用应用程序,我正在设置 UIScrollView 的内容大小。显然,iPhone 和 iPad 上的内容大小会有所不同。如何为 iPad 设置某种尺寸,为 iPhone 和 iPod t
问题:如何在 pod 中使用连接到主机的原始设备作为 block 设备。 我尝试使用类型为“BlockDevice”的“hostPath” volumes: - my-data: hostPath
Implemented GCKDeviceScannerListener Singleton Class on ViewController, however its delegate methods
我有一个 (PhoneGap) 应用程序,它将成功获得 Passbook 通行证,并且还将成功接收与 Passbook 分开的推送通知(当伪造设备 ID 时)。 我遇到的问题是发送给注册设备的设备 I
我正在尝试找到一种方法,通过我目前正在使用的 iOS 应用程序访问我的信标的电池电量。我正在使用 Kontakt 的 iBeacon 设备。我浏览了 Estimote iOS SDK,他们提供了一种实
我正在努力让 CUDA 应用程序也能监控 GPU 的核心温度。可通过 NVAPI 访问该信息。 问题是我想确保在运行代码时监控的是同一个 GPU。 但是,似乎有信息表明我从 NvAPI_EnumPhy
从沙箱模式到生产模式,设备 token 有何不同? 我认为我已将一些设备 token 锁定为生产模式,并且无法将它们从开发中插入。 关于如何检查有什么想法吗? 最佳答案 当您使用开发证书构建应用程序时
目录 /run/user/1000/gvfs 和 ~/.gvfs 分别是空的和不存在的。我的图形文件管理器 (Thunar) 能够检测和访问设备的内部和外部存储器。 命令 gvfs-mount -l
我有一个 Android 平板电脑,它有一个迷你 USB 端口和一个 USB 端口,我想编写一个与 USB key 通信的应用程序。我写了一个demo来找出U盘,但是没有任何反应。 令我不安的是,如果
我们将 PHP 版本从 5.4.25 更改为 5.4.45,并在服务器上安装了 MS SQL 驱动程序。在更改服务器之前,一切正常,但在更改服务器之后,我遇到了 Web 服务问题。我们的身份验证 So
我想知道是否有人使用此 API 在 Android 设备上同时从 2 个后置摄像头捕获图像或视频:https://source.android.com/docs/core/camera/concurr
我正在为客户构建一个物联网解决方案,网络管理员坚持要求设备仅通过访客网络进行连接,该网络有一个强制门户,其中的服务条款必须通过按下 UI 按钮来接受,然后才能获得外部互联网访问。到目前为止,我见过的大
我无法弄清楚这里的格式规则..在我的示例中,代码行太多,无法为每行添加 4 个空格,因此这里是我需要帮助的代码的链接 http://nitemsg.blogspot.com/2011/01/heres
如果我在我的设备上接受推送通知,并且不保存设备 token ,那么我如何在自定义 View 中查看设备 token 或恢复警报 View ? 我删除了应用程序并重新安装,但看不到设备 token 警报
我试图找出在尝试并行比较和复制设备 block 与 pthreads 时我做错了什么。看起来我正在脱离同步并且比较阶段无法正常工作。任何帮助将不胜感激 #ifndef __dbg_h__ #defin
我刚刚写完所有这些内容,但这个红色的小栏告诉我我不能发布图片或两个以上的链接。因此,如果您可以引用 this Imgur album , 那简直太好了。谢谢。 我在这里相对较新,甚至对 android
我需要启用 mysql 常规日志并将其通过 nsf 移动到我系统中的另一个驱动器/设备! 所以,我在 my.cnf 中启用了它: general_log = 1 general_log_fi
我是一名优秀的程序员,十分优秀!