您的位置:首页 > 编程语言 > Java开发

Java Socket详解(一)

2016-03-17 19:04 441 查看
一、缓冲区

1.简单的介绍

缓冲区是包在一个对象内的基本数据元素数组。 Buffer 类相比一个简单数组的优点是它将关于数据的数据内容和信息包含在一个单一的对象中。 Buffer 类以及它专有的子类定义了

一个用于处理数据缓冲区的 API。

2.属性介绍

容量( Capacity)
缓冲区能够容纳的数据元素的最大数量。这一容量在缓冲区创建时被设定,并且永远不能

被改变。

上界( Limit)
缓冲区的第一个不能被读或写的元素。或者说,缓冲区中现存元素的计数。

位置( Position)
下一个要被读或写的元素的索引。位置会自动由相应的 get( )和 put( )函数更新。

标记( Mark)
一个备忘位置。调用 mark( )来设定 mark = postion。调用 reset( )设定 position =mark。标记在设定前是未定义的(undefined)。

这四个属性之间总是遵循以下关系:

0 <= mark <= position <= limit <= capacity。

3.缓冲区API

public abstract class Buffer {
public final int capacity( )
public final int position( )
public final Buffer position (int newPositio
public final int limit( )
public final Buffer limit (int newLimit)
public final Buffer mark( )
public final Buffer reset( )
public final Buffer clear( )
public final Buffer flip( )
public final Buffer rewind( )
public final int remaining( )
public final boolean hasRemaining( )
public abstract boolean isReadOnly( );

}

4.存取

public abstract class ByteBuffer extends Buffer implements Comparable{
// This is a partial API listing
public abstract byte get( );
public abstract byte get (int index);
public abstract ByteBuffer put (byte b);
public abstract ByteBuffer put (int index, byte b);

}

Get 和 put 可以是相对的或者是绝对的。在前面的程序列表中,相对方案是不带有索引参数的函数。

当相对函数被调用时,位置在返回时前进一。如果位置前进过多,相对运算就会抛 出 异 常 。

对 于 put() , 如 果 运 算 会 导 致 位 置 超 出 上 界 , 就 会 抛 出BufferOverflowException 异常。

对于 get(),如果位置不小于上界,就会抛出BufferUnderflowException 异常。绝对存取不会影响缓冲区的位置属性,

但是如果您所提供的索引超出范围(负数或不小于上界),也将抛出 IndexOutOfBoundsException 异常。

5.填充

6.翻转

Flip()函数将一个能够继续添加数据元素的填充状态的缓冲区翻转成一个准备读出元素

的释放状态。在翻转之后,图 2.4 的缓冲区会变成图 2.5 中的样子。

7.释放

布尔函数 hasRemaining()会在释放缓冲区时告诉您是否已经达到缓冲区的上界。以下

是一种将数据元素从缓冲区释放到一个数组的方法(在 2.1.10 小节中,我们将学到进行批量

传输的更高效的方法)。

for (int i = 0; buffer.hasRemaining( ), i++) {
myByteArray [i] = buffer.get( );

}

8.比较

有时候比较两个缓冲区所包含的数据是很有必要的。所有的缓冲区都提供了一个常规的

equals( )函数用以测试两个缓冲区的是否相等,以及一个 compareTo( )函数用以比较缓冲区。

public abstract class ByteBuffer extends Buffer implements Comparable{
// This is a partial API listing
public boolean equals (Object ob)
public int compareTo (Object ob)

}

两个缓冲区可用下面的代码来测试是否相等:

if (buffer1.equals (buffer2)) {
doSomething( );

}

9.创建缓冲区

CharBuffer charBuffer = CharBuffer.allocate (100);

这段代码隐含地从堆空间中分配了一个 char 型数组作为备份存储器来储存 100 个 char变量。

如果您想提供您自己的数组用做缓冲区的备份存储器,请调用 wrap()函数:

char [] myArray = new char [100];

CharBuffer charbuffer = CharBuffer.wrap (myArray);

10.字节缓冲区

ByteBuffer byteBuffer = ByteBuffer.allocate(100);

二、Socket通道

package java.nio.channels;

public interface Channel{
public boolean isOpen( );
public void close( ) throws IOException;

}

1.本节中我们会看到,再也没有为每个 socket 连接使用一个线程的必要了,

也避免了管理大量线程所需的上下文交换总开销。借助新的 NIO 类,一

个或几个线程就可以管理成百上千的活动 socket 连接了并且只有很少甚至

可能没有性能损失。

2.只要调用 configureBlocking( )方法即可,传递参数值为 true 则设为阻塞模式,

参数值为 false 值设为非阻塞模式。真的,就这么简单!您可以通过调用 

isBlocking( )方法来判断某个 socket 通道当前处于哪种模式

SocketChannel sc = SocketChannel.open( );

sc.configureBlocking (false);//非阻塞

3.ServerSocketChannel

ServerSocketChannel 是一个基于通道的 socket 监听器。它同我们所熟悉的 java.net.ServerSocket

执行相同的基本任务,不过它增加了通道语义,因此能够在非阻塞模式下运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket java buffer 索引