Java基础(Socket通信和NIO)

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();
}
  1. 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状况
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值