javaNIO笔记
javaNIO
同步阻塞式IO:一个连接一个线程,即客户端有连接请求时服务器就需要启动一个线程进行处理,如果这个连接不做任何事情就会造成不必要的线程开销。JDK1.4以前的传统IO。相关的类和接口在java.io中
场景分析:适用于连接数目比较少且固定的架构,这种方式对于服务器资源要求较高,并发局限于应用中。
图例:
实现单服务端-客户端通信
- BIOClient.java 客户端
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class BIOClient {
public static void main(String[] args) {
//读取键盘输入
Scanner sn = new Scanner(System.in);
try {
//获取服务端socket连接
Socket client = new Socket("127.0.0.1", 9999);
String msg;
while (sn.hasNext()){
//循环读取键盘输入行数据
msg = sn.nextLine();
//获取socket流通道
OutputStream outputStream = client.getOutputStream();
//使用打印流 往通道中输入数据
PrintStream printStream = new PrintStream(outputStream);
printStream.println(msg);
printStream.flush();
// printStream.close();
}
} catch (IOException e) {
e.printStackTrace();
sn.close();
}
}
}
- BIOServer.java 服务端
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class BIOServer {
public static void main(String[] args) {
try {
//创建socket服务端
ServerSocket server = new ServerSocket(9999);
//监听客户端连接 获取socket对象
Socket socket = server.accept();
//获取客户端输入流
InputStream inputStream = socket.getInputStream();
//使用缓冲字符流读取数据
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String msg;
while ( (msg = br.readLine()) !=null){
System.out.println(msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
但是上面的只能应用于单客户端,如果想实现多个客户端连接一个服务端,那么就需要对服务端进行改造,因为是单线程监听客户端,如果要服务端监听多个客户端,就需要用多线程进行监听并连接
多客户端连接服务端
- BIOServerForMoreClient.java 服务端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class BIOServerForMoreClient {
public static void main(String[] args) {
try {
//创建服务端
ServerSocket server = new ServerSocket(9999);
while (true){
//循环监听
Socket socket = server.accept();
//如果监听到了客户端 则新启线程进行处理
if (socket!=null){
new Thread(new Runnable() {
@Override
public void run() {
try {
//同上 通过字符缓冲流包装客户端输入流读取数据
InputStream inputStream = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String msg;
while ((msg = br.readLine())!=null){
System.out.println(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用IDEA可以启动多个客户端来连接服务端,同一个类启动多个主线程需要开启
- Edit configurations -> allow parallel run 勾选
- 没有设置该属性可以开启 Edit configurations ->Modify options ->allow multiple instances 勾选
相关截图:
注:此笔记来自博主学习javaIO后编写,转载请注明出处,网站:哔哩哔哩:黑马Java-IO模式精讲