TCP状态转换图

影响网络传输的因素

将一份数据从一个地方正确地传输到另一个地方所需要的时间我们称之为响应时间。

影响这个时间的因素有很多:

Socket

Java Socket的工作机制

Socket这个概念没有对应到一个具体的实体,它描述计算机之间相互通信的一种抽象功能。

打个比方,可以把Socket比作两个城市之间的交通工具,有了它,就可以在城市之间来回穿梭了。

交通工具有多种,每种交通工具也有相应的交通规则。

Socket也一样,也有多种。大部分情况下我们用的都是基于TCP/IP的流套接字,它是一种稳定的通信协议。

建立通信链路

数据传输

NIO的工作方式

NIO的工作机制

import java.io.IOException;

import java.net.InetSocketAddress;

import java.nio.ByteBuffer;

import java.nio.channels.SelectionKey;

import java.nio.channels.Selector;

import java.nio.channels.ServerSocketChannel;

import java.nio.channels.SocketChannel;

import java.nio.channels.spi.SelectorProvider;

import java.util.Iterator;

/**

* Created by 18351 on 2018/10/23.

*

* TCP/IP的非阻塞方式

* 服务端

*/

public class Server implements Runnable{

//第一个端口

private Integer port1 = 8099;

//第二个端口

private Integer port2 = 9099;

//第一个服务器通道 服务A

private ServerSocketChannel serversocket1;

//第二个服务器通道 服务B

private ServerSocketChannel serversocket2;

//连接1

private SocketChannel clientchannel1;

//连接2

private SocketChannel clientchannel2;

//选择器,主要用来监控各个通道的事件

private Selector selector;

//缓冲区

private ByteBuffer buf = ByteBuffer.allocate(512);

public Server() {

init();

}

/**

* 这个method的作用 :

* 1:是初始化选择器

* 2:打开两个通道

* 3:给通道上绑定一个socket

* 4:将选择器注册到通道上

*/

public void init() {

try {

//创建选择器

this.selector = SelectorProvider.provider().openSelector();

//打开第一个服务器通道

this.serversocket1 = ServerSocketChannel.open();

//告诉程序现在不是阻塞方式的

this.serversocket1.configureBlocking(false);

//获取现在与该通道关联的套接字

this.serversocket1.socket().bind(new InetSocketAddress("localhost", this.port1));

//将选择器注册到通道上,返回一个选择键

//OP_ACCEPT用于套接字接受操作的操作集位

this.serversocket1.register(this.selector, SelectionKey.OP_ACCEPT);

this.serversocket2=ServerSocketChannel.open();

this.serversocket2.configureBlocking(false);

this.serversocket2.socket().bind(new InetSocketAddress("localhost",this.port2));

this.serversocket2.register(this.selector,SelectionKey.OP_ACCEPT);

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 客户端连接服务器

* @param key

* @throws IOException

*/

public void accept(SelectionKey key) throws IOException{

ServerSocketChannel server = (ServerSocketChannel) key.channel();

if (server.equals(serversocket1)) {

clientchannel1 = server.accept(); //连接到服务端1

clientchannel1.configureBlocking(false);

//OP_READ用于读取操作的操作集位

clientchannel1.register(this.selector, SelectionKey.OP_READ);

} else {

clientchannel2 = server.accept();连接到服务端2

clientchannel2.configureBlocking(false);

//OP_READ用于读取操作的操作集位

clientchannel2.register(this.selector, SelectionKey.OP_READ);

}

}

/**

* 从通道中读取数据

* 并且判断是给那个服务通道的

* @throws IOException

* */

public void read(SelectionKey key) throws IOException {

this.buf.clear();

//通过选择键来找到之前注册的通道

//但是这里注册的是ServerSocketChannel为什么会返回一个SocketChannel??

SocketChannel channel = (SocketChannel) key.channel();

//从通道里面读取数据到缓冲区并返回读取字节数

int count = channel.read(this.buf);

if (count == -1) {

//取消这个通道的注册

key.channel().close();

key.cancel();

return;

}

//将数据从缓冲区中拿出来

String input = new String(this.buf.array()).trim();

//那么现在判断是连接的那种服务

if (channel.equals(this.clientchannel1)) {

System.out.println("欢迎您使用服务A");

System.out.println("您的输入为:" + input);

} else {

System.out.println("欢迎您使用服务B");

System.out.println("您的输入为:" + input);

}

}

@Override

public void run() {

while (true) {

try {

System.out.println("running ... ");

//选择一组键,其相应的通道已为 I/O 操作准备就绪。

this.selector.select();

//返回此选择器的已选择键集

//public abstract Set selectedKeys()

Iterator selectorKeys = this.selector.selectedKeys().iterator();

while (selectorKeys.hasNext()) {

System.out.println("running2 ... ");

//这里找到当前的选择键

SelectionKey key = (SelectionKey) selectorKeys.next();

//然后将它从返回键队列中删除

selectorKeys.remove();

if (!key.isValid()) { // 选择键无效

continue;

}

if (key.isAcceptable()) {

//如果遇到请求那么就响应

this.accept(key);

} else if (key.isReadable()) {

//读取客户端的数据

this.read(key);

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

public static void main(String[] args) {

Server server=new Server();

Thread thread=new Thread(server);

thread.start();

}

}

import java.io.IOException;

import java.net.InetAddress;

import java.net.InetSocketAddress;

import java.nio.ByteBuffer;

import java.nio.channels.SocketChannel;

/**

* Created by 18351 on 2018/10/23.

* TCP/IP非阻塞方式

* 客户端

*/

public class Client {

//创建缓冲区

private ByteBuffer buffer = ByteBuffer.allocate(512);

//访问服务器

public void query(String host, int port) throws IOException {

InetSocketAddress address = new InetSocketAddress(InetAddress.getByName(host), port);

SocketChannel socket = null;

byte[] bytes = new byte[512];

while (true) {

try {

System.in.read(bytes);

socket = SocketChannel.open();

socket.connect(address);

buffer.clear();

buffer.put(bytes);

buffer.flip(); //转换读写

socket.write(buffer);

buffer.clear();

} catch (Exception e) {

e.printStackTrace();

} finally {

if (socket != null) {

socket.close();

}

}

}

}

public static void main(String[] args) throws IOException {

//new Client().query("localhost", 8099);

new Client().query("localhost", 9099);

}

}

NIO的主要原理与使用

Buffer的工作方式

NIO的文件访问方式

java nio web,JavaWeb之三——网络IO和NIO相关推荐

  1. java io和nio的区别_Java中IO和NIO的本质和区别

    导读热词 简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是java.io包中的所有类,他们是从java1 ...

  2. 网络IO之NIO的演变过程

    NIO演变过程 本文会使用strace命令一步一步跟踪程序底层所产生的系统调用来分析NIO的演变过程. NIO的阻塞模式 package com.morris.nio;import java.io.I ...

  3. hadoop---Java 网络IO编程总结BIO、NIO、AIO

    转载请注明出处:http://blog.csdn.net/anxpp/article/details/51512200,谢谢! 本文会从传统的BIO到NIO再到AIO自浅至深介绍,并附上完整的代码讲解 ...

  4. (二)NIO之网络IO

    概述和核心 API 前面在进行文件 IO 时用到的 FileChannel 并不支持非阻塞操作,学习 NIO 主要就是进行网络 IO,Java NIO 中的网络通道是非阻塞 IO 的实现,基于事件驱动 ...

  5. NIO的网络IO操作

    一.网络IO 1.1 概述 文件IO用到的FileChannel并不支持非阻塞操作,学习NIO主要就是进行网络IO,JavaNIO中的网络通道是非阻塞IO的实现,基于事件驱动,非常适用于服务器需要维持 ...

  6. NIO之ByteBuffer_NIO之网络IO_与ChannelNetty初窥门径

    NIO之ByteBuffer与Channel 传统IO:byte[] <= inputStream <= 文件 => outputStream => byte[] NIO:文件 ...

  7. 分别基于IO、NIO、Netty的Java网络程序

    分别基于IO.NIO.Netty的Java网络程序 IDE:IntelliJ IDEA 文章目录 分别基于IO.NIO.Netty的Java网络程序 一.Java NIO 1.1 NIO与传统IO对比 ...

  8. Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

    本文会从传统的BIO到NIO再到AIO自浅至深介绍,并附上完整的代码讲解. 下面代码中会使用这样一个例子:客户端发送一段算式的字符串到服务器,服务器计算后返回结果到客户端. 代码的所有说明,都直接作为 ...

  9. java中io.nio.aio_Java中网络IO的实现方式-BIO、NIO、AIO

    在网络编程中,接触到最多的就是利用Socket进行网络通信开发.在Java中主要是以下三种实现方式BIO.NIO.AIO. 关于这三个概念的辨析以前一直都是好像懂,但是表达的不是很清楚,下面做个总结完 ...

  10. java httputil_Java网络编程与NIO详解2:JAVA NIO 一步步构建IO多路复用的请求模型

    本文转载自:https://github.com/jasonGeng88/blog 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 http ...

最新文章

  1. JavaScript实现重置表单(reset)的方法
  2. vue中阻止冒泡事件
  3. 除了Postman之外,居然还有个Postwoman...
  4. c#扩展方法奇思妙用变态篇四:string 的翻身革命
  5. cygwin下如何运行crontab定时脚本?
  6. 【Elasticsearch】Elasticsearch 通信模块的分析
  7. css 语音,纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
  8. 怎么样生成bean对象java_使用BeanFactory实现创建对象
  9. unity怎么在文本中修改字体_[专栏作家]UGUI中CustomFont字体使用与制作
  10. Docker之旅:了解Swarm集群
  11. Practical JAVA(三)关于final
  12. notepad2正则表达式替换字符串
  13. 教育学相关期刊杂志介绍
  14. AppStore 预览图制作
  15. 安卓虚拟键盘_干货分享:推荐几款性能不错的安卓模拟器
  16. Python黑科技神奇去除马赛克
  17. 深度估计 双目深度估计+单目深度估计 ONNX运行程序
  18. [开源免费] ZXTouch - iOS11-14 iOS13 模拟触摸 模拟点击 比触动精灵和AutoTouch更好用的插件
  19. 网易云信Demo-注册400
  20. 试用了hipihi首批账号

热门文章

  1. git学习笔记-(8-高层命令(2))
  2. gpasswd 附属组管理,添加用户到附属组中
  3. python编写函数模拟猜数游戏、系统随机产生一个数_C语言编程:编写一个猜数的游戏,系统自动产生一个随机数,你来猜,程序给出提示,直到猜对为止。...
  4. 一般试卷的纸张大小是多少_考试试卷统一设置标准规格要求
  5. ajax请求几个状态,ajax的请求步骤!每个状态值表示什么?
  6. mysql自连接_深入理解mysql的自连接和join关联
  7. 飞卢服务器维护什么时候结束,2019年10月8日定期维护公告
  8. 动态规划实战9 leetcode-91. Decode Ways
  9. StanfordDB class自学笔记 (4) XML Data
  10. 计算机室火灾隐患表现,大学消防知识安全宣传图片系列六:计算机室、微机房的火灾隐患和消防须知...