Java阻塞式IO通信

阻塞式IO通信

一、BIO通信介绍

网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手建立连接,如果连接建立成功,双方就可以通过网络套接字(Socket)进行通信。在基于传统同步阻塞模型开发中,ServerSocket负责绑定IP地址,启动监听端口;Socket负责发起连接操作。连接成功之后,双方通过输入和输出流进行同步阻塞式通信。

先看一下BIO通信模型,采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成之后,通过输出流返回应答给客户端,线程销毁。这就是典型的一请求一应答通信模型。

在这里插入图片描述

该模型最大的问题就是缺乏弹性伸缩能力,当客户端并发访问量增加后,服务端的线程个数和客户端并发访问数呈1:1的正比关系,由于线程是Java虚拟机非常宝贵的系统资源,当线程数膨胀之后,系统的性能将急剧下降,随着并发访问量的继续增大,系统会发生线程堆栈溢出、创建新线程失败等问题,并最终导致进程宕机或者僵死,不能对外提供服务。

二、代码实例

2.1 服务端

TimeServer.java 主线程,监听端口的线程

package com.wangjun.io.bio;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 同步阻塞式IO创建时间服务器
 * @author wangjun
 * @date 2020-03-25
 * @version 1.0
 */
public class TimeServer {
   
	public static void main(String[] args) throws IOException {
   
		int port = 8080;
		if(args != null && args.length > 0) {
   
			try {
   
				port = Integer.valueOf(args[0]);
			} catch (NumberFormatException e) {
   
				//port采用默认值
			}
		}
		
		ServerSocket server = null;
		try {
   
			server = new ServerSocket(port);
			System.out.println("server started, port:" + port);
			Socket socket = null;
			while(true) {
   
				socket = server.accept();
				//启动一个新线程处理请求
				System.out.println("start a thread, hostName:" + socket.getInetAddress().getHostName());
				new Thread(new TimeServerHandler(socket)).start();
			
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值