
网络编程复习(二):JDK1.5之前的伪异步BIO编程
server类:
HandlerPoolExecutor自定义线程池类:
任务类HandlerSocket类,没有任何变化:
这种伪异步的方式其实还是阻塞形式的,并不适合当前开发场景,下一篇将介绍JDK1.7之后提供的非阻塞异步NIO通信方式。
发布日期:2021-11-13 10:21:48
浏览次数:3
分类:技术文章
本文共 3676 字,大约阅读时间需要 12 分钟。
在JDK1.5之前并没有提供NIO非阻塞异步通信,在这里说一下什么是BIO:就是同步阻塞形式的通信模式,那么什么是NIO,就是同步非阻塞通信模式,同时,在JDK1.7之后,支持异步非阻塞通信模式,就是所说的NIO2.0.那么是怎么实现多个client连接服务器的呢?答案是使用的是伪异步方式,即自定义线程池加队列方式,下面看看代码:
client类:与上一篇没有任何变化
package 网络编程_最原始BIO2;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;public class Client {
public static void main(String[] args) {
PrintWriter writer = null;
BufferedReader reader = null;
Socket client = null;
try {
client = new Socket("127.0.0.1", 8888);
writer = new PrintWriter(client.getOutputStream(), true);//该地方必须加true,设置为自动刷新
reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
writer.println("接收客户端发送请求");
System.out.println("请求已经发出");
String body = reader.readLine();
System.out.println(body);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (writer != null) {
writer.close();
}
if (client != null) {
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
client = null;
}
}
}}
server类:
package 网络编程_最原始BIO2;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import 网络编程_最原始.HanderSocket;public class Server {
static ServerSocket server = null;
public static void main(String[] args) {
try {
server = new ServerSocket(8888);
System.out.println("server start...");
while(true){
Socket socket = server.accept();
new HanderPoolExecuter(50, 1000).executors(new HanderSocket(socket));
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(server!=null){
try {
server.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
server = null;
}
}
}}
HandlerPoolExecutor自定义线程池类:
package 网络编程_最原始BIO2;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.ExecutorService;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class HanderPoolExecuter {
Integer initSize;
Integer maxSize;
private ExecutorService executorService;
private BlockingQueueblockingQueue = new ArrayBlockingQueue<>(1000);
public HanderPoolExecuter(int initSize,int maxSize){
this.initSize = initSize;
this.maxSize = maxSize;
executorService = new ThreadPoolExecutor(initSize, maxSize, 60, TimeUnit.SECONDS, blockingQueue);
}
public void executors(Runnable task){
executorService.execute(task);
}}
任务类HandlerSocket类,没有任何变化:
package 网络编程_最原始BIO2;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;public class HanderSocket implements Runnable{
Socket socket = null;
public HanderSocket(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
BufferedReader reader = null;
PrintWriter writer = null;
try {
reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
writer = new PrintWriter(this.socket.getOutputStream(),true);
String body = null;
while(true){
body = reader.readLine();
if(body == null) break;
System.out.println(body);
writer.println("你好,服务端已经接收到你的请求");
System.out.println("已经向客户端反馈结果");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if(writer !=null){
writer.close();
}
if(reader !=null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
socket = null;
}
}
}}
这种伪异步的方式其实还是阻塞形式的,并不适合当前开发场景,下一篇将介绍JDK1.7之后提供的非阻塞异步NIO通信方式。
转载地址:https://blog.csdn.net/Lee_Ho_/article/details/78118534 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.200.74.241]2022年05月27日 18时30分43秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
最新文章
七大常见排序算法总结
2019-09-09 00:26:12
设计模式学习笔记(0)-设计原则
2019-09-09 00:26:11
一文总结学习 Python 的 14 张思维导图
2019-09-09 00:26:10
SQLSERVER中文乱码问题
2019-09-09 00:26:10
SQL Server:“数据收缩”详解
2019-09-09 00:26:10
C# MongoDB操作类
2019-09-09 00:26:09
SQL SERVER 存储过程中SELECT 返回值如何赋值给变量
2019-09-09 00:26:09
怎样去除EXCEL中的重复行
2019-09-09 00:26:09
区块链的含义
2019-09-09 00:26:08
数据同步的几个原则
2019-09-09 00:26:08
几张趣图助你理解HTTP状态码~
2021-11-12
SQL SERVER 包含固定符号的字符串 转为一列
2021-11-12
C# Serializable标签 和序列化
2021-11-12
C# 调用http和https请求rest接口通用操作类
2021-11-12
C# 操作Active Directory (AD)的操作类
2021-11-12
Excel中Vlookup公式和IFError公式的使用
2021-11-12
SQL SERVER 如何区分大小写
2021-11-12
IIS WebService 内存溢出问题的修改过程
2021-11-12
Oracle字符分隔函数(split)
2021-11-12
Jenkins集成.NET操作说明
2021-11-12