Java NIO笔记(七):Socket通道
来源:互联网 发布:ipad种子下载软件 编辑:程序博客网 时间:2024/04/25 12:10
一、Socket通道介绍
Socket通道即套接字通道,是一种基于TCP连接协议传输数据的通道。Socket通道可以以分阻塞模式运行,并且可以被Reactor设计模式使用,因为Socket通道是可供选择的,其继承SelectableChannel类。
非阻塞I/O是复杂的、高性能的程序构建的基础。
使用NIO的Socket通道就没有必须像旧的Socket一样为每个Socket创建一个线程,避免了N个线程之间切换上下文的性能开销,使用NIO的Socket通道可以一个或几个线程就可以管理成百上千个已连接的Socket,并且性能消耗非常小。
- ServerSocketChannel:负责监听某个端口,等待客户端Socket连接进来
- SocketChannel:可以理解为一对一对使用,客户端使用SocketChannel连接服务器,服务器也会有个对等的SocketChannel
- DatagramChannel:基于UDP发送数据报
所有的Socket通道类被创建后都有一个关联的Socket;但是使用旧的方法直接创建Socket并不会关联一个通道,虽然它们有getChannel()方法,但是这个方法会返回null。
二、ServerSocketChannel
ServerSocketChannel有如下方法可供使用:
- open():打开一个ServerSocketChannel,用于创建ServerSocketChannel
- validOps():返回SelectionKey.OP_ACCEPT,一般用不到,可用于验证注册到选择器时指定的兴趣是否位OP_ACCEPT
- socket():返回与通道关联的ServerSocket
- accept():等待接受一个Socket连接,非阻塞模式下可能返回null
//打开一个ServerSocketChannelServerSocketChannel ssc = ServerSocketChannel.open();//将通道关联的ServerSocket绑定65535端口//jdk1.7之后可以ssc.bind(new InetSocketAddress(65535))ssc.socket().bind(new InetSocketAddress(65535));//设置非阻塞模式ssc.configureBlocking(false);
三、SocketChannel
SocketChannel有如下方法可供使用:
- open():打开一个SocketChannel
- open(SocketAddress remote):同open(),并指定连接服务器地址
- validOps():返回SelectionKey.OP_READ | SelectionKey.OP_WRITE | SelectionKey.OP_CONNECT,作用同ServerSocketChannel的validOps()
- socket():返回通道关联的Socket
- isConnected():检查是否已连接,返回true or false
- isConnectionPending():检查是否处于请求连接状态
- connect(SocketAddress remote):连接指定地址服务器
- finishConnect():强制完成连接,完成连接则返回true,返回false
- read(ByteBuffer dst):将通道的数据读到ByteBuffer
- read(ByteBuffer[] dsts):将通道数据分散读到ByteBuffer数组
- read(ByteBuffer[] dsts, int offset, int length):将通道数据分散读到ByteBuffer数组,并指定读取数据的开始位置和读取的长度
- write(ByteBuffer src):将字节缓冲区的数据写入通道
- write(ByteBuffer[] srcs):将分散的字节缓冲区的数据聚集写入通道
- write(ByteBuffer[] srcs, int offset, int length):同上一个方法,并指定写入数据的开始位置和长度
SocketChannel sc = SocketChannel.open();sc.configureBlocking(false);sc.connect(new InetSocketAddress("127.0.0.1", 65535));//轮询直到成功连接为止while(!sc.isConnected()){}
四、DatagramChannel
- open():打开一个DatagramChannel
- validOps():返回SelectionKey.OP_READ | SelectionKey.OP_WRITE
- socket():返回关联的DatagramSocket
- isConnected():是否已连接
- connect(SocketAddress remote)》:连接某个地址
- disconnect():断开连接
- receive(ByteBuffer dst):接收数据,从通道读入缓冲区
- send(ByteBuffer src, SocketAddress target):将缓冲区的数据发送到指定网络地址
- read(ByteBuffer dst)
- read(ByteBuffer[] dsts)
- read(ByteBuffer[] dsts, int offset, int length)
- write(ByteBuffer src)
- write(ByteBuffer[] srcs)
- write(ByteBuffer[] srcs, int offset, int length)
这么需要说明下,DatagramChannel提供了connect方法,别被这样的方法套住了,DatagramSocket是基于UDP的,UDP是无连接的,connection方法只是绑定某个地址,只能从这个地址接收数据或发送数据到这个地址。
这节主要介绍3个Socket通道的API,读取若想感受下他们的实际的使用,可以到下面两个地址下载实战源码:
- Java简单版飞鸽传书:http://download.csdn.net/detail/abc_key/7497543
- Java简单聊天室:http://download.csdn.net/detail/abc_key/7459723
- Java NIO笔记(七):Socket通道
- JAVA NIO Socket通道
- Java nio 之 Socket通道
- Java NIO 4:Socket通道
- NIO channel Socket通道
- NIO - Socket 通道
- java NIO之通道学习笔记
- Java NIO笔记(五):通道概论&文件通道
- java nio 通道(一)
- java nio 通道(二)
- Java NIO 通道
- Java NIO 通道
- Java NIO Channel 通道
- Java NIO 通道
- 《Java NIO》学习笔记三 通道(Channel)
- Java NIO 通道和通道之间转换
- Java NIO 3:通道和文件通道
- 黑马程序员_O‘Reilly java nio学习笔记之通道_通道基础&& Scatter/Gather
- Android NDK入门学习
- swift 进阶笔记 (三) —— 元类型
- accept系统调用内核实现
- 解析char *p与char p[] , char (*p)[]与char *p[]
- android学习笔记6-SharePreference共享参数
- Java NIO笔记(七):Socket通道
- java How to Use Tables
- Python 调用 百度翻译
- unity3d 建树篇
- OCP-1Z0-051 补充题库 第20题 约束的注意事项
- 在cocos2dx中实现水波滤镜
- 使用 live555 直播来自 v4l2 的摄像头图像
- 设置让vpn用户通过vpn服务器上网
- 2014 DSP 工程师笔试题