Java随笔记 - Java BIO,Socket通信
Java随笔记 - Java BIO,Socket通信
Java I/O中的Socket通信
在上一篇博客里,对NIO进行了简单介绍,主要是其中的三个核心概念,详情见(Java随笔记 - Java NIO的初步认识,NIO的三个核心概念,Channel和Buffer的简单使用)。本来应该写一篇详解flip函数的文章的,这里插叙一下Java IO的几个点。
早期的Java I/O库,所实现的是一种同步阻塞式的I/O模型,因此也被称为BIO(Blocking I/O)。所谓的同步阻塞式I/O,就是程序在遇到I/O操作时,需要阻塞当前程序的执行,等待I/O操作的完成,再继续执行后续的逻辑操作。也就是说,在等待I/O操作完成的这段时间,线程处于阻塞阻塞状态,不能去做别的事情。对于Socket通信而言,数据的发送和接收都需要阻塞当前的线程,等待数据传输完成后才能继续执行后续的任务。
典型的编程模型
服务端通过ServerSocket对象负责在指定的端口监听来自客户端的连接请求。客户端通过创建Socket对象,对服务端发起连接请求。连接成功后,双方通过输入流和输出流进行通信。双方在数据的发送和读取过程中,线程调用Socket的相关API后,都会进入阻塞状态,知道数据的发送或者读取完成。通过上图所展示的简单模型,可以看到,客户端需要创建一个Socket对象来对服务端的ServerSocket发起连接请求,而服务端则用一个专门的线程Acceptor不断循环调用accept( )方法来检查并接收新的连接请求。一旦有新的连接请求进来,该方法会返回一个与这个新的连接对应的Socket对象,通过该对象可以与客户端进行数据传输。然后Acceptor线程会创建一个新的处理线程,把这个新的Socket对象交给它,之后就由这个处理线程通过Socket对象与客户端进行通信和逻辑处理。
在这一编程模型中,一个线程负责处理一个客户端连接,编程逻辑简单、容易理解。但是,其存在的问题也很明显,没建立一条连接就要开启一个相应的线程来进行处理,那如果连接的数目巨大呢?根本不可能同时支撑大量的连接数,而且在客户端数量较大时,服务器的性能也会有所下降。
Socket编程中关键API概述
ServerSocket
这是服务端用于监听Socket连接的类,它的构造函数可以指定要监听的IP地址和端口号,也可以在实例化之后通过bind方法进行指定。而不管使用哪个方法进行指定,都只能指定一次,不可进行后续的修改
ServerSocket的accept( )方法用于接收来自客户端的连接请求,调用该方法后,线程会被阻塞,直到有连接进来
InetAddress和InetSocketAddress
- InetAddress是Java对IP地址的封装,而InetSocketAddress则是InetAddress的子类,也是其唯一子类,增加了对端口号的封装
Socket
- Socket套接字用于对Socket连接进行读写操作,客户端在发起连接时,可以在构造函数中指定服务端的IP和端口,也可以通过connect( )方法进行指定
补充
TCP协议是面向连接的流协议,而Socket并不提供直接的数据收发方法,数据的收发需要另外通过输入/出流的读写操作来进行。输入流用于读取数据,输出流用于发送数据。Socket的getInputStream( )和getOutputStream( )方法分别用于获取输入流和输出流。相应的,在输入流和输出流的处理过程中,操作未完成之前线程是阻塞的。
下篇博客给两个使用BIO进行数据传输的代码示例
Java随笔记 - Java BIO,Socket通信相关推荐
- java面试题44关于 Socket 通信编程,以下描述正确的是:( )
java面试题44关于 Socket 通信编程,以下描述正确的是:( ) A 客户端通过new ServerSocket()创建TCP连接对象 B 客户端通过TCP连接对象调用accept()方法创建 ...
- Java自学笔记——Java面向对象——04.抽象类、接口、内部类
Java 面向对象各节 Java自学笔记--Java面向对象--01.回顾方法 Java自学笔记--Java面向对象--02.构造器.类和对象 Java自学笔记--Java面向对象--03.封装.继承 ...
- 廖雪峰Java自学笔记------Java简洁
廖雪峰Java自学笔记------Java简洁 这是专门针对小白的零基础Java教程. 为什么要学Java? 因为Java是全球排名第一的编程语言,Java工程师也是市场需求最大的软件工程师,选择Ja ...
- java与C语言之间socket通信(java客户端 C服务端)
直接贴代码 服务端C代码 server.c #include <stdio.h> #include <sys/types.h> #include <sys/socket. ...
- java与c/c++进行socket通信的一些问题(2)
import java.net.*; import java.io.*; /** * 与C语言通信(java做Client,c/c++做Server,传送一个结构) * @author kingfis ...
- Java笔记-Java日常笔记-Java核心语言-史上最全Java笔记-Java烂笔头-实时更新(~v~)
阿一的日常Java笔记,实时更新,有什么问题可以留言交流一下,大家一起共同进步!!! 1.Java基础 1.1.基本语法 1.1.1.关键字 定义:被java赋予特殊含义的字符串(单词): 关 ...
- Java工作笔记/Java面试题/Java八股文/Java常用API
码农工具包 hutool工具 hutool工具类判断各种类型数据 <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --& ...
- 狂神说Java学习笔记 Java基础
目录 机器语言 第二代语言(汇编语言) 第三代语言 高级语言 Java特性和优势 JDK(Java Development Kit) JRE(Java Runtime Enviroment) JVM( ...
- Java学习笔记--Java中必记常见异常
JAVA常见异常 Java.io.NullPointerException null 空的,不存在的 NullPointer 空指针 空指针异常,该异常出现在我们操作某个对象的属性或方法时,如果该对象 ...
- JAVA入门笔记·JAVA名词及环境搭建
文章目录 一.JAVA主要特征 二.JAVA名词解释 三.环境搭建 一.JAVA主要特征 面向对象 分布式 跨平台 更安全 二.JAVA名词解释 JRE(运行环境) 包括JAVA虚拟机和JAVA程序所 ...
最新文章
- Debevec方法计算相机响应函数CRF
- (2006, 'MySQL server has gone away') 错误解决 - dba007的空间 - 51CTO技术博客
- ASP.NET MVC实践系列5-结合jQuery
- python流程控制语句-python学习 流程控制语句详解
- 2020年 第11届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】
- 开发.NET Core NuGet包并实现CI/CD
- MySQL · TokuDB · rbtree block allocator
- Python为你打开一扇门
- Java的搜索引擎框架
- 【2022.3】尚硅谷Vue.js从入门到精通基础笔记(理论+实操+知识点速查)
- C语言抽签(抽奖)小程序
- 如何实现语音转文字?这三个方法简单又实用,轻松实现语音转文字
- app登录策略实现(短信+一键登录+微信+微信小程序+抖音+抖音小程序)
- illumina 肿瘤分析流程
- X站全称是什么_B站课程排行榜,当代大学生最爱学什么?
- strstr(str1,str2) 函数
- node.js 从基础到操作数据库
- php的核心架构如下图,thinksns 核心架构及目录结构
- mysql赋予用户权限
- Minecraft我的世界云服务器搭建教程(小白看过来)
热门文章
- 定理证明器HOL的下载和安装
- 一个游戏程序员的学习资料(全是好书)
- Mac下用android studio创建安卓模拟器
- 论文 | 深度学习股票预测
- android 树莓派 图片,Android Things:树莓派3上手就是这么简单
- java开发专用英语,JAVA开发常用英语词汇
- STM32F7以太网HAL库源文件(stm32f7xx_hal_eth.c)笔记
- [论文笔记] Balboa: Bobbing and Weaving around Network Censorship
- Web前端人员如何实现状态保存 常用方法就什么
- APP加固新方向——混淆和瘦身