网络编程—Socket套接字详解

news2024/11/15 9:04:48

目录

一、网络编程

1.1、为什么需要网络编程?

1.2、什么是网络编程

1.3、发送端和接收端

​编辑1.4、请求和响应

​编辑1.5、客户端和服务端 

二、Socket套接字 

2.1、概念

2.2、分类 

2.2.1、流套接字 

2.2.2、数据报套接字 

2.2.3、原始套接字 

2.3、Socket编程注意事项 


一、网络编程

1.1、为什么需要网络编程?

现在网络普及程度越来越高,网络上保存着我们日常生活中所需要的各种资源,使用程序通过网络来获取这些资源的过程就需要网络编程来实现。

1.2、什么是网络编程

网络编程,是指网络上的主机,通过不同的进程,以程序的方式实现网络编程(网络数据传输)。

当然,只要满足不同的进程就行;所以即便是同一个主机,只要是不同的进程,基于网络来传输数据,也属于网络编程。 

对于条件有限情况下,一般也都是在一个主机中运行多个进程来完成网络编程。

但是,一定要明确,目的是提供网络上不同主机,基于网络来传输数据资源。

  • 进程A:编程来获取网络资源
  • 进程B:编程来提供网络资源

1.3、发送端和接收端

在第一次网络数据传输时:

发送端:数据的发送方进程,称为发送端,发送端主机即网络通信中的源主机。

接收端:数据的接收方进程,称为接收端,接收端主机即网络通信中的目的主机。

收发端:发送端和接收端两端,简称为收发端。

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

1.4、请求和响应

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

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

好比餐馆吃饭:先要发起请求—点份炒饭;响应对方的请求—提供一份炒饭。

1.5、客户端和服务端 

服务端:在常见的网络数据传输的场景下,把提供服务的一方进程,称为服务端,可以对外提供服务。 

客户端获取服务的一方进程,称为客户端。

对于服务来说,一般是提供:

  • 客户端获取服务资源

  • 客户端保存资源在服务端  

好比我们在银行办理业务 

  • 银行提供存款服务:用户(客户端)存储现金(资源)在银行(服务端).
  • 银行提供取款服务:用户(客户端)取存储的现金(获取用户端资源).

常见的客户端和服务端模型

客户端是只给用户使用的程序,服务端是提供用户服务的程序。 

  1.  客户端先发送请求到服务端.
  2. 服务端根据请求数据,执行相应的业务处理.
  3. 服务端返回响应,发送业务处理结果.
  4. 客户端根据响应数据,展示处理结果(获取的资源,或提示保存资源的处理结果).

 

二、Socket套接字 

2.1、概念

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

2.2、分类 

Socket套接字主要针对传输层协议划分为如下三类:

2.2.1、流套接字 

使用传输层TCP协议,以下为TCP协议的特点

  • 有连接
  • 可靠传输
  • 面向字节流
  • 有接收缓冲区,也有发送缓冲区
  • 大小不限

对于字节流来说,可以简单理解为,传输数据是基于IO流,流式数据的特征就是在IO流没有关闭的情况下,是无边界的数据,可以多次发送,也可以分开多次发送。

2.2.2、数据报套接字 

使用传输层UDP协议 ,以下为UDP协议的特点

  • 有连接
  • 不可靠传输
  • 面向数据报
  • 有接收缓冲区,也有发送缓冲区
  • 大小受限:一次最多传输64k

对于数据报来说,可以简单理解为,传输数据是一块一块的,发送一块数据假如是100个字节,必须一次性发送,接收也必须一次性接收,而不能分一百接收,每次接收一个字节。

2.2.3、原始套接字 

原始套接字用于自定义传输协议,用于读写内核没有处理的IP协议数据。

有兴趣了解的盆友可以去看看这位大佬的博客原始套接字 

2.3、Socket编程注意事项 

  1. 客户端和服务端:开发时,经常是基于一个主机开启两个进程作为客户端和服务端,但真实的场景,一般都是不同主机。
  2. 注意目的IP和目的端口号,标识了一次数据传输时要发送数据的终点主机和进程。
  3. Socket编程我们是使用流套接字和数据报套接字,基于传输层的TCP或UDP协议,但应用层协议,也需要考虑,这块我们在后续来说明如何设计应用层协议。
  4. 关于端口被占用的问题。

如果一个进程A已经绑定了一个端口,再启动一个进程B绑定该端口,就会报错,这种情况也叫端口占用。对于java进程来说端口占用报错信息

此时就需要检查进程B绑定的是哪个端口,再查看哪个端口被占用,以下为端口查看进程的方式

1、打开命令行窗口输入命令,查找占用端口的应用进程。则可以显示对应进程的pid。如以下命令显示了8888进程的pid。

netstat -ano|findstr 端口号

2、在任务管理器中,通过pid查找进程

解决端口被占用的问题:

  • 如果占用端口的进程A不需要运行,就可以关闭A后,再启动需要绑定该端口的进程B
  • 如果需要运行A进程,则可以修改进程B的绑定端口,换为其他没有使用的端口。 

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

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

相关文章

面向对象编程主线五

面向对象编程 五、第五阶段–多态性 5.1、理解多态性 理解多态性:可以理解为一个事物的多种形态; 何为多态性: 对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用) 多态的使用&#x…

味尚食品 味尚拉面半干面是一种非常经典的中式面食

尊敬的客户,您好!感谢您对我们电商平台的关注,我们很高兴为您介绍我们平台上的一款热销产品——味尚拉面半干面。 味尚拉面半干面是一种非常经典的中式面食,其主要特点体现在面条的口感和味道方面,让人感觉仿佛在享受正…

infinigen安装教程

至于infinigen是什么,网上很多,这篇文章主要是我安装的记录 官网:https://infinigen.org/ github:https://github.com/princeton-vl/infinigen 安装 首先要配置wsl环境,如何配置wsl,可以关注公众号“科…

依次判断数组中的各元素是否以指定后缀作为结尾numpy.char.endswith()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 依次判断数组中的各元素 是否以指定后缀作为结尾 numpy.char.endswith() [太阳]选择题 下列代码最后输出的结果是? import numpy as np s np.array([teacher, student]) print(&…

Spring Boot 中的定时任务是什么, 如何使用

Spring Boot 中的定时任务是什么, 如何使用 Spring Boot 是一个非常流行的 Java Web 开发框架,它可以帮助开发者快速搭建一个 Web 应用程序。为了能够更好地管理后台任务,Spring Boot 提供了一种方便的方式来调度定时任务。这个功能被称为 Spring Boot …

Python应用实例(一)外星人入侵(四)

外星人入侵(四) 1.前文总结回顾1.1 alien_invasion.py1.2 settings.py1.3 ship.py 2.射击2.1 添加子弹设置2.2 创建Bullet类2.3 将子弹存储到编组中2.4 开火2.5 删除消失的子弹2.6 限制子弹数量2.7 创建方法_update_bullets() 1.前文总结回顾 1.1 alien…

java项目之汽车在线销售系统(ssm+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的汽车在线销售系统。 开发环境: 后端: 开发语言:Java 框架:ssm,mybatis JDK版…

电脑提示找不到应用程序怎么办?

无论个人电脑还是办公电脑,无一例外的都会安装一些应用程序来帮助我们使用。而在电脑的使用过程中总会出现一些大大小小的问题,其中双击桌面快捷方式显示找不到应用程序是一个比较常见的故障。那么,电脑找不到应用程序怎么解决呢? 电脑找不到…

RabbitMQ学习笔记8 高级特性 消息可靠性+消费

我们在测试类中去写一个方法去实现它: 运行: 我们去掉之前的消息鉴定,我们这里不用消息鉴定。 我们注释掉这个。再去运行: 我们现在模拟一下发送失败的情况: 之前我们设置了我们交换机的名称。 我们在测试类发送消息时…

如何提高力扣(Leetcode)的解题能力?

如何提高力扣(Leetcode)的解题能力? 力扣(Leetcode)是一个在线编程平台,提供了各种算法和数据结构的题目,让程序员可以练习和提高自己的编程技能。很多人都把力扣(Leetcode&#xf…

【脚本语言】Shell Script - 终端打印指令

目录 终端打印 基础语法 有趣的拓展 在echo中使用转义序列 输出彩色文本 终端打印 终端是交互式工具,在终端中打印文本是绝大多数脚本中的基本任务。 基础语法 终端打印有两种方法输出文本,分别是 echo 和 printf (就是C/C中的那个)。 在默认情况下…

Git---标签管理

文章目录 前言一、理解标签二、创建标签三、操作标签总结 前言 正文开始!!! 一、理解标签 标签tag,可以简单的理解为是对某次commit的一个标识,相当于起了一个别名.例如,在项目发布某个版本的时候,针对最后一次commit起一个v1.0这样的标签来标识里程碑的意义. 这有什么用呢?…

信息系统项目管理师(第四版)教材精读思维导图-第一章信息化发展

请参阅我的另一篇文章,综合介绍软考高项: 信息系统项目管理师(软考高项)备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 思维导图源文件下载: https://download.csdn.net/download/hanjingjava/8801629…

如何在工作中保持稳定的情绪

如何在工作中保持稳定的情绪 在高压的工作环境中,保持稳定的情绪对于程序员来说至关重要。作为一个程序员,我们常常面临着各种技术挑战、项目期限和团队合作的压力。在这样的环境下,情绪的波动可能会影响我们的工作效率和质量。因此&#xff…

使用OpenCV显示图像的RGB颜色直方图

#include <opencv2/opencv.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespace cv;int main( ) {Mat srcImage;srcImage=<

数据特征降维 | 主成分分析PCA数据特征降维

文章目录 效果一览文章概述部分源码部分源码参考资料效果一览 文章概述 数据特征降维 | 主成分分析PCA,(主成分分析经常用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特征) 部分源码 部分源码 %% 清空环境变量 warning off % 关闭报警信息 close a…

linux:ubuntu命令行扩容

参考&#xff1a; ubuntu 20.04 逻辑卷 ext4 文件系统扩容_mob604757006a49的技术博客_51CTO博客 总结&#xff1a; 准备步骤&#xff08;链接里没有说明&#xff0c;我参考了其他的帖子增加的一步&#xff09;&#xff1a; 1.关闭虚拟机&#xff0c;右键虚拟机&#xff0c;选择…

【枚举+容斥】牛客练习赛113 F

牛客练习赛113_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com) 题意&#xff1a; 思路&#xff1a; 这道题根本不是子序列DP&#xff0c;因为子序列内部是无序的&#xff0c;这点没意识到 这是问题的easy版本&#xff0c;这种easy版本的题一般都是去…

Windows下PaddleOCR用NCNN部署

1.所用到的ncnn格式的模型文件 要问这些模型哪里来的&#xff0c;请看下面提示信息: 2.查看字典函数读取方法 char* readKeysFromAssets() {std::ifstream ifs("./model/paddleocr_keys.txt");if (!ifs.is_open()){return 0;}ifs.seekg(0, std::ios_base::end);int …

[桌面运维]PC常用的视频接口,显示器VGA、DVI、HDMI、DP、USB-C接口的认识和应用

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…