# socket **Repository Path**: mr_sen/socket ## Basic Information - **Project Name**: socket - **Description**: java socket学习代码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-09-16 - **Last Updated**: 2024-02-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于tcp和udp的bio的网络链接 ## tcp的socket关键类 - `ServerSocket`: 此类实现服务器套接字。 服务器套接字等待通过网络传入的请求。 它根据该请求执行一些操作,然后可能将结果返回给请求者 - `InetSocketAddress` 由主机名,IP地址,端口号,组成的能唯一标志一个网络地址。 主机名+端口号; ip地址+端口号,可以用这两种方式初始化一个InetSocketAddress - `Socket`两台机器之间通信的端点。 有一个`SocketImpl` 的成员变量,用来进行服务端和客户端数据通信 ## udp `DatagramSocket。`此类表示用于发送和接收数据报包的套接字。 `DatagramPacket`这个类代表一个数据报包。用于实现无连接的数据包传递服务。 每条消息从一台机器路由到另一台机器,仅基于该数据包中包含的信息。 从一台机器发送到另一台机器的多个数据包可能会以不同的方式路由,并且可能以任何顺序到达。 不保证包裹递送 # nio ## Java NIO 由以下几个核心部分组成,还有其他组件(pipe、filelock) - Channel(双向的,既可以用来进行读操作,又可以用来进行写操作) 主要有如下: FileChannel(IO)、DatagramChannel(UDP )、 SocketChannel (TCP中Server )和 ServerSocketChannel(TCP中Client) - Buffer 主要有如下: ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer Selector(处理多个 Channel) ### Buffer 的属性 - capacity:容量,缓冲区可以存储多少数据 - position:当前位置,读/写的位置,就是当前操作的位置 - limit: 不能被读/写的位置,其实就是填充元素最大索引后面的位置。 - mark: 记住当前position的位置 ### Buffer的方法 - capacity() 返回capacity的大小 - hasRemaining() ,判断当前position的 位置是否数据可处理,即,判断position与limit之间是否有可处理的数据 - mark() ,设置缓冲区的标志位,在0~position之间。 - reset() ,将position回到,mark() 方法标记的位置 - position ,返回当前的position - remaing(),返回当前position和limit之间的数据 - rewind(), 将position设置为0,取消mark标志位 - clear(), 清空缓存区,仅仅是将position设置为0,limit设置为capacity,缓冲区的数据还存在,这样在存数据时,就会覆盖以前的数据 - flip(), 写模式转换成读模式,将limit设置成position,再将position设置成0 ### buffer 的创建和分割 - slice()方法,将创建一个[position, limit) - .duplicate() 方法,会创建一个新的buffer对象,而且引用的时同一个array ### 直接字节缓冲区和只读缓冲区 - ByteBuffer.allcoteDirect() 创建直接缓冲区,有且只有byte类型的buffer可以创建直接缓冲区 - Buffer.asReadOnlyBuffer() 将一个普通缓冲区,转化成只读的,但数据源与元缓冲区共享