NIO-3网络通信
- import java.io.IOException;
- import java.net.InetSocketAddress;
- import java.nio.ByteBuffer;
- import java.nio.channels.FileChannel;
- import java.nio.channels.ServerSocketChannel;
- import java.nio.channels.SocketChannel;
- import java.nio.file.Paths;
- import java.nio.file.StandardOpenOption;
- import org.junit.Test;
- /*
- * 一、使用 NIO 完成网络通信的三个核心:
- *
- * 1. 通道(Channel):负责连接
- *
- * java.nio.channels.Channel 接口:
- * |--SelectableChannel
- * |--SocketChannel
- * |--ServerSocketChannel
- * |--DatagramChannel
- *
- * |--Pipe.SinkChannel
- * |--Pipe.SourceChannel
- *
- * 2. 缓冲区(Buffer):负责数据的存取
- *
- * 3. 选择器(Selector):是 SelectableChannel 的多路复用器。用于监控 SelectableChannel 的 IO 状况
- *
- */
- public class TestBlockingNIO {
- //客户端
- @Test
- public void client() throws IOException{
- //1. 获取通道
- SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 9898));
- FileChannel inChannel = FileChannel.open(Paths.get("1.jpg"), StandardOpenOption.READ);
- //2. 分配指定大小的缓冲区
- ByteBuffer buf = ByteBuffer.allocate(1024);
- //3. 读取本地文件,并发送到服务端
- while(inChannel.read(buf) != -1){
- buf.flip();
- sChannel.write(buf);
- buf.clear();
- }
- //4. 关闭通道
- inChannel.close();
- sChannel.close();
- }
- //服务端
- @Test
- public void server() throws IOException{
- //1. 获取通道
- ServerSocketChannel ssChannel = ServerSocketChannel.open();
- FileChannel outChannel = FileChannel.open(Paths.get("2.jpg"), StandardOpenOption.WRITE, StandardOpenOption.CREATE);
- //2. 绑定连接
- ssChannel.bind(new InetSocketAddress(9898));
- //3. 获取客户端连接的通道
- SocketChannel sChannel = ssChannel.accept();
- //4. 分配指定大小的缓冲区
- ByteBuffer buf = ByteBuffer.allocate(1024);
- //5. 接收客户端的数据,并保存到本地
- while(sChannel.read(buf) != -1){
- buf.flip();
- outChannel.write(buf);
- buf.clear();
- }
- //6. 关闭通道
- sChannel.close();
- outChannel.close();
- ssChannel.close();
- }
- }
客户端服务端的响应交互
- import java.io.IOException;
- import java.net.InetSocketAddress;
- import java.nio.ByteBuffer;
- import java.nio.channels.FileChannel;
- import java.nio.channels.ServerSocketChannel;
- import java.nio.channels.SocketChannel;
- import java.nio.file.Paths;
- import java.nio.file.StandardOpenOption;
- import org.junit.Test;
- public class TestBlockingNIO2 {
- //客户端
- @Test
- public void client() throws IOException{
- SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 9898));
- FileChannel inChannel = FileChannel.open(Paths.get("1.jpg"), StandardOpenOption.READ);
- ByteBuffer buf = ByteBuffer.allocate(1024);
- while(inChannel.read(buf) != -1){
- buf.flip();
- sChannel.write(buf);
- buf.clear();
- }
- sChannel.shutdownOutput();
- //接收服务端的反馈
- int len = 0;
- while((len = sChannel.read(buf)) != -1){
- buf.flip();
- System.out.println(new String(buf.array(), 0, len));
- buf.clear();
- }
- inChannel.close();
- sChannel.close();
- }
- //服务端
- @Test
- public void server() throws IOException{
- ServerSocketChannel ssChannel = ServerSocketChannel.open();
- FileChannel outChannel = FileChannel.open(Paths.get("2.jpg"), StandardOpenOption.WRITE, StandardOpenOption.CREATE);
- ssChannel.bind(new InetSocketAddress(9898));
- SocketChannel sChannel = ssChannel.accept();
- ByteBuffer buf = ByteBuffer.allocate(1024);
- while(sChannel.read(buf) != -1){
- buf.flip();
- outChannel.write(buf);
- buf.clear();
- }
- //发送反馈给客户端
- buf.put("服务端接收数据成功".getBytes());
- buf.flip();
- sChannel.write(buf);
- sChannel.close();
- outChannel.close();
- ssChannel.close();
- }
- }
NIO-3网络通信的更多相关文章
- NIO完成网络通信(一)
NIO:即非阻塞式IO 视频教程: https://chuanke.baidu.com/v1982732-211322-1316084.html 使用步骤: 1.创建 ServerSocketCha ...
- JAVA NIO学习三:NIO 的非阻塞式网络通信
紧接着上一章,我们继续来研究NIO,上一章中我们讲了NIO 中最常见的操作即文件通道的操作,但实际上NIO的主要用途还是在于网络通信,那么这个时候就会涉及到选择器,这一章我们就会对其进行讲解操作. 一 ...
- JAVA NIO学习记录2-非阻塞式网络通信
一.阻塞与非阻塞 传统的IO 流都是阻塞式的.也就是说,当一个线程调用read() 或write() 时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务.因此,在完成网络通信 ...
- 4.NIO的非阻塞式网络通信
/*阻塞 和 非阻塞 是对于 网络通信而言的*/ /*原先IO通信在进行一些读写操作 或者 等待 客户机连接 这种,是阻塞的,必须要等到有数据被处理,当前线程才被释放*/ /*NIO 通信 是将这个阻 ...
- NIO 的非阻塞式网络通信
1.阻塞与非阻塞 ① 传统的 IO 流都是阻塞式的.也就是说,当一个线程调用 read() 或 write()时, 该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务. 因 ...
- JDK10都发布了,nio你了解多少?
前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 本来我预想是先来回顾一下传统的IO模式的,将传统的IO模式的相关类理清楚(因为IO的类很多). 但是,发现在整理 ...
- NIO的初步入门
NIO java NIO简介 Java NIO 简介 是从java1.4版本开始引入的一个新的IO AP可以替代标准java IO API NIO与原来的IO有同样的作用和目的,但是使用方式完全不同 ...
- Java之NIO
想要学习Java的Socket通信,首先要学习Java的IO和NIO基础,这方面可以阅读<Java NIO 系列教程>. 下面展示自己代码熟悉Java的NIO编程的笔记. 1.缓冲区(Bu ...
- Java NIO -- 阻塞和非阻塞
传统的 IO 流都是阻塞式的.也就是说,当一个线程调用 read() 或 write()时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务.因此,在完成网络通信进行 IO操作 ...
- Java中的NIO及IO
1.概述 Java NIO(New IO) 是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API.NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同, ...
随机推荐
- forEach、for+i、map的用法及区别
array.forEach(callback[, thisObject]); 下面是参数的详细信息: 1. callback : 函数测试数组的每个元素. 2.thisObject : 对象作为该 ...
- tomcat8在centos7.5下配置开机启动
本文参考这篇文章 一.在/etc/init.d下新建一个文件tomcat,并添加内容如下: #!/bin/sh # chkconfig: 345 99 10 # description: Auto-s ...
- HDU 1431 思维 基础数论
找范围内回文素数,最大到1e8,我就是要枚举回文串,再判素数,然后因为这种弱智思路死磕了很久题目. /** @Date : 2017-09-08 15:24:43 * @FileName: HDU 1 ...
- Bargaining Table
Bargaining Table time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- <LC刷题二>回文字符串判断之leetcode125&234
其他刷题记录见博客首页 1,leecode125 验证回文串 原题: 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. ...
- JAVA多线程提高八:线程锁技术
前面我们讲到了synchronized:那么这节就来将lock的功效. 一.locks相关类 锁相关的类都在包java.util.concurrent.locks下,有以下类和接口: |---Abst ...
- Javascript判断Chrome浏览器
今天分享一下如何通过Javascript来判断Chrome浏览器,这里是通过userAgent判断的,检测一下userAgent返回的字符串里面是否包含“Chrome”, 具体怎么检测是通过index ...
- 聊聊spring的那些扩展机制
1.背景 慎入:本文将会有大量代码出入. 在看一些框架源码的时候,可以看见他们很多都会和Spring去做结合.举个例子dubbo的配置: 很多人其实配置了也就配置了,没有去过多的思考:为什么这么配置s ...
- 【leetcode 简单】 第五十三题 删除重复的电子邮箱
编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个. +----+------------------+ | Id | Email | +-- ...
- bzoj 2741 可持久化trie
首先我们设si为前i个数的xor和,那么对于询问区间[i,j]的xor和,就相当于si-1^sj,那么对于这道题的询问我们可以处理处si,然后对于询问[l,r],可以表示为在区间[l-1,r]里找两个 ...