(Java高级教程)第三章Java网络编程-第二节:套接字(Socket)编程基本概述

news2024/11/25 14:48:45

文章目录

  • 一:网络编程相关概念
    • (1)什么是网络编程
    • (2)网络编程中的相关概念
      • ①:发送端和接收端
      • ②:请求和响应
      • ③:服务端和客户端
  • 二:TCP和UDP
    • (1)TCP
    • (2)UDP
  • 三:Socket(套接字)
    • (1)什么是Socket
    • (2)深入理解Socket
    • (3)Socket分类
      • ①:流式套接字(SOCK_STREAM)
      • ②:数据包套接字(SOCK_DGRAM)
      • ③:原始套接字

一:网络编程相关概念

(1)什么是网络编程

网络编程:是指网络上的主机通过不同的进程以编程的方式实现网络通信

在这里插入图片描述

(2)网络编程中的相关概念

①:发送端和接收端

在一次网络数据传输时

  • 发送端:是指数据的发送方进程,发送端主机也即网络通信中的源主机
  • 接收端:是指数据的接收方进程,接收端主机也即网络通信中的目的主机
  • 收发端:发送端和接收端两端

注意发送端和接收端的概念是相对的,只是一次网络数据传输产生数据流向后的概念

在这里插入图片描述

②:请求和响应

一般来说获取一个网络资源会涉及两次网络数据传输

  • 第一次:请求数据的发送
  • 第二次:响应数据的发送

在这里插入图片描述

③:服务端和客户端

在常见的网络数据传输场景下

  • 服务端:是指提供服务的一方进程
  • 客户端:是指获取服务的一方进程

在这里插入图片描述

二:TCP和UDP

(1)TCP

TCP:是一种是面向连接的、可靠的、基于字节流的传输层通信协议

  • 面向连接:一定是一对一才能连接,而不像UDP协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的
  • 可靠的:无论的网络链路中出现了怎样的链路变化,TCP都可以保证一个报文一定能够到达接收端
  • 字节流:消息是没有边界的,所以无论我们消息有多大都可以进行传输。并且消息是有序的,当前一个消息没有收到的时候,即使它先收到了后面的字节,那么也不能扔给应用层去处理,同时对重复的报文会自动丢弃

具体来说,其特点如下

①:.TCP是面向连接(虚连接)的传输层协议

②:点对点:每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的

③:可靠有序、不丢不重:TCP提供可靠交付的服务,无差错、不丢失、不重复、按序到达

④:TCP提供全双工通信

  • 发送缓存准备发送的数据已发送但尚未收到确认的数据
  • 接受缓存按序到达但尚未被接受应用程序读取的数据不按序到达的数据

④:TCP面向字节流:TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流

  • :流入到进程或从进程流出的字节序列

在这里插入图片描述

(2)UDP

UDP:UDP协议在IP之上只增加了两个最基本的服务:复用分用和差错检测,剩下只做一件事情:尽全力交付,能给多少就给多少。当开发者选择UDP协议时,程序几乎直接与IP打交道。虽然UDP提供的是不可靠的服务,但是它具有很多的优点或者特点让其在某些应用场景中仍然熠熠生辉

  • UDP无需建立连接、不会引入建立连接时的时延
  • 无连接状态:TCP需要在端系统中维护连接状态。此连接状态包括接收和发送缓存、拥塞控制参数和序号与确认号的参数。而UDP不维护连接状态,也不跟踪这些参数。因此,某些专用应用服务器使用UDP时,一般都能支持更多的活动客户机
  • 分组首部开销小:TCP有20B的首部开销,而UDP仅有8B的开销
  • 无拥塞控制:因此网络中的拥塞不会影响主机的发送效率。某些实时应用要求以稳定的速度发送,能容忍一些数据的丢失,但不允许有较大的时延,而UDP正好满足这些应用的需求
  • UDP面向数据报

三:Socket(套接字)

(1)什么是Socket

Socket:中文名为套接字,是由操作系统提供的用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元,基于Socket的网络程序开发就是网络编程

在这里插入图片描述

(2)深入理解Socket

  • Socket英文原意为“插座、孔”,但中文里却把它翻译为“套接字”,是在让人有些费解

根据TCP/IP分层模型可以看到,在网络编程中用户所能做的操作都集于应用层,传输层开始以下均属于操作系统
在这里插入图片描述

这就意味着想要从传输层获取数据是一件非常麻烦的事情,因为用户必须要明白TCP/IP的协议操作和相关复杂的系统调用接口

因此Socket的作用就体现出来了,它会把TCP/IP层复杂的操作抽象为几个简单的接口以供应用层调用,以此来实现进程通信

在这里插入图片描述

总之,Socket是介于应用层和传输层之间的一个抽象层,可以称它为一种通信机制,Socket以上的进程是受应用程序控制的,以下的传输层协议则受操作系统控制。因此,只要应用程序选择使用TCP/IP协议进行通信,就必须要通过套接字与操作系统进行交互
在这里插入图片描述

那这种通信方式为什么叫做“Socket”呢?如下图,服务器就像一个大插排,包含很多插座,客户端就是像一个插头,每一个进程代表一条电线,客户端将电线的插头插到服务器插排上对应的插座上,就可以开始通信了
在这里插入图片描述
说的更深一点,其实套接字是应用程序为了获得网络通信服务而与操作系统进行交互时使用的一种机制 。当应用程序需要使用网络进行通信时,必须首先发出socket系统调用,请求操作系统为其创建一个套接字。此调用的实际效果是请求操作系统把网络通信中所需的一些系统资源(比如CPU时间,网络带宽等),分配给该程序。操作系统用套接字描述符(实则是一个小的整数)来表示这些资源的总和,然后该套接字描述符会返回给该进程,此后应用程序所有的网络操作(比如收发数据)都要使用这个套接字描述符(就像用open打开文件获得的一个文件描述符,然后writeread都要使用到这个描述符)。在处理系统调用的时候,通过套接字描述符,操作系统就可以识别出应该使用哪些资源来完成应用程序所请求的服务。通信结束后,会调用close系统调用让操作系统回收与该套接字相关的所有资源
在这里插入图片描述

(3)Socket分类

①:流式套接字(SOCK_STREAM)

流式套接字(SOCK_STREAM):流式套接字可以提供可靠的、面向连接的通讯流,这对应TCP套接字编程

在这里插入图片描述

②:数据包套接字(SOCK_DGRAM)

流式套接字(SOCK_STREAM):数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错,这对应UDP套接字编程。其不可靠表现在

  • 如果你发送了一个数据报,它可能不会到达。
  • 它可能会以不同的顺序到达
  • 如果它到达了,它包含的数据中可能存在错误
    在这里插入图片描述

③:原始套接字

流式套接字(SOCK_STREAM):原始套接字主要用于一些协议的开发,可以进行比较底层的操作。它功能强大,但是没有上面介绍的两种套接字使用方便,一般的程序也涉及不到原始套接字

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/143890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nVisual自动计算线缆长度

nVisual创建线缆后,需要对线缆长度进行计算,比如室外场景下光缆长度的测量及室内综合布线长度测量。nVisual可实现线缆生成后自动线缆长度的计算和手动测量线缆长度。本章将介绍测量长度接口的具体实现思路及接口调用。 一、计算原理 1.区分场景 nVis…

基于 Log 的通用增量 Checkpoint​

摘要:本文整理自 Apache Flink Contributor 俞航翔 9 月 24 日在 Apache Flink Meetup 的分享。主要内容包括:Checkpoint 性能优化之路解析 Changelog一览 State/Checkpoint 优化Tips:点击「阅读原文」查看原文视频&演讲 ppt01Checkpoint…

nodejs+npm的安装与配置

下载与安装下载点击_Node.js中文网_根据自身系统进行下载即可(建议下载10版本的,尽量不要下最新版本的)配置nodejs相关配置简介:Node.js是一个基于Chrome V8引擎的JavaScript运行环境,让JavaScript 运行在服务端的开发…

如何理解「异或(XOR)」运算在计算机科学中的重要性

前言 在学逻辑学的时候,基本的逻辑运算是非、与、或,且并没有得到特别的强调,而且事实上异或可以由这三个逻辑运算符表出。可是在计算机领域,异或似乎处于与非、与、或并列的关系,例如 C 语言的位运算符中就有专门的异…

pmp考试需要注意哪些?

注意的事情还是蛮多的,所以这里总结一个关于考试注意的点 先来分享一些总结的考试经验: 1、规划好时间:答题时间、填答题卡时间、检查时间,一般来说一道题答题时间和填答题卡的时间最好在一分钟左右,个别的题不能超过…

8.0、Linux-账号管理学习

8.0、Linux-账号管理学习 账号管理 - 简介 Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统的用户,都必须首先向系统的管理员申请一个账号,然后以这个账号的身份进入系统; 用户的账号一方面可以帮助系统管理员对使…

第一次设计产品logo需要注意的5点细节

对于每一个公司企业/产品来说,logo不仅是公司品牌的代表,也是影响公司运营和宣传的关键因素。为了充分发挥公司标志的作用,在企业成立之初就要把企业标志的设计作为一项重要工作来抓,以保证标志最终发挥积极作用。为了使标志设计符…

useEffect和useLayoutEffect的区别

使用方式 这两个函数的使用方式其实非常简单,他们都接受一个函数一个数组,只有在数组里面的值改变的情况下才会再次执行 effect。 差异 useEffect 是异步执行的,而useLayoutEffect是同步执行的。useEffect 的执行时机是浏览器完成渲染之后&…

修复被删除的数据库表

1.问题来源 有一天领导让我对比生产数据库表和测试数据库表,要确保表结构,字段类型一致。于是我导出测试环境数据库表的DDL,在导出表的时候有blob和clob的表报错,于是我就想把它给剔除再导出,就这样数据库表被我删掉了…

c++调python踩坑日志

目录 import_array();报错 矩阵互相转换 #include numpy相关vs2019配置 import_array();报错 参考:https://blog.csdn.net/weixin_40232401/article/details/106944336#:~:text%E5%9C%A8,import_array%20%28%29%E5%87%BA%E7%8E%B0%E6%8A%A5%E9%94%99%EF%BC%8C%E6…

renix如何查看时延和抖动和丢包——网络测试仪实操

目录 查看时延和抖动​ 一、预约测试资源 ​ 二、新建流​ 三、查看时延和抖动​ 查看丢包​ 一、预约端口​ 二、创建Raw流​ 三、如何查看流量的实时丢包个数和丢包比例​ 查看时延和抖动​ 一、预约测试资源 ​ 打开Renix软件,连接机箱, 预约端口​ 二…

课题-基于安卓androidstudio的团购app

一、课题介绍 客户端: 1:注册登录:用户使用注册的账号密码进行登录; 2:查看商品:用户可以查看发布的商品信息; 3:分类查看:用户可以通过分类的查看商品信息;…

MySQL索引的数据结构

索引的数据结构 本专栏学习内容来自尚硅谷宋红康老师的视频 有兴趣的小伙伴可以点击视频地址观看 1. 为什么要使用索引? 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比去图书馆找书,或者新华字典里找字,相当于一个目…

SQL用法详解

1.SQL语言是什么?有什么作用?SQL:结构化查询语言,用于操作数据库,通用于绝大多数的数据库软件2.SQL的特征大小写不敏感需以;号结尾支持单行、多行注释3操作数据库的SQL语言基于功能可以划分为4类:数据定义:DDL ( Data Definition Language)&#xff1a…

校验、异常处理

前端校验完后,后端需要再做一次校验 JSR303 定义了数据校验的标准 使用步骤 为Bean标识注解,并自定义错误提示 import javax.validation.constraints自定义规则:一个小写或大写字母 Email、Future、NotBlank、Size 等 不推荐使用NotEmp…

Linux下命令(2)

Linux下命令(2) 1. 解压缩命令 Linux 下最常用的打包程序是 tar 命令, 使用 tar 打出来的包我们常称为 tar 包, tar包文件的命令通常都是以.tar 结尾的,生成 tar 包后,就可以用其它的程序来进行压缩了。   功能: ta…

Python程序的构成

1.开始学习图形化程序设计 >>> import turtle #导入turtle模块 >>> turtle.showturtle() #显示箭头 >>> turtle.write("文字") #写字符串 >>> turtle.forward(300) #前进300像素 >>> turtle.c…

基于C++的AGV机器人无线控制实现

AGV系统概述 AGV原理 AGV行走控制系统由控制面板、导向传感器、方向电位器、状态指示灯、避障传感器、光电控制信号传感器、驱动单元、导引磁条、电源组成。 AGV的导引(Guidance)是指根据AGV导向传感器(Navigation)所得到的位置…

Blender如何打开IFC数据?

Blender如何打开IFC数据安装blenderbimIFC介绍下载和安装BlenderBIM插件Blender打开IFC数据对于一个外行人,当我想查看IFC数据的呈现形式时,但是我又没有Revit软件,那么我想到了Blender,网上查了只需要安装BlenderBIM插件&#xf…

表单验证[用户名、邮箱、密码、重复密码]

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>表单验证</title> <link rel"stylesheet" href"form.css"> <!-- 引入样式 --> &l…