IO之Socket网络编程
一、Socket
Socket不是Java中独有的概念,而是一个语言无关标准。任何可以实现网络编程的编程语言都有Socket。
1,Socket概念
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一个端口号。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原义那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
2,Socket连接步骤
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。【如果包含数据交互+断开连接,那么一共是五个步骤】
(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
(2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
3,Socket在Java中应用
在java.net 包是网络编程的基础类库。其中ServerSocket 和Socket 是网络编程的基础类型。ServerSocket 是服务端应用类型。Socket 是建立连接的类型。当连接建立成功后,服务器和客户端都会有一个Socket 对象示例,可以通过这个Socket 对象示例,完成会话的所有操作。
对于一个完整的网络连接来说,Socket 是平等的,没有服务器客户端分级情况。
二、IO阻塞与非阻塞
阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作方法的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入方法会立即返回一个状态值。
以银行取款为例:
阻塞 : ATM排队取款,你只能等待(使用阻塞IO时,Java调用会一直阻塞到读写完成才返回);
非阻塞 : 柜台取款,取个号,然后坐在椅子上做其它事,等号广播会通知你办理,没到号你就不能去,你可以不断问大堂经理排到了没有,大堂经理如果说还没到你就不能去(使用非阻塞IO时,如果不能读写Java调用会马上返回,当IO事件分发器通知可读写时再继续进行读写,不断循环直到读写完成)
三、IO同步与异步
同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO 操作并等待或者轮询的去查看IO 操作是否就绪,而异步是指用户进程触发IO 操作以后便开始做自己的事情,而当IO 操作已经完成的时候会得到IO 完成的通知。
以银行取款为例:
同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO 时,Java 自己处理IO 读写);
异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO 时,Java 将IO 读写委托给OS 处理,需要将数据缓冲区地址和大小传给OS(银行卡和密码),OS 需要支持异步IO操作API)。
四、同步异步阻塞非阻塞区别
在研究同步异步阻塞非阻塞时,总感觉阻塞/非阻塞和同步/异步有异曲同工的地方,其实,这两者存在本质的区别,面向的对象是不同的。
阻塞/非阻塞:进程/线程需要操作的数据如果尚未就绪,是否妨碍了当前进程/线程的后续操作。
同步/异步:数据如果尚未就绪,是否需要等待数据结果。
转载于:https://www.cnblogs.com/guanghe/p/10856128.html
IO之Socket网络编程相关推荐
- 深入分析websocket协议,从3个方面设计网络应用层协议丨网络编程|网络IO|epoll|socket|网络协议丨c/c++linux服务器开发
深入分析websocket协议,从3个方面设计网络应用层协议 视频讲解如下: 深入分析websocket协议,从3个方面设计网络应用层协议丨网络编程|网络IO|epoll|socket|网络协议丨c/ ...
- Linux C++/Java/Web/OC Socket网络编程
一,Linux C++ Socket网络编程 1.什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制 ...
- socket网络编程 java_Java Web 基础(一) 基于TCP的Socket网络编程
一.Socket简单介绍 Socket通信作为Java网络通讯的基础内容,集中了异常.I/O流模式等众多知识点.学习Socket通信,既能够了解真正的网络通讯原理,也能够增强对I/O流模式的理解. 1 ...
- BIO,Socket网络编程入门代码示例,NIO网络编程入门代码示例,AIO 网络编程
BIO,Socket网络编程入门代码示例 1.BIO服务器端程序 package cn.itcast.bio;import java.io.InputStream; import java.io.Ou ...
- 基于Linux的socket网络编程项目——游侠手机商城
基于Linux的socket网络编程项目--游侠手机商城 一.项目说明 二.项目使用的技术 三.客户端搭建 四.服务器端搭建 一.项目说明 本项目是一个仿真手机商城类系统,基本功能: 登录界面功能:用 ...
- Java之socket网络编程
socket网络编程 文章目录 socket网络编程 一.网络编程概述 二.网络通信要素概述 三.IP和端口号 四.网络协议 五.TCP网络编程 六.UDP网络编程 一.网络编程概述 网络编程的目的 ...
- Java的IO流与网络编程
目录 一.概述 二.文件类(File) 1. File类的构造.获取属性 2. File类获取子文件或目录 3. File类文件重命名 4. File类的判断功能 5. File类创建.删除功能 三. ...
- 【socket】C语言的Socket网络编程
目录 Socket网络编程 1.网络知识 网络中进程之间如何通信? 什么是Socket? socket一词的起源 怎么理解端口? 怎么理解socket ? 2. 客户/服务器模式 2.1 服务器端: ...
- Linux 网络编程——socket 网络编程
文章目录 一.网络基础 TCP/UDP对比 TCP/IP协议族体系 socket IP地址 IP地址转化API inet_addr() inet_aton() inet_ntoa() inet_pto ...
- Java的IO模型基于网络编程利弊分析
JAVA的IO模型基于网络编程利弊分析 一.IO通俗理解 IO的过程 思考①答案:文件句柄 思考②答案: 阻塞/非阻塞 IO(程序对内核空间数据拷贝到用户空间阶段的耗时操作的等待方式) 同步/异步IO ...
最新文章
- 通用数据库连接执行类(SQL)
- 移动端开发 rem 单位使用问题
- Job make U funck Uself!!!
- 传说之下地图素材_【开阔眼界】地图上的史记——名著轻松读
- 飞机大战小游戏1.0版本
- c语言输入输出重定向到串口,关于printf重定向到串口的问题分析 - 全文
- 以优美方式编写JavaScript代码
- Django 优秀资源大全
- python如何获取网页内容_python如何获取网页内容
- 安装Ubuntu后找不到windows启动项的解决办法
- Si5341时钟芯片使用说明
- 全景图拍摄设备有哪些?全景图拍摄方法
- 服务器装系统bios设置方法,BIOS设置USB启动方法
- 服务器里怎么找到K3账套文件,金蝶K3账套自动备份步骤详解
- 初用MssqlOnLinux 【1】
- W99、阿里大学征服路 - W系列总纲
- perl 一行命令 2021-09-02
- Elasticsearch优秀的索引设置技巧
- Login 和 Logout
- 图片怎么做雕刻路径_精雕图怎么做路径
热门文章
- 拓端tecdat|R语言中的广义线性模型(GLM)和广义相加模型(GAM):多元(平滑)回归分析保险资金投资组合信用风险敞口
- 拓端tecdat|R语言对BRFSS数据探索回归数据分析
- 拓端tecdat|用TensorFlow实现MNIST
- 目标检测|YOLOv2原理与实现(附YOLOv3)
- python实现strand_sort排序算法
- 数据挖掘著名学者的网站
- oracle查询显示小写,oracle查询区分大小写
- java 高级查询插件_javascript高级组合查询控件(0.4更新)
- MySQL破log_MySQL中的binlog相关命令和恢复技巧
- python客户端与服务器端通信数据库原理_python学习之网络部分