首页 / JAVA / 【java】网络编程之BIO
【java】网络编程之BIO
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【java】网络编程之BIO,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3215字,纯文字阅读大概需要5分钟。
内容图文
![【java】网络编程之BIO](/upload/InfoBanner/zyjiaocheng/602/4189858f7a0b41f9a6fb9f13a83413ee.jpg)
BIO(阻塞式输入输出)是指在读取输入数据的时候会一直卡(阻塞)在那里,在socket编程中会导致线程无法处理其他工作,除此之外,服务端等待accept连接也是阻塞式的,所以程序想继续执行需要创建新的线程去处理其他工作。
注意socket连接并不代表连接可以被处理,连接创建后,数据处理是需要线程来工作的,当然一个进程的可连接数也不是无限大的,超过最大连接数(操作系统限制或服务端限制)会导致无法连接。
类似阻塞式的饭店,新客人来了相当于和饭店建立一个socket连接,这只是连接能不能吃饭还要等待服务员给你下单,当然饭店要是满了,新客人是进不去的。更糟糕的是,饭店只有一个服务员一直等着给第一个客人点菜下单,其他客人都不管。客人也存在着类似问题,为了和服务员维持这个连接,一直点菜或思考点什么菜,卡在那里。
----
为了解决上述线程阻塞的问题,只能创建新的线程来完成其他工作,使程序得以继续执行,下面使用两个类(BioServer,BioClient)模拟一下BIO。
public class BioServer {
private ServerSocket serverSocket;
public BioServer(int port,int backlog) throws IOException {
this.serverSocket = new ServerSocket(port,backlog);
}
private void start() throws IOException {
ExecutorService executorService = Executors.newFixedThreadPool(2);
while (true) {
Socket socket = serverSocket.accept();
System.out.println(String.format("a new client connect %s", socket.getPort()));
executorService.submit(new BioServerHandler(socket));
}
}
public static void main(String[] args) throws IOException {
new BioServer(6000,3).start();
}
}
class BioServerHandler implements Runnable {
private Socket socket;
public BioServerHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try (BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter pw = new PrintWriter(socket.getOutputStream())) {
String msg;
while ((msg = br.readLine()) != null) {
System.out.println(String.format("server receive:%s", msg));
pw.println(msg + " | " + new Date());
pw.flush();
}
} catch (IOException e) {...}
}
}
----
public?class?BioClient?{
??private?Socket socket;
??public?BioClient(String host,int?port) throws IOException?{
????this.socket =?new?Socket(host, port);
??}
??public?void?start()?{
????new?Thread(()->{
? ? ? ??try(BufferedReader br =?new?BufferedReader(new?InputStreamReader(socket.getInputStream()))){
????????String msg;
????????while((msg = br.readLine())!=null){
? ? ? ? ? ? ?System.out.println(String.format("client receive %s", msg));
????????}
???????}?catch?(IOException e) {...}finally?{...}
? ? ?}).start();
????System.out.println("client enter msg: ");
????PrintWriter pw;
????while(true){
??????try?{
????????pw =?new?PrintWriter(socket.getOutputStream());
????????pw.println(new?Scanner(System.in).next());
????????pw.flush();
??????}?catch?(IOException e) {...}
????}
}
??public?static?void?main(String[] args) throws IOException?{
??? ?new?BioClient("127.0.0.1",6000).start();
??}
}
客户端为了避免阻塞读取数据,创建新线程来处理数据读取工作,在当前线程阻塞式等待系统输入数据。以上就是阻塞式网络编程BIO的demo,主要存在的问题是阻塞导致线程无法复用。内容总结
以上是互联网集市为您收集整理的【java】网络编程之BIO全部内容,希望文章能够帮你解决【java】网络编程之BIO所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。