当前位置: 首页 > article >正文

网络编程1_网络编程引入

为什么需要网络编程?

用户再在浏览器中,打开在线视频资源等等,实质上说通过网络,获取到从网络上传输过来的一个资源。

与打开本地的文件类似,只是这个文件的来源是网络。相比本地资源来说,网络提供了更为丰富的网络资源。

所谓网络资源 ,其实就是在网络中获取到各种数据资源。而所有的网络资源,都是通过网络编程来进行数据传输。

什么是网络编程

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

也可以只需要满足进程不同即可。所以即使是同一个主机,只要是不同进程,基于网络来传输数据,也属于网络编程。

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

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

进程A :编程来获取网络资源。

进程B:编程来提供网络资源。

网络编程中的基本概念

发送端和接收端

在一次网络数据传输时:

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

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

收发端:既发送数据,又接收数据。

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

请求和响应

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

第一次:请求数据的发送(request)。

第二次:响应数据的发送。(response)。

客户端和服务端

服务端:在常见的网络数据传输场景下,把提供服务的一方进程,称为“服务端”,可以对外提供服务。(也就是我们常说的服务器)

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

客户端获取服务资源:

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

常见的客户端服务端模型

最常见的场景,客户端说给用户的程序,而服务端是给用户提供服务的程序。

1、客户端先发送请求给服务器。

2、服务器根据请求数据,进行相应业务的处理。

3、服务端返回响应:发送业务处理结果。

4、客户端根据响应的数据,展示处理结果(展示获取的资源,或提示保存资源的处理结果) 

客户端和服务器之间的交互,也是有很多种模式的:

1、一问一答:一个请求对应一个响应。(最常见的模式,网站开发(web开发)就是使用这种一问一答的模式)

2、一问多答:一个请求对应多个响应。(多出现于“下载”场景中)。

3、多问一答:多个请求,对应一个响应(多出现于“上传”场景中)。

4、多问多答:一个请求可能对应多个响应,一个响应也可能对应多个请求。(多用于“远程桌面/远程控制”)。

Socket套接字

概念

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

分类

Socket套接字主要针对应用层->传输层的协议分为如下三类:

字节流套接字

使用传输层的TCP协议,主要有以下特点:

1、有连接:通信双方必须都认同,才能使数据能够传输。

2、可靠传输:尽可能地传输数据,就算无法传输也能知道数据最终对方是否收到。

3、面向字节流:与文件中的字节流相同。

4、全双工:能够同时发送和接收信息。

数据报套接字

使用UDP协议,特点:

1、无连接

2、不可靠传输

3、面向数据报

4、全双工 

原始套接字

这里不做过多赘述 ……

Java数据报套接字通信模型

UDP协议来说,具有无连接、面向数据报的特征,即每次通信都没有建立连接,并且一次发送全部数据报,一次接收全部数据报。

Java中使用UDP协议通信,主要基于DatagramSocket类来创建数据报套接字,并使用DatagramPacket作为发送或者接收的UDP数据报。一次发送及接收UDP数据报流程如下:

以上只是一次发送端的UDP数据报发送和接收端数据报接收,并没有返回数据。也就是只有请求,并没有返回响应。对于一个服务器来说,重要的是处理多个客户端的请求并返回响应,流程如下: 

Java字节流套接字通信模型

 Socket编程的注意事项

1、客户端和服务器:我们自己练习开发时,经常是基于一个主机开启两个进程作为客户端和服务器,但真实的场景中,一般是不同主机作为客户端和服务器。

2、目的IP和端口号,表示了一次数据传输时要发送数据的终点主机和进程

3、Socket编程我们使用的是字节流套接字和数据报套接字,是基于传输层的TCP或者UDP协议,但也要考虑应用层协议,也需要考虑。

4、如果一个进程A已经绑定了一个端口,再启动另一个进程B绑定该端口,这种情况也叫做端口号被占用。在Java中,如果端口号被占用就会报出如下异常:

此时可以检查进程B绑定的时那个端口,再查看该端口被哪个进程占用。

在cmd中输入netstat -ano|findstr 端口号,就可以显示出对应进程的pid 

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

解决端口被占用问题 :

如果占用端口的进程A不需要进行,就可以关闭A之后,再启动需要绑定该端口的进程B。

如果需要运行A进程,也可以修改进程B的绑定端口,换为其他没有使用的端口。

http://www.lryc.cn/news/2394978.html

相关文章:

  • 【Day38】
  • HTML Day04
  • 佳能 Canon G3030 Series 打印机信息
  • 云原生安全基石:Kubernetes 核心概念与安全实践指南
  • 图像修复的可视化demo代码
  • autodl 安装了多个conda虚拟环境 选择合适虚拟环境的语句
  • 【AI工具应用】使用 trae 实现 word 转成 html
  • ansible-playbook 进阶 接上一章内容
  • 趋势直线指标
  • 基线配置管理:为什么它对网络稳定性至关重要
  • AWS WebRTC:获取ICE服务地址(part 1)
  • Nest全栈到失业(一):Nest基础知识扫盲
  • 摩尔线程S4000国产信创计算卡性能实战——Pytorch转译,多卡P2P通信与MUSA编程
  • Tesseract OCR 安装与中文+英文识别实现
  • Cypress + React + TypeScript
  • 每个路由器接口,都必须分配所属网络内的 IP 地址,用于转发数据包
  • c++第四课(基础c)——布尔变量
  • 第2期:APM32微控制器键盘PCB设计实战教程
  • Docker-搭建MySQL主从复制与双主双从
  • LeetCode - 203. 移除链表元素
  • canvas 实现全屏倾斜重复水印
  • vue3项目 前端文件下载的两种工具函数
  • SpringAI系列 - 升级1.0.0
  • 5.31 day33
  • Vue3 + VTable 高性能表格组件完全指南,一个基于 Canvas 的高性能表格组件
  • 【七. Java字符串操作与StringBuilder高效拼接技巧】
  • 题解:洛谷 P12672 「LAOI-8」近期我们注意到有网站混淆视听
  • HTML 计算网页的PPI
  • WIN11+eclipse搭建java开发环境
  • Linux 环境下C、C++、Go语言编译环境搭建秘籍