java 网络编程 [网络传输] [协议] [UDP与TCP] [套接字] [URL与URI]

本文深入探讨了Java网络编程,包括网络传输的通用协议、TCP/IP、FTP、UDP及其与TCP的区别。介绍了寻址、建立连接、数据封装过程、InetAddress、Socket套接字、DatagramPacket、TCP特性以及HTTP请求消息头等内容,帮助读者理解网络通信的各个环节。
摘要由CSDN通过智能技术生成

 

网络编程

 

  • 网络传输


通信双方通过传输介质依据网络协议进行数据传输的过程
网络协议就是计算机之间进行相互通信需要遵守的规则
想要网络之间相互通信必须遵守相同的网络协议

  • 通用协议

TCP/IP传输控制协议(TCP)和网际协议(IP)
TCP/IP协议是网络中使用的基本的通信协议,互联网的基础协议,没有它就根本不可能上网,任何和互联网有关的操作都离不开TCP/IP协议

FTP是File Transfer Protocol的缩写,即文件传输协议。
      它是Internet上使用非常广泛的一种通讯协议,是计算机网络上主机之间传送文件的一种服务协议,支持传输多种类型文件


UDP(User Datagram Protocol) 即用户数据报协议 , UDP是 ISO 参考模型中一种面向无连接的传输层协议,
                           提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是 IP 协议与上层协议的接口。
HTTP 是HyperText Transfer Protocol( 超文本传输协议)的缩写是互联网上应用最为广泛的一种网络传输协议。

         用于在客户端(浏览器)和万维网服务器间请求和应答的协议
        所有的WWW文件都必须遵守这个标准,它保证计算机正确快速地传输超文本文档,还能确定传输文档中的哪部分内容首先显示

 

  • 传输过程


通信双方通过
1)寻址 2)建立连接 3)释放连接 4)流量控制缓冲管理 5)多路复用 6)崩溃恢复
等过程进行数据传输

1)寻址。一个机器应用程序通过由IP地址和主机端口号组成因特网传输地址与另一个机器应用程序传输数据
   一个联网的计算机对应一个IP地址 , 一台计算机不同网络应用程序使用不同的端口

  IP 地址标识网络中不同计算机
  Port 端口标识计算机不同网络应用程序提供的不同网络服务 如web服务 ftp服务等
  逻辑端口范围 0-65535
  任何TCP/IP实现所提供的服务都用知名的1~1023之间的端口号
  TCP与UDP对于端口号的使用规定  
  TCP与UDP 可以在0---65535范围内的端口号。对于这65536个端口号有以下的使用规定:   
  (1)端口号小于256的定义为常用端口,服务器一般都是通过常用端口号来识别的。任何TCP/IP实现所提供的服务
     都用1---1023之间的端口号,是由IANA来管理的; 服务器则只要主机开着的,其服务就运行。
  (2)客户端通常对它所使用的端口号并不关心,客户端只需保证该端口号在本机上是惟一的就可以了.。
    客户端口号又称作临时端口号(即存在时间很短暂)这是因为它通常只是在用户运行该客户程序时才存在
  (3)大多数TCP/IP实现给临时端口号分配1024---5000之间的端口号。大于5000的端口号是为其他服务器预留的。

 2)建立连接
 网络应用中,采用三次握手的算法,并增加某些条件以保证建立起可靠的连接。增加的条件是:所发送的报文都要有递增的序列号;
 对每个报文设立一个计时器,设定一个最大时延,对那些超过最大时延仍没有收到确认信息的报文就认为已经丢失,需要重传。


 3)释放连接 


 4)流量控制差错控制缓冲管理

  • 网络模型

OSI参考模型   TCP/IP参考模型              
                                                     数据封包      数据拆包
应用层                   应用层                ↓                   ↑ HTTP FTP
表示层                                               ↓                   ↑
会话层                                               ↓                   ↑
传输层                   传输层                ↓                   ↑  TCP UDP  SPX NetBIOS NetBEUI
网络层                   网际层                ↓                   ↑ IP
数据链路层      主机至网络层        ↓ 数据传输   ↑
物理层                                              ↓→→→→→↑

  • 数据封装过程


 传输协议中各层都为上一层提供业务功能 ,下一层将上一层中的数据并入到本层的数据域中,
 然后通过加入报头或报尾来实现该层业务功能
 用户的数据要经过一次次包装,最后转化成可以在网络上传输的信号,发送到网络上。
数据拆包:  当到达目标计算机后,执行相反的过程。

传输层是OSI中最重要, 最关键的一层,是唯一负责总体的数据传输和数据控制的一层.
传输层提供端到端的交换数据的机制,检查分组编号与次序。
传输层对其上三层如会话层等,提供可靠的传输服务,
传输层对网络层提供可靠的目的地站点信息.主要功能为端到端连接提供传输服务.
这种传输服务分为可靠和不可靠的,其中Tcp是典型的可靠传输,而Udp则是不可靠传输.
为端到端连接提供流量控制,差错控制,服务质量(Quality of Service,QoS)等管理服务.

 

 

  • UDP 和 TCP 区别

 UDP
UDP是面向非连接的传输控制协议,数据是即时产生即时发送,如果数据不能在一个给定的期限内发送完毕,则这部分数据将被丢弃。
不需要连接,不管通信的对方在不在都发送 , 发送后不管对方是否接收到都不重发,所以速度快;
可靠性低,不提供数据传输的保证机制;
数据及源和目的封装成数据包,每个数据包的大小限定在64k,内负载比较小;
具有较好实时性,工作效率高;

 TCP
 TCP面向连接的传输协议,通过三次握手确认通信对方存在才形成数据传输通道,发送数据,传输后若发现差错,将会要求重发
可靠性高,提供了专门的传递保证机制和流控制以及错误恢复功能等 , 当传输出现错误时能自动予以纠正;
因为建立需要建立连接,速度慢;
连接中进行大量数据传输,效率低;

  • InetAddress


InetAddress 描述IP对象的类 没有构造函数
  |----  Inet4Address
  |----  Inet6Address
静态方法 getByName()

  • Socket 套接字

Socket “插座”,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄 ,为网络服务提供的一种机制
    互联网的主机一般运行了多个网络应用,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,
    不同的端口对应于不同的服务。客户软件将插头插到不同编号的插座,就可以得到不同的服务。

  每一个socket用一个半相关描述:   (协议,本地地址,本地端口)  
  一个完整的socket有一个本地唯一的socket号,由操作系统分配。
  Socket和ServerSocket类库位于java .net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。
  在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。
UDP 对应的Socket是 DatagramSocket 用来发送和接收数据报包的套接字

  • DatagramPacket 数据报包

              实现无连接包投放服务

 


数据通过 UDP 协议进行通信的实例


发送端
1)建立udpsocket服务
2)指定要发送的消息
3)定义数据包 将消息及接收放IP 端口信息打包成数据报包
4)调用socket服务的send方法将数据报包发送出去

class Udpsend
{
 public static void main(String[] args)
 {
  //创建udp服务
  DatagramSocket ds = new DatagramSocket();//可以在构造函数中定义发送端口
  //指定发送的数据
  byte[] buf = "你好".getBytes();
  //定义数据报包 ,并将数据封装成数据报包
  DatagramPacket dp = new DatagramPacket(buf,buf.length(),InetAddress.getByName(""),10000) //包含消息内容接收方IP地址应用端口
   //通过socket服务的send方法将数据报包发送出去
  ds.send(dp);
  //关闭资源
  ds.close();

 }

}


 

接收端
1) 定义 UDPsocket服务 监听一个接口
2) 定义 数据报包 用来存放接收到的数据
3) 通过 socket服务的receive 方法将接收到的数据存入定义好的数据包中
4) 调用数据包对象的方法提取数据包中的信息
5) 关闭数据报包资源


 

class Udpreceive  
{
 public static void main(String[] args)
 {
  //建立udp服务 绑定端口
  DatagramSocket ds = new DatagramSocket(10000);
  //定义数据包 用于存储数据
  byte[] buf = new byte[1024];
  DatagramPacket dp = new DatagramPacket(buf,buf,dp.length());
  String ip = dp.getAddress().getHostAddress();
  String data = new String(dp.getData(),0,dp.getLength());
  int port = dp.getPort();
  System.out.println("from ip :"+ip+"port : "+"      "+data);

  //关闭资源
  ds.close();

 }
}


 

  • TCP


TCP 分客户端 Socket 和服务端 ServerSocket
Socket 服务端在对象建立时就连接指定主机
因为Tcp是面向连接的 所以在建立socket服务时,就要有服务端存在,并连接成功,形成通路后在该通道进行数据传输
建立连接 形成通路 就有网络流对象
getInputStream()
gerOutputStream()
分别获取网络输入输出流
服务端要先于客户端开启


Reader 及 子类的 Read 是阻塞式方法 在输入可用,或未抛出异常或未到文件流结尾的情况下,该方法阻塞
BufferedWriter
Socket 的阻塞式方法connect
ServerSocket 的阻塞方法accept  侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。


void shutdownInput()
         关闭输入流
 void shutdownOutput()
          关闭输出流

  • http 请求消息头


HTTP:超文本传输协议 , 它工作于TCP/IP应用上
          

HTTP1.0和HTTP1.1的区别:
HTTP1.0只能获取一个资源,而且获取资源以后马上就断开
HTTP1.1可以获取多个资源,不会断开

 

Http的请求
请求行


消息头


200:请求成功
302 向别处请求资源
304或307     向缓存请求
404 请求的资源不存在
500 服务器端出现错误

http请求头

Accept: 用于告诉服务器,客户机所支持的数据类型
Accept-Charset: 用于告诉服务器,客户机所采用的码表
Accept-Encoding: 用于告诉服务器,客户机所支持的数据压缩格式
Accept-Language: 用于告诉服务器,客户机的语法环境
Host: 用于告诉服务器,客户机想访问服务器哪台主机
If-Modified-Since: 用于告诉服务器,客户机对于资源的最后缓存时间
Referer: 用于告诉服务器,客户机是从哪个页面去访问服务器的  (防盗链)
User-Agent: 用于告诉服务器,客户机的机器环境(例如所使用的操作系统,浏览器版本号)
Cookie:客户端通过这个头字段,可以带一些数据给服务器
Connection:客户端通过这个头字段告诉服务器,请求完成后,是保持链接还是关闭链接

http响应头


Location:这个头通常配合302状态码使用,服务器使用这个头告诉浏览器去找谁
Server:服务器通过这个头告诉浏览器,服务器的类型
Content-Encoding: 服务器通过这个头告诉浏览器,数据的压缩格式(gzip)
Content-Length:服务器通过这个头告诉浏览器,回送数据的长度
Content-Language:
Content-Type: 服务器通过这个头告诉浏览器,回送数据的类型
Last-Modified: 服务器通过这个头告诉浏览器,数据的最后修改时间
Refresh:服务器通过这个头告诉浏览器,多长时间定时刷新
Content-Disposition: 控制浏览器以下载方式打开回送的数据
Transfer-Encoding: 服务器通过这个头告诉浏览器,数据是以块方式回送的
Expires:控制浏览器缓存数据的时间(-1或0,代表控制浏览器不要缓存)
Cache-Control: no-cache 
Pragma: no-cache  以上三个头一起用,就可以控制所有的浏览器不要缓存数据

 

  • URI 和 URL

 

URI 表示一个统一资源标识符 (URI) 引用。
URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,
也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。

URI 是统一资源标识符,而 URL 是统一资源定位符。每个 URL 都是 URI,但不一定每个 URI 都是 URL。
这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。

URL 可分成几部分
  1) HTTP 协议
  2) 主机名称
  3)主机上的信息名称 (路径)
  4)在主机名后可以指定端口,不指定则默认端口80
  5)在URL后面加上特殊符号
   #之后可以添加片段信息
   ?之后为要查询的信息


  主要方法
  1)判断
  equals(Object o)
     若比较对象不是URL返回false
     如果两个 URL 具有相同的协议,引用相同的主机,主机上具有相同的端口号,文件相同,片段也都相同,则这两个 URL 对象相等。
  sameFile(URL other)
     比较两个URL  只比较到文件名部分  不包括片段部分

  2)转换
  toURI 返回URI 等效于  new URI (this.toString())

  3)获取
   getQuery() 获取此 URL 的查询部分
   getContent() 获取此 URL 的内容。此方法是openConnection().getContent()的缩写
   getPath() 获取此 URL 的路径部分。
   getUserInfo()获取此 URL 的 userInfo 部分。
   getAuthority()获取此 URL 的授权部分。
   getPort()获取此 URL 的端口号。 如果没设置端口返回 -1
   getDefaultPort()获取与此 URL 关联协议的默认端口号
   getProtocol()获取此 URL 的协议名称。
   getHost()获取此 URL 的主机名.
   getFile()获取此 URL 的文件名。返回的文件部分将与 getPath() 相同 ,再加上 getQuery() 值。
       如果没有查询部分,此方法和 getPath() 将返回相同的结果。
   getRef()获取此 URL 的锚点

  4)设置
   protected void set(String protocol, //要使用的协议
     String host, //主机名
     int port, //主机端口
     String file, //主机上的文件
     String ref) //URL中的内部引用
    这是一个非公共方法 , 所以只有 URLStreamHandler 才能修改 URL 字段 其他情况URL为常量
   protected void set(String protocol,//要使用的协议
                   String host,//主机名
                   int port,//主机端口
                   String authority,//授权部分
                   String userInfo,//用户名和密码
                   String path,//主机上的文件
                   String query,//URL的查询部分
                   String ref)//URL中的内部引用
 
3)打开

   openConnection 返回一个 URLConnection 对象 每次调用都会打开一个新的连接
   openSteam 返回一个用于从该连接读入的 InputStream 是openConnection().getInputStream() 的缩写

 

  • URLConnection

  URLConnection 抽象类 是所有类的超类,代表应用程序和 URL 之间的通信链接 有两个子类
     |-- HttpURLConnection
     |-- JarURLConnection
     创建一个到 URL 的连接需要几个步骤:
     1)  通过在 URL 上调用 openConnection 方法创建连接对象。
     2)  处理设置参数和一般请求属性。
     3)  使用 connect 方法建立到远程对象的实际连接。
     4)  远程对象变为可用。远程对象的头字段和内容变为可访问。
     
     connection 建立连接
     Permission getPermission() 建立此对象表示的连接所需的权限
     使用以下方法修改或获取设置参数:
     setAllowUserInteraction  getAllowUserInteraction 分别设置和获取allowUserInteraction 字段值
     setIfModifiedSince   getIfModifiedSince   分别设置和获取此对象的 ifModifiedSince 字段的值。
     setUseCaches      getUseCaches     分别设置和获取此连接的useCaches 字段的值
     setDefaultUseCaches  getDefaultUseCaches  分别设置和获取连接的useCaches 标志的默认值
     setDoInput       getDoInput      分别设置和获取连接的doInput 标志的值。
     setDoOutput      getDoOutput      分别设置和获取连接的doOutput 标志值
     setConnectTimeout      getConnectTimeout   分别设置和获取连接超时
     setReadTimeout    getReadTimeout    分别设置和获取读入超时设置。
     setFileNameMap    getFileNameMap    分别设置和获取从数据文件加载文件名映射
             
     使用以下方法修改或获取或添加一般请求属性:
     setRequestProperty   设置此连接指定的一般请求属性值。
     getRequestProperty   获取此连接指定的一般请求属性值。
     addRequestProperty(String key, String value) 添加一般请求属性
     
     在建立到远程对象的连接后,以下方法用于访问头字段和内容:
     getContent  获取此 URL 连接的内容
     getInputStream  从此打开的连接读取的输入流。
     getOutputStream 写入到此连接的输出流。

     getHeaderField(int n)     返回第 n 个头字段的值。
     getHeaderField(String name)     返回指定头字段的值
     getHeaderFieldKey(int n)  返回第 n 个头字段的键。
      Map<String,List<String>> getHeaderFields() 返回头字段的不可修改的 Map。        

     以下方法可以获取头字段值信息
     getContentEncoding() 返回content-encoding头字段的值 即内容编码类型
     getContentLength() 返回 content-length 头字段的值。 即内容长度
     getContentType() 返回 content-type 头字段的值 即内容类型
     getLastModified() 返回 last-modified 头字段的值 即最后修改时间
     getExpiration() 返回 expires 头字段的值。有效期                   
     getDate() 返回 date 头字段的值。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值