接上文,这次主要讲下我所知道的ByteBuffer。
这个对象位于java.nio包,是一个缓冲区读写的类。
生成这个对象的方法一共有3个,代码如下:
ByteBuffer.allocateDirect(int capacity);
ByteBuffer.allocate(int capacity);
ByteBuffer.warp(byte[] array);
其中第一个和第二个差不多,都是生成一个对象,分配指定的内存,allocateDirect可能会表现的优秀点。这两个方法都比较耗性能,所以我在类中定义了一个ByteBuffer,方法中涉及的读写都对这个对象进行操作。
private ByteBuffer bb = ByteBuffer.allocateDirect(2048);
warp方法,将会返回一个新的ByteBuffer对象。当初我用这个方法来写数据,就奇怪数据怎么写了几百个字符莫名其妙就写不下了,明明给分配的2048的空间~~
后来终于给发现了这个问题,写数据要用ByteBuffer.put(byte[] src)。
可是put完了还不行,为什么呢?上文提到,是flip的问题。
且听我详细说来。ByteBuffer这个类内部维护着3个类似指针的数据,分别是当前操作位,最大限制,以及容量(这里很奇怪,最大限制和容量不知道啥区别)。put以后,当前操作位和大小是一样的,就是说当前操作的是数组最末尾。flip方法做的是,把最大限制给置到当前操作位,然后把当前操作位给置0。
改完了以后发现,从socket读数据的时候,内存溢出了。
又是个奇怪的问题,调试过程就不累述了,讲下最后结果。
原来的代码如下:
public String send(String s) {
try {
bb.put(s.getBytes());
bb.flip();
socket.write(bb);
bb.flip();
bb.clear();
return getResponseMessage();
} catch (IOException e) {
e.printStackTrace();
}finally{
bb.flip();
}
return "";
}
到clear以后,一切正常,到finally里面,再执行了一下flip,最大限制就变0了,就是说,这个对象废了,再也写不进去任何东西。。。
真是纠结呀,删掉最后个flip后,终于OK了~~
分享到:
相关推荐
本篇文章将详细讲解“C# Socke同步套接字字符串传送”,帮助初学者理解如何在C#中使用Socket进行同步通信。 首先,我们来了解一下什么是Socket。Socket是网络通信中的一个端点,它允许应用程序通过网络发送和接收...
本篇文章将详细讲解如何使用AXIS接口来传输图片等二进制文件。 首先,我们需要理解Web服务的基本概念。Web服务基于开放标准,如SOAP(Simple Object Access Protocol)和WSDL(Web Services Description Language)...
3. **ByteBuf**:Netty的ByteBuf是替代Java NIO ByteBuffer的高效字节缓冲区,提供了一种更友好的API,支持零拷贝和内存池,减少了内存分配和释放的开销。 4. **ChannelHandler**:这是Netty处理I/O事件的核心组件...
本篇将详细探讨这两种协议在指令传输接收和协议解析中的应用,以及如何使用Java Socket进行相关操作。 首先,TCP是一种面向连接的、可靠的传输协议,它确保了数据的顺序传输和无丢失性。TCP通过三次握手建立连接,...
本篇文章将深入探讨如何在Android应用中实现TCP协议进行文件的发送与接收。 首先,我们需要创建一个Socket连接,它是TCP通信的基础。在Android中,我们可以使用`java.net.Socket`类来创建客户端Socket,`...
5. **IP地址与端口号**:IP地址标识网络上的设备,端口号区分同一设备上的不同服务。 在Java中实现TCP/IP通信,需要理解Socket编程的基本概念。`Socket`类代表一个网络连接,`ServerSocket`用于监听客户端连接请求...
总之,“DotNetty系列二:基本使用”这篇博客通过“Lession1”代码实例,旨在帮助读者理解并掌握DotNetty的基本操作,包括服务器和客户端的创建、自定义处理器的编写、数据的读写以及异步事件处理。通过学习这些内容...
每个方向上的数据都封装在一个WebSocket帧中,其头部非常简洁,通常只有2个字节左右。 3. **关闭连接**:当任意一方决定关闭连接时,可以通过发送特殊的关闭帧来通知另一方。 #### 四、示例代码解析 以下是一个...
本篇文章将深入探讨如何使用Java NIO(非阻塞I/O)来实现阻塞多线程通信,这对于高性能服务器端应用尤其重要。我们将会分析`EchoServer.java`、`EchoClient.java`和`SocketUtils.java`这三个文件中的关键知识点。 ...
缓冲区有多种类型,如ByteBuffer、CharBuffer、IntBuffer等,它们都是抽象类Buffer的子类。缓冲区具有容量、位置、限制和标记等属性,这些属性使得对数据的操作更加可控和高效。 在【第3节】 Java NIO流-缓冲区操作...
ByteBuffer buffer = ByteBuffer.wrap("Hello Server!".getBytes()); client.write(buffer); // 接收数据 buffer.clear(); int bytesRead = client.read(buffer); String received = new String(buffer.array(), 0,...
本篇文章将详细介绍如何在Android平台上利用Socket实现视频的实时传输,并通过多线程技术支持多用户的视频聊天功能。这种方式不仅能够确保数据传输的实时性,还能提高系统的并发处理能力。 #### 原理与实现 ##### ...
本篇文章将深入探讨Netty的原理,并通过实例帮助你快速入门和提高。 1. **Netty的基本概念** - **NIO(Non-blocking I/O)**:Netty是基于Java NIO构建的,NIO允许单线程处理多个通道,减少了线程创建和销毁的开销...
在本篇中,我们将深入探讨ServerChannel这一核心概念,它是Netty中用于接收客户端连接的组件,是服务端程序的核心组成部分。 1. **ServerBootstrap**:在Netty中,创建ServerChannel的第一步是实例化一个`...
本篇将基于给定的标题“采用NIO实现一个Socket服务器”来详细阐述如何使用NIO进行Socket服务端的开发。 首先,理解NIO的核心概念: 1. **通道(Channel)**:通道是连接到I/O设备的途径,可以读取或写入数据。常见的...
本篇文章将详细讲解如何利用Java的Socket和多线程技术来实现整个文件夹的传输。 首先,理解Socket通信的基本原理。Socket是网络通信中的端点,它允许两个程序通过网络连接进行数据交换。在Java中,`java.net.Socket...
- **创建缓冲区**:使用静态工厂方法创建缓冲区实例,例如 `ByteBuffer.allocate(1024)` 创建一个容量为 1024 字节的 `ByteBuffer`。 - **操作方法**:`put()` 方法用于向缓冲区写入数据,`get()` 方法用于从缓冲...
本篇文章将深入探讨网络编程中服务端优化的关键点,特别是针对"粘包分包"问题的解决策略。 "粘包分包"现象在网络通信中常常出现,主要发生在基于TCP协议的通信中。TCP协议为了提高传输效率,会将多个小的数据段合并...
2. **类型化**:Java NIO提供多种类型的缓冲区,如ByteBuffer、CharBuffer、IntBuffer等,分别对应不同的数据类型。 3. **位置与限制**:缓冲区有两个重要的属性——位置(position)和限制(limit)。位置表示当前...
本篇阅读笔记主要围绕Netty的核心组件和原理进行详细分析。 首先,ChannelBuffer是Netty中用于网络数据交换的字节容器。在Netty中,所有的网络数据都是通过ChannelBuffer进行读写的。它的作用类似于Java NIO中的...