最近有个socket通信项目,我用了netty,可是后来发现传送字符串过长时,字符被截了,
后来一查发现有LengthFieldBasedFrameDcoder这个encode,可是用了出错,我的要求是
传输时用字符串
以下是我改了之后的代码:
1./**
2. * 消息解码器
3. *
4. */
5.public class MessageDecoder extends LengthFieldBasedFrameDecoder {
6.
7. public MessageDecoder(int maxFrameLength, int lengthFieldOffset,
8. int lengthFieldLength, int lengthAdjustment, int initialBytesToStrip) {
9.
10. super(maxFrameLength, lengthFieldOffset, lengthFieldLength,
11. lengthAdjustment, initialBytesToStrip);
12. }
13.
14. @Override
15. protected Object decode(ChannelHandlerContext ctx, Channel channel,
16. ChannelBuffer buffer) throws Exception {
17.
18. ChannelBuffer frame = (ChannelBuffer) super.decode(ctx, channel, buffer);
19. if (frame == null) {
20. return null;
21. }
22.
23. byte[] bytes = new byte[frame.readInt()];
24. frame.readBytes(bytes);
25.
26. String content = new String(bytes);
27. return content;
28. }
29.
30. @Override
31. protected Object decodeLast(ChannelHandlerContext ctx, Channel channel,
32. ChannelBuffer buffer) throws Exception {
33.
34. return this.decode(ctx, channel, buffer);
35. }
36.
37.}
1./**
2. * 消息编码器
3. *
4. */
5.public class MessageEncoder extends LengthFieldPrepender {
6.
7. public MessageEncoder(int lengthFieldLength) {
8. super(lengthFieldLength);
9. }
10.
11. @Override
12. protected Object encode(ChannelHandlerContext ctx, Channel channel,
13. Object obj) throws Exception {
14.
15. ChannelBuffer ob = ChannelBuffers.dynamicBuffer(channel.getConfig().getBufferFactory());
16.
17. String message = (String)obj;
18.
19. byte[] strBytes = message.getBytes();
20. ob.writeInt(strBytes.length);
21. ob.writeBytes(strBytes);
22.
23. return super.encode(ctx, channel, ob);
24. }
25.
26.}
01.bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
02. public ChannelPipeline getPipeline() throws Exception {
03. ChannelPipeline pipeline = new DefaultChannelPipeline();
04. pipeline.addLast("decoder", new MessageDecoder(Integer.Max_Value,0,4,0,4));
pipeline.addLast("encoder", new MessageEncoder(4));
05. pipeline.addLast("handler", new Handler);
06. return pipeline;
07. }
08. });
我原来是这样的(下面是手打的,可能有出入),运行正常的:
01.bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
02. public ChannelPipeline getPipeline() throws Exception {
03. ChannelPipeline pipeline = new DefaultChannelPipeline();
04. pipeline.addLast("decoder", new StringDecoder));
pipeline.addLast("encoder", new StringEncoder);
05. pipeline.addLast("handler", new Handler);
06. return pipeline;
07. }
08. });
但是长字符串不行了,后来网上查了,就改成上面的,但是出错,求高手出现
-
netty长字符串传输问题5
2013年4月27日 19:27
相关推荐
通过打印接收到的字节数组和解码后的字符串,可以帮助定位问题。 总结,Netty中的进制转换乱码问题通常源于字符编码不一致或处理不当。解决此类问题的关键在于确保数据的发送和接收端都采用相同的字符编码,正确...
在传统的HTTP或FTP等协议中,数据通常以字符串或二进制流的形式进行传输。然而,Netty允许开发者直接传输Java对象,这是通过序列化和反序列化机制实现的。Netty提供了`ObjectEncoder`和`ObjectDecoder`这两个编解码...
通过 `ByteBuf` 的方法,如 `readByte()`、`writeByte()`、`readInt()` 和 `writeInt()` 等,可以读取或写入二进制数据,并可以转换为16进制字符串。 3. **16进制字符串到字节的转换** 当接收到16进制字符串时,...
总结来说,Netty 的编码和解码功能是其强大之处,它简化了二进制数据和字符串在网络传输中的处理,特别是 AMF3 这种高效序列化格式的处理。通过深入理解和使用 Netty 的编码器和解码器,开发者能够构建出高效、可靠...
标题中的“Netty实现Java服务端和C#客户端联通”是指使用Netty作为Java服务器框架,与C#客户端(使用DotNetty库)进行通信的一种技术实现。这涉及到跨平台的网络通信,以及两个不同编程语言间的交互。 Netty是Java...
例如,TimeServer 和 TimeClient 可能会使用这些编解码器来解析时间戳字符串的边界。 标签提到的“源码”意味着深入理解 Netty,需要查看其源代码。Netty 的源代码清晰且注释丰富,对于学习和调试都非常有帮助。...
在"服务端Netty搭建"这个主题中,我们将深入探讨如何利用Netty来创建一个能够处理文件传输和JSON格式字符串交互的服务端。 首先,Netty的核心概念是基于Reactor模式,它允许服务端同时处理多个客户端连接,而无需为...
同时,也需要一个Encoder来处理消息的编码,将字符串或消息对象转化为适合网络传输的格式。 在连接管理方面,Netty支持自动重连功能。当客户端与服务器的连接中断时,可以通过设置心跳机制和重连策略来尝试重新建立...
5. **客服模块**:在客服系统中,Netty和Socket.IO可以帮助快速建立实时的客户支持通道,客服人员可以通过该系统及时回应客户的问题,提高服务效率。 6. **广告推送**:实时的广告推送需要快速、可靠的数据传输。...
Netty 提供了多种编解码器,如 `StringDecoder` 和 `StringEncoder`,可以方便地将字符串数据转换成 ByteBuf(Netty 的字节缓冲区),反之亦然。在本示例中,可能已经使用了这些编解码器来处理消息。 为了实现实时...
在这个方法中,我们将接收到的 ByteBuf 转换为字符串,然后使用 JSON 库解析这个字符串: ```java public class JsonDecoderHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead...
6. **编码与解码**:Netty提供了一系列的编解码器,如LengthFieldBasedFrameDecoder用于拆分帧,StringDecoder用于字符串解码,使得处理不同格式的数据变得更加简单。 7. **心跳机制**:Netty支持自定义心跳包,...
Netty提供了一些预定义的编解码器,如StringDecoder和StringEncoder,可以方便地处理字符串数据。 **通信封装** 为了方便用户使用,本Demo可能对Netty的通信过程进行了封装。这可能包括: 1. 创建ServerBootstrap...
在解析JSON时,我们可以使用Jackson或Gson库,将接收到的字符串转换为对应的Java对象。 SCANFISH-II型声呐系统数据接口协议可能定义了特定的数据格式和字段,这些信息需要在解析过程中得到理解和处理。这可能包括声...
你需要创建一个自定义的`ChannelInboundHandlerAdapter`,并在其中处理`channelRead`事件,这里就是将接收到的ByteBuf(Netty中的数据容器)转换为JSON字符串,然后反序列化为Java对象。 ```java public class ...
在Java中,可以使用如Jackson或Gson库将Java对象序列化为JSON字符串,反之亦然。例如,如果你有一个Java对象表示业务数据,可以使用这些库将其转换为JSON格式的字符串,然后作为HTTP请求体发送。服务器端收到JSON...
5. **编码解码器** - Netty 提供了一系列预定义的编码器和解码器,如StringDecoder 和 StringEncoder 分别用于字符串的解码和编码。StringProtobufBase64Object 类可能是自定义的编码解码器,结合了字符串、protobuf...
在Handler中,我们可以定义心跳包的格式,比如发送一个特定的字节序列或字符串。 3. **心跳检测逻辑**:在Handler中,我们需要维护一个心跳计时器,当接收到对方的心跳包时重置计时器。如果在指定时间内未收到心跳...
- `StringEncoder` 和 `StringDecoder`:用于处理字符串类型的编解码。 #### 4. Handler Modules - **简介**:Handler模块包含了各种处理器,用于处理特定类型的事件。 - **关键类与接口**: - `...
心跳包可以是简单的字符串或预设的特殊数据结构。 5. **安全传输**: - 为了确保数据的安全性,可能需要在Netty中集成SSL/TLS支持,实现加密通信。 6. **多路复用**: - Netty的NIO(Non-blocking I/O)模型支持...