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

发布于:2025-06-03 ⋅ 阅读:(22) ⋅ 点赞:(0)

为什么需要网络编程?

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

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

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

什么是网络编程

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

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

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

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

进程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的绑定端口,换为其他没有使用的端口。


网站公告

今日签到

点亮在社区的每一天
去签到