1.Socket通信
1.1 原理
连接:Server端要创建ServerSocket,用来监听某一个端口如999,当客户端创建socket对象时,就跟Server建立
了连接
通信:服务器端或客户端都可通过Socket对象获取输入流和输出流,通过输入流和输出流进行通信
1.2 实现
Server端
public static void main(String[] args) throws Exception {
//1.创建ServerSocket对象,端口号范围在0~65535,用来监听某一个端口
ServerSocket ss = new ServerSocket(999);
System.out.println("服务器已启动...");
while(true){
//创建一个用于传递数据的套接字Socket
Socket s = ss.accept();
BufferedReader br = new BufferedReader(new
InputStreamReader(s.getInputStream()));
System.out.println("等待客户端信息...");
Thread.sleep(500);
String str = br.readLine();
System.out.println("来自客户端:"+s.getInetAddress()+"的内容:"+str);
//向客户端发送信息
PrintWriter pw = new PrintWriter(new BufferedWriter(new
OutputStreamWriter(s.getOutputStream())));
pw.println("用户器已经收到你发来的信息:"+str);
pw.flush();
s.close();
br.close();
pw.close();
}
}
Clien端
public static void main(String[] args) throws Exception {
//产生一个连接服务请求,并产生Socket对象
Socket s = new Socket("192.168.1.118",999);
//向服务器发送消息
PrintWriter pw = new PrintWriter(new BufferedWriter(new
OutputStreamWriter(s.getOutputStream())));
System.out.println("开始向服务器发送信息...");
pw.println("socket通信中...");
pw.flush();
Thread.sleep(1000);
System.out.println("等待接收服务器的消息...");
BufferedReader br = new BufferedReader(new
InputStreamReader(s.getInputStream()));
System.out.println("来自服务器:"+s.getInetAddress()+"的信息:"+br.readLine());
s.close();
br.close();
pw.close();
}
- NIO
一、概述
NIO—Non Blocking IO,非阻塞IO
1.IO与NIO区别
IO:面向单向流的
NIO:面向缓冲区,写数据时,把数据写入缓冲区中,然后再把缓冲区中数据通过管道传递到接收端。非阻塞和
选择器则是针对网络通信使用
2.NIO的两个技术
缓冲区:用于装载数据,也就是数组,有7种类型的数据
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
通道,channel:就是打开到IO设备的一个连接,通道用来传输数据
二、缓冲区与通道应用
1.直接缓冲区与非直接缓冲区的区别
直接缓冲区在数据读写时,会绕过JVM堆内存,速度快,因为少了一个中间的copy过程,效率高
直接缓冲区的缺点:建立和销毁比堆上缓冲区消耗大,不归jvm管理,不安全
2.缓冲区使用
put(数组):向缓冲区中存放数据
limit:界限,表示缓冲区可操作的数据大小
position:位置,表示缓冲区中正在操作数据的位置
get():从缓冲区当前位置读一个数据
flip():对当前位置设置0,然后设置limit的值
mark():记录当前位置
reset():恢复到mark位置
hasRemaining():判断是否还有数据
remaining():获取还有多少个数据
rewind();把position重置为0
clear():清空缓冲区,位置和界限恢复为初始状态
array():把缓冲区中数据转为数组
3.通道channel
3.1 作用:
用于源节点与目标节点的连接,只用来跟buffer交互
3.2 类型
FileChannel:用来操作本地文件
SocketChannel和ServerSocketChennel:用于 TCP数据传输
DatagramChannel:用于udp数据传输
4.分散与聚集
分散:指从Channel中读取的数据依次分散到多个Buffer中
聚集:将多个Buffer中的数据按照顺序写入到一个channel中
三、非阻塞式应用
1.概念
什么是阻塞?
程序在获取网络数据时,如果网络传输慢,就会一直等待,直到传输完成才不等待,这种等待叫阻塞
什么是非阻塞?
程序可直接获取已经准备就绪的数据,无需等待
什么是NIO?
服务器的工作模式为一个请一个线程,也就是客户端发送的连接请求都会注册到选择器(多路复用器)上,多路复用
器轮询到连接有IO请求时才启动一个线程进行处理。
选择器:用于监控通道中io状况