目录
前言
本章用Java实现一个BIO的服务器,客户端直接使用 telnet
代码逻辑
1.创建一个线程池
2.启动一个ServerSocket服务器对象
3.循环监听客户端连接
4.有客户端连接了就要创建一个线程来维护和客户端的链连接
5.线程中监听客户端的输入,并打印到控制台
代码
/**
* bio服务器
*
* @author liuxupeng
* @date 2021/2/6 16:23
*/
public class BioServer {
public static void main(String[] args) throws IOException {
//线程池机制
//先创建一个线程池
ExecutorService executorService = Executors.newCachedThreadPool();
//启动一个Socket服务器
ServerSocket serverSocket = new ServerSocket(6666);
System.out.println("服务器启动了");
while (true) {
//监听,等待客户端连接,循环的目的是可以监听多个客户端连接
System.out.println("等待客户端连接");
//调用accept方法会阻塞等待客户端连接,有客户端连接了就会监听到并且往下执行
final Socket socket = serverSocket.accept();
System.out.println("连接到一个客户端了");
//有过有客户端连接了 就创建一个线程,与之通讯(单独写一个方法)
executorService.execute(() -> {
//和客户端通讯
handler(socket);
});
}
}
//编写一个handler方法,和客户端通讯
public static void handler(Socket socket) {
//声明一个byte数组,用于存储客户端输入的字节流
byte[] bytes = new byte[1024];
try {
//获取客户端的输入流
InputStream inputStream = socket.getInputStream();
//循环,因为不知道客户端会发送多少次数据,这里可以循环一直监听客户端的输入
while (true) {
//read读取不到数据时会阻塞。
int read = inputStream.read(bytes);
//读取到之后往下执行,先判断读取了多少数据,没有数据的话就跳出循环,并关闭连接
if (read != -1) {
//读取到了数据,输出客户端发送的数据
System.out.println(Thread.currentThread().getId() + " 说:" + new String(bytes, 0, read));
} else {
//跳出循环
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
System.out.println("关闭客户端连接");
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
服务器启动步骤
运行main方法,控制台打印如下
客户端连接步骤
使用telnet客户端进行连接
1.首先打开cmd命令窗口
2.输入 telnet 127.0.0.1 6666
此时窗口会进入一个空白命令窗口,同时服务器控制台打印 如下
按住ctry+右括号("}")键 进入如下页面
这时我们发送消息 只需要输入 send + 消息内容 然后按回车键 就可以了
服务器控制台打印如下
这里打印线程id是为了演示,每个连接都会有一个单独的线程去维护,后面我们再开一个客户端,发送下消息看一下,
控制台打印如下。说明两个客户端连接后,在服务器是由两个线程去处理的
结语
本章主要演示BIO的服务端的示例,了解客户端每个连接都需要一个线程来处理。并且客户端无操作时,线程会一直阻塞!
下一节 尚硅谷Netty系列学习笔记三《NIO介绍》