NIO学习笔记四 :SocketChannel 和 ServerSocketChannel
Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel:
打开一个SocketChannel并连接到互联网上的某台服务器。
SocketChannel channel = SocketChannel.open();
channel.connect(new InetSocketAddress(90));
一个新连接到达ServerSocketChannel时,会创建一个SocketChannel。
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(90));
SocketChannel channel = serverSocketChannel.accept();
关闭 SocketChannel
当用完SocketChannel之后调用SocketChannel.close()关闭SocketChannel:
socketChannel.close();
往SocketChannel中写入数据
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.clear();
buffer.put("测试数据".getBytes("UTF-8"));
buffer.flip();
while(buffer.hasRemaining()){
socketChannel.write(buffer);
}
读取SocketChannel 中的数据
ByteBuffer buffer = ByteBuffer.allocate(1024);
int read = channel.read(buffer);
示例代码
客户端
public class SocketChanneClient {
public static void main(String args[]) throws Exception {
SocketChannel channel = SocketChannel.open();
channel.connect(new InetSocketAddress(90));
while (true) {
Scanner scanner = new Scanner(System.in);
String message = scanner.next();
sendMessage(channel,message);
}
}
public static void sendMessage(SocketChannel socketChannel, String mes) throws IOException {
if (mes == null || mes.isEmpty()){
return;
}
byte[] bytes = mes.getBytes("UTF-8");
int size = bytes.length;
ByteBuffer buffer = ByteBuffer.allocate(size);
buffer.clear();
buffer.put(bytes);
buffer.flip();
while(buffer.hasRemaining()){
socketChannel.write(buffer);
}
socketChannel.close();
}
}
服务端
public class ServerSocketChannelServer {
public static void main(String[] args) throws IOException{
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(90));
ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 10, 1000, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(100));
while (true){
SocketChannel channel = serverSocketChannel.accept();
if ((channel !=null)){
executor.execute( new SocketChannelThread(channel));
}
}
}
}
线程池处理类
public class SocketChannelThread implements Runnable {
private SocketChannel channel;
private String remoteName;
public SocketChannelThread(SocketChannel channel) throws IOException {
this.channel = channel;
this.remoteName = channel.getRemoteAddress().toString();
System.out.println("客户:" + remoteName + " 连接成功!");
}
@Override
public void run() {
ByteBuffer buffer = ByteBuffer.allocate(1024);
byte b[];
while (true) {
try {
b = new byte[1024];
buffer.clear();
int read = channel.read(buffer);
StringBuilder sb = new StringBuilder();
if (read != -1) {
buffer.flip();
int index = 0;
while (buffer.hasRemaining()) {
b[index++] = buffer.get();
if (index >= read) {
index = 0;
sb.append(new String(b, "UTF-8"));
System.out.println(remoteName + ":" + sb.toString());
}
}
buffer.clear();
}
} catch (Exception e) {
System.out.println(remoteName + " 断线了,连接关闭");
try {
channel.close();
} catch (IOException ex) {
}
break;
}
}
}
}
以上创建SocketChannel 是阻塞式的 ,同时也支持非阻塞式的。
阻塞是服务端读取SocketChannel 数据时,如果读取不到,进程一直阻塞直到客户端有数据请求到服务端。
非阻塞是服务端读取SocketChannel 数据时,如果读取不到,java.nio.channels.SocketChannel#read(java.nio.ByteBuffer) 方法返回0
设置非阻塞模式
channel.configureBlocking(false);
NIO学习笔记四 :SocketChannel 和 ServerSocketChannel的更多相关文章
- Java NIO学习笔记六 SocketChannel 和 ServerSocketChannel
Java NIO SocketChannel Java NIO SocketChannel是连接到TCP网络socket(套接字)的通道.Java NIO相当于Java Networking的sock ...
- 零拷贝详解 Java NIO学习笔记四(零拷贝详解)
转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...
- Java NIO学习笔记四 NIO选择器
Java NIO选择器 A Selector是一个Java NIO组件,可以检查一个或多个NIO通道,并确定哪些通道已准备就绪,例如读取或写入.这样一个线程可以管理多个通道,从而管理多个网络连接. 为 ...
- Java NIO 学习笔记(四)----文件通道和网络通道
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO学习笔记
Java NIO学习笔记 一 基本概念 IO 是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成. 所有语言运行时系统提供执 ...
- Java NIO 学习笔记(三)----Selector
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO 学习笔记(一)----概述,Channel/Buffer
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java:NIO 学习笔记-3
Java:NIO 学习笔记-3 根据 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 3. JAVA NIO 深入剖析 在讲解利用 NIO 实现通信架构之前,我们需要先来了解一下 NI ...
- Java:NIO 学习笔记-1
Java:NIO 学习笔记-1 说明:本笔记是根据bilibili上 尚硅谷 的课程 NIO视频 而做的笔记 主要内容 Java NIO 简介 Java NIO 与 IO 的主要区别 缓冲区(Buff ...
随机推荐
- 如何读取R 的sumary()结果
思路 step 1: sum = summary(model) step 2: sum有好多属性,直接根据属性名称引用($)即可, 如: + > sum$call 返回 model 使用的模型语 ...
- Log system architecture
0. 技术选型参考 1. Collector Keywords: Collector, Processor 名称 Beats Fluentd-bit Introduction Beats are a ...
- java数组-如何在一堆数据中使用数组!
数组 1.类型一致的一组数据,其实相当于集合概念. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个数组元素(item),每个数组元素可以通过一个下标/索引来 ...
- Android OOM 引发的思考
一.为何会出现OOM 因为Android系统的硬件资源是相当有限的,而且分配给一个应用的资源更为有限,尤其是内存.当应用突然申请的内存大于允许的最大值的时候,就会出现OOM. 如果想要获取App的内存 ...
- Redis集群环境使用的是redis4.0.x的版本,在用java客户端jedisCluster启动集群做数据处理时报java.lang.NumberFormatException: For input string: "7003@17003"问题解决
java.lang.NumberFormatException: For input string: "7003@17003" at java.lang.NumberFormatE ...
- Android精通:View与ViewGroup,LinearLayout线性布局,RelativeLayout相对布局,ListView列表组件
UI的描述 对于Android应用程序中,所有用户界面元素都是由View和ViewGroup对象构建的.View是绘制在屏幕上能与用户进行交互的一个对象.而对于ViewGroup来说,则是一个用于存放 ...
- python中stack在实际中的简单应用之平衡符号
很多书籍都在讲stack的概念和使用方法,等我们把概念熟悉后,发现不知道在什么场景下使用 该结构体,这里就列几个实用的例子,让大家了解一下stack在实际中的用处和厉害之处. 由于stack中的特点是 ...
- Tools - 使用Doxygen和Graphviz分析代码
简介 使用Doxygen来生成结构,使用Graphviz来显示结构: Doxygen:http://www.doxygen.nl/ 用来生成项目文档的工具软件,可将程序中的特定批注转换成为说明文件,还 ...
- 6月份值得一看的 Java 技术干货!
6月过完了,这一年都 TM 过了一半了,大家都回想下自己这大半年,你都收获了什么??技术有提升吗?对象搞定了吗? 说多了都是泪,唯有 WIFI.空调.西瓜.足球能够解忧.. 话说中国队怎么还不上场?哈 ...
- 机器视觉编程作业02(00)EM算法
任务:对图像进行边缘检测 思路: )将图像的灰度数值进行0-255的维度统计: )EM算法分析出几个核心显示区块的灰度: )使用通用的边界检测算法(具体哪一种待定). 编辑于2017.12.24 15 ...