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通信相关推荐

  1. java面试题44关于 Socket 通信编程,以下描述正确的是:( )

    java面试题44关于 Socket 通信编程,以下描述正确的是:( ) A 客户端通过new ServerSocket()创建TCP连接对象 B 客户端通过TCP连接对象调用accept()方法创建 ...

  2. Java自学笔记——Java面向对象——04.抽象类、接口、内部类

    Java 面向对象各节 Java自学笔记--Java面向对象--01.回顾方法 Java自学笔记--Java面向对象--02.构造器.类和对象 Java自学笔记--Java面向对象--03.封装.继承 ...

  3. 廖雪峰Java自学笔记------Java简洁

    廖雪峰Java自学笔记------Java简洁 这是专门针对小白的零基础Java教程. 为什么要学Java? 因为Java是全球排名第一的编程语言,Java工程师也是市场需求最大的软件工程师,选择Ja ...

  4. java与C语言之间socket通信(java客户端 C服务端)

    直接贴代码 服务端C代码 server.c #include <stdio.h> #include <sys/types.h> #include <sys/socket. ...

  5. java与c/c++进行socket通信的一些问题(2)

    import java.net.*; import java.io.*; /** * 与C语言通信(java做Client,c/c++做Server,传送一个结构) * @author kingfis ...

  6. Java笔记-Java日常笔记-Java核心语言-史上最全Java笔记-Java烂笔头-实时更新(~v~)

    阿一的日常Java笔记,实时更新,有什么问题可以留言交流一下,大家一起共同进步!!! 1.Java基础 1.1.基本语法 1.1.1.关键字 ​ 定义:被java赋予特殊含义的字符串(单词): ​ 关 ...

  7. Java工作笔记/Java面试题/Java八股文/Java常用API

    码农工具包 hutool工具 hutool工具类判断各种类型数据 <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --& ...

  8. 狂神说Java学习笔记 Java基础

    目录 机器语言 第二代语言(汇编语言) 第三代语言 高级语言 Java特性和优势 JDK(Java Development Kit) JRE(Java Runtime Enviroment) JVM( ...

  9. Java学习笔记--Java中必记常见异常

    JAVA常见异常 Java.io.NullPointerException null 空的,不存在的 NullPointer 空指针 空指针异常,该异常出现在我们操作某个对象的属性或方法时,如果该对象 ...

  10. JAVA入门笔记·JAVA名词及环境搭建

    文章目录 一.JAVA主要特征 二.JAVA名词解释 三.环境搭建 一.JAVA主要特征 面向对象 分布式 跨平台 更安全 二.JAVA名词解释 JRE(运行环境) 包括JAVA虚拟机和JAVA程序所 ...

最新文章

  1. Debevec方法计算相机响应函数CRF
  2. (2006, 'MySQL server has gone away') 错误解决 - dba007的空间 - 51CTO技术博客
  3. ASP.NET MVC实践系列5-结合jQuery
  4. python流程控制语句-python学习 流程控制语句详解
  5. 2020年 第11届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】
  6. 开发.NET Core NuGet包并实现CI/CD
  7. MySQL · TokuDB · rbtree block allocator
  8. Python为你打开一扇门
  9. Java的搜索引擎框架
  10. 【2022.3】尚硅谷Vue.js从入门到精通基础笔记(理论+实操+知识点速查)
  11. C语言抽签(抽奖)小程序
  12. 如何实现语音转文字?这三个方法简单又实用,轻松实现语音转文字
  13. app登录策略实现(短信+一键登录+微信+微信小程序+抖音+抖音小程序)
  14. illumina 肿瘤分析流程
  15. X站全称是什么_B站课程排行榜,当代大学生最爱学什么?
  16. strstr(str1,str2) 函数
  17. node.js 从基础到操作数据库
  18. php的核心架构如下图,thinksns 核心架构及目录结构
  19. mysql赋予用户权限
  20. Minecraft我的世界云服务器搭建教程(小白看过来)

热门文章

  1. 定理证明器HOL的下载和安装
  2. 一个游戏程序员的学习资料(全是好书)
  3. Mac下用android studio创建安卓模拟器
  4. 论文 | 深度学习股票预测
  5. android 树莓派 图片,Android Things:树莓派3上手就是这么简单
  6. java开发专用英语,JAVA开发常用英语词汇
  7. STM32F7以太网HAL库源文件(stm32f7xx_hal_eth.c)笔记
  8. [论文笔记] Balboa: Bobbing and Weaving around Network Censorship
  9. Web前端人员如何实现状态保存 常用方法就什么
  10. APP加固新方向——混淆和瘦身