Java网络编程之SocketChannel和ServerSocketChannel
SocketChannel
- SocketChannel是java nio 提供的用于连接两台计算机进行通信的套接字通道,把Channel去掉就剩下Socket,可见与Socket有着相似的功能。
- SocketChannel可以实现非阻塞的功能,包括连接非阻塞,IO非阻塞。
- SocketChannel与Selector多路复用器配合还可以实现基于select或者epoll的多路复用机制的网络IO模型。
- SocketChannel安全地给多个线程并发使用,但是多个线程使用该SocketChannel是互斥的。同一时间只能给一个线程使用。
- SocketChannel支持OP_READ、OP_WRITE、OP_CONNECT事件。
常见API
获取API
//打开并返回一个SocketChannel,但是此时通道还连接。
public static SocketChannel open()//打开并返回一个SocketChannel ,并且进行将其连接到远程地址。
public static SocketChannel open(SocketAddress remote)
读写API
//往套接字通道写数据ByteBuffer,用于传输到远程地址计算机上。
public abstract int write(ByteBuffer src)//往套接字通道写数据ByteBuffer,用于传输到远程地址计算机上。
/**
*往套接字通道写数据,用于传输到远程地址计算机上。
*srcs :ByteBuffer数组,会对里面的ByteBuffer成员顺序进行读取写入。
*offset :读取ByteBuffer数组的起始下标。
* length:读取ByteBuffer数组的元素个数。
* 与FileChannel该方法一样,详情可以参考博主另一篇FileChannel详解文章。
*/
public abstract long write(ByteBuffer[] srcs, int offset, int length)/**
*往套接字通道写数据,用于传输到远程地址计算机上。
*srcs :ByteBuffer数组,会对里面的ByteBuffer成员顺序进行读取写入。
*/public final long write(ByteBuffer[] srcs)/**
* 读取远程套接字通道传输过来的数据。
*/
public abstract int read(ByteBuffer dst)/**
* 读取远程套接字通道传输过来的数据。
* 与FileChannel该方法一样,详情可以参考博主另一篇FileChannel详解文章。
*/
public abstract long read(ByteBuffer[] dsts, int offset, int length)/**
* 读取远程套接字通道传输过来的数据。
* 与FileChannel该方法一样,详情可以参考博主另一篇FileChannel详解文章。
*/public final long read(ByteBuffer[] dsts)
其他API
//连接到远程地址
public abstract boolean connect(SocketAddress remote)//将此套接字通道绑定到本地套接字地址上
public abstract SocketChannel bind(SocketAddress local)//返回此套接字通道绑定的本地套接字地址
public abstract SocketAddress getLocalAddress()//返回此套接字是否已经连接上了远程套接字
public abstract boolean isConnected();//返回此套接字是否正在连接远程套接字。
public abstract boolean isConnectionPending();//关闭套接字通道。
public final void close()//返回此套接字连接到的远程套接字的地址。返回null表示未连接到远程套接字地址。
public abstract SocketAddress getRemoteAddress()//SocketChannel支持非阻塞模式,但是默认是会阻塞的,如果要实现非阻塞,
//就要调用该方法configureBlocking(false),默认是true阻塞。
public final SelectableChannel configureBlocking(boolean block)//返回该通道连接是否已经被关闭,返回true表示处于打开状态。
public final boolean isOpen()//把当前channel注册到Selector上。
//sel 要注册到的selector,ops 事件类型、att共享属性。
public final SelectionKey register(Selector sel, int ops,Object att)
ServerSocketChannel
ServerSocketChannel的作用是在服务端复制监听来自客户端的Socket连接,类似于ServerSocket,只是他支持非阻塞和能配合SelectorSocket实现高性能的网络IO程序。
ServerSocketChannel只支持OP_ACCEPT事件。
API:
//得到一个ServerSocketChannel通道
public static ServerSocketChannel open()//设置服务器地址
public final ServerSocketChannel bind(SocketAddress local)//设置服务器地址,并且知道backlog,为连接等待队列大小,满了就直接拒绝连接。
public abstract ServerSocketChannel bind(SocketAddress local, int backlog)//监听客户端连接,阻塞方法。
public abstract SocketChannel accept() throws IOException;
Java网络编程之SocketChannel和ServerSocketChannel相关推荐
- Java网络编程之NIO编程(待补充)
Java网络编程之NIO编程(待补充) 学习网站1:http://ifeve.com/java-nio-all/ 学习网站2:http://www.ibm.com/developerworks/cn/ ...
- Java网络编程之TCP、UDP
Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载. J ...
- 浅谈Java网络编程之Socket (2)
<浅谈Java网络编程之Socket (1)>中我们已经和大家说到客户端的网络编程,下面和大家分享的是服务器的实现代码. import java.net.*; import java.io ...
- 浅谈Java网络编程之Socket (1)
和大家一起分享的是Java网络编程之Socket.在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是get ...
- 萌新解--Java网络编程之UDP
Java网络编程之UDP UDP协议为无连接的通信协议,在传数据前发送端与接收端不会先建立连接,也就是你发我就收但不一定会收到哦,以我们自身为发送端,我们不会事先让接收方知道我要给接收方发数据啦.就像 ...
- java网络编程之TCP通讯
java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, 1 /* 2 *TCP 3 *建立连接,形成传输数据的通道: 4 *在连接中进行大数据量传输: ...
- Java 网络编程之NIO(Channel)
同步 VS 异步 同步 同步编程是指当程序执行某个操作时,它必须等待该操作完成才能继续执行下一个操作.这意味着程序在执行网络请求时必须等待网络请求完成才能继续执行下一步操作,因此同步编程通常会导致程序 ...
- JAVA网络编程之Socket
Socket网络编成是一种较为底层的网络数据传输,很多语言都支持. 本例是根据菜鸟教程中的Java网络编程而写. 详细内容参考请参考:http://www.runoob.com/java/java-n ...
- 超详细的逐句介绍Java网络编程之Socket类函数源码讲解(全)
一.Socket类 Socket 类表示通信双方中的客户端,用于呼叫远端机器上的一个端口,主动向服务器端发送数据(当连接建立后也能接收数据).下面我将从源码的角度来介绍Socket类的内部原理及其方法 ...
最新文章
- java action dao_java中Action层、Service层和Dao层的功能区分
- Apache httpd 以root身份运行
- linux下网卡安装
- 解决软件安装中出现checking for FUSE... no方法一例
- 数学建模:1.概述 监督学习--回归分析模型
- MySQL调优(三):索引基本实现原理及索引优化,哈希索引 / 组合索引 / 簇族索引等
- 实现查询菜品信息考试题
- python中deepcopy函数_Python学习笔记函数之copy()和deepcopy()
- FreeTreeView一个可添加、删除、修改的无限极树形结构
- 自学dapp开发资料
- AngularJS源码解析2:注入器的详解
- qmake manual=Variables
- 图像去雾之何凯明暗通道先验去雾算法原理及c++代码实现
- 分类排序 同辈元素只在数据上的层级关系
- CancelledError: [_Derived_]RecvAsync is cancelled.
- Tensorflow移动端之如何将自己训练的MNIST模型加载到Android手机上
- OPA 论坛为流程控制设备接口扩展了开放性、互操作性标准 - 第一部分
- linux中分隔符IFS
- 轻松玩转树莓派Pico之三、Windows+Ubuntu虚拟机模式下VSCode C语言开发环境搭建
- fwrite php utf8,坚持通过PHP的fwrite编写UTF-8文件
热门文章
- 数据库笔记07:实施数据完整性
- 2017.10.22 诸神眷顾的幻想乡 失败总结
- 2017.7.28 愤怒的小鸟 思考记录
- 每日小记 2017.4.24
- Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(11) - 数据可缓存性控制指令
- python附件发送到邮箱里_使用python将最新的测试报告以附件的形式发到指定邮箱...
- mosquitto支持websocket的使用方法
- glob在php中的意思,PHP函数glob介绍
- 新闻列表页flex_C端列表页如何设计?
- Python入门-前言