网络编程之套接字

目录

为什么需要网络编程

什么是网络编程

传输层的两个重要协议

什么是套接字Socket

分类

Java使用UDP协议 

 Java使用TCP协议 

两个协议的对比 


为什么需要网络编程

为什么需要网络编程? —— 丰富的网络资源
用户在浏览器中,打开在线视频网站,如优酷看视频,实质是通过网络,获取到网络上的一个视频资源。 与本地打开视频文件类似,只是视频文件这个资源的来源是网络。 相比本地资源来说,网络提供了更为丰富的网络资源:
网络编程之套接字_第1张图片

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

什么是网络编程

什么是网络编程
网络编程,指网络上的主机,通过 不同的进程 ,以编程的方式实现 网络通信(或称为网络数据传输)
网络编程之套接字_第2张图片

  • 当然,我们只要满足进程不同就行;所以即便是同一个主机,只要是不同进程,基于网络来传输数据, 也属于网络编程。
  • 特殊的,对于开发来说,在条件有限的情况下,一般也都是在一个主机中运行多个进程来完成网络编程。 但是,我们一定要明确,我们的目的是提供网络上不同主机,基于网络来传输数据资源:
  • 进程A:编程来获取网络资源
  • 进程B:编程来提供网络资源
  • 一般意义上的网络通信,一般站在应用层视角去探讨,所以一般的意义上的网络编程,多是在传输层上进行讨论

传输层的两个重要协议

  1. UDP User Datagram Protocol 用户报文协议 UDP没有做任何处理,保存网络的原生态,是不可靠,无连接,面向数据报文的一种协议
  2. TCP Transmission Control Protocol 传输控制协议 可靠,有连接,面向字节流的一种协议
  3. 都是传输层协议,都需要实现进程到进程的通信,都是站在应用层的角度

网络层的协议是IP协议

如何建立一条网络上(逻辑上)的通信线路

网络编程之套接字_第3张图片

发送端和接收端
在一次网络数据传输时:
  • 发送端:数据的发送方进程,称为发送端。发送端主机即网络通信中的源主机。
  • 接收端:数据的接收方进程,称为接收端。接收端主机即网络通信中的目的主机。
  • 收发端:发送端和接收端两端,也简称为收发端。
注意:发送端和接收端只是相对的,只是一次网络数据传输产生数据流向后的概念。
请求和响应
一般来说,获取一个网络资源,涉及到两次网络数据传输:
  • 第一次:请求数据的发送
  • 第二次:响应数据的发送。

网络编程之套接字_第4张图片

客户端和服务端

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

对于服务来说

  • 一般是提供:客户端获取服务资源
  • 客户端保存资源在服务端

好比在银行办事:
  • 银行提供存款服务:用户(客户端)保存资源(现金)在银行(服务端)
  • 银行提供取款服务:用户(客户端)获取服务端资源(银行替用户保管的现金)

什么是套接字Socket

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

 网络编程之套接字_第5张图片

分类

流套接字 :使用传输层 TCP 协议
  1. 有连接
  2. 可靠传输
  3. 面向字节流
  4. 有接收缓冲区,也有发送缓冲区
  5. 大小不限
对于字节流来说,可以简单的理解为,传输数据是基于 IO 流,流式数据的特征就是在 IO 流没有关闭的情况下,是无边界的数据,可以多次发送,也可以分开多次接收。
数据报套接字 :使用传输层 UDP 协议
  1. 无连接
  2. 不可靠传输
  3. 面向数据报
  4. 有接收缓冲区,无发送缓冲区
大小受限:一次最多传输 64k
对于数据报来说,可以简单的理解为,传输数据是一块一块的,发送一块数据假如 100 个字节,必须一次发送,接收也必须一次接收100 个字节,而不能分 100 次,每次接收 1 个字节
Java数据报套接字通信模型

 对于一次发送及接收UDP数据报的流程如下: 网络编程之套接字_第6张图片

 提供多个客户端的请求处理及响应,流程如下网络编程之套接字_第7张图片

Java使用UDP协议 

套接字的创建

DatagramSocket 构造方法

网络编程之套接字_第8张图片

  •  UDP服务器(Server)采用一个固定端口,方便客服端进行通信,可能会有错误的风险,(该端口已经被其他进程占用)
  • UDP客户端(Client),不需要采用固定端口(可以采用)
DatagramSocket 一些常用方法

网络编程之套接字_第9张图片

  •  一旦通信的双方逻辑意义上有了通信线路,双方地位是平等的(谁都可以作为接收方,谁都可以作为发送方)
  • 通信结束后,都需要进进行资源回收
  • 对于接收方法,如果没有接收到一个数据报,进程会一直阻塞

数据报的创建

网络编程之套接字_第10张图片

  • 数据报是通信过程的数据抽象,就理解成通信过程中发送/接收一个信封
  • 作为接收方,只需要提供存放数据的位置
  • 作为发送方,将需要发送的数据,和要发送给谁(远端ip+端口)

数据包类的方法

网络编程之套接字_第11张图片

  • 对于服务器使用,来获得客户端的ip和port
  • 对于接收者:拿到信的内容,对方进程发送的应用层的数据

网络编程之套接字_第12张图片

 例子

 Java使用TCP协议 

服务端的Socket建立

网络编程之套接字_第13张图片

  • 有连接(先拨号,拨通才能通信) 无连接 接发信(无脑发送,对方在不在都没关系)
  • 因为TCP是有连接的,服务器使用TCP Socket(传入的端口就是要公开的端口,一般称为监听端口)

服务端ServerSocket的方法

网络编程之套接字_第14张图片

  • 服务器的Socket(客户端对象)是通过accept中获取来的,所以客户端Socket对象需要主机手动实例
  • 挂电话,谁都可以挂

 客户端的Socket建立网络编程之套接字_第15张图片

  • 一旦拿到socket对象拿到,双方是同时拿到的(电话是同时解通的),双方的地位就平等了,只需要分发送方和/接收方

 客户端的Socket方法

网络编程之套接字_第16张图片

  • 拿到对方的IP地址/getRemote()拿到对方的端口
  • 输入流:站在进程角度,是输入流(背后对象就是网卡,网卡抽象出来的TCP连接),所以是给接收方使用的
  • 输出流:所以是给发送方方使用的

 输入和输出流的使用

因为是基于字节流的,所以可以使用输入输出流

网络编程之套接字_第17张图片

两个协议的对比 

网络编程之套接字_第18张图片

你可能感兴趣的