网络协议
OSI七层模型(从下到上)
- 物理层
- 数据链路层
- 网络层
- 传输层
- 会话层
- 表示层
- 应用层
TCP/IP四层模型(从下到上)
- 链路层
- 网络层
- 传输层
- 应用层
基本的网络接口
使用InetAddress
两个子类 Inet4Address 和Inet6Address --分别对应IPV4和IPV6
InetAddress提供的常用方法:
- public String getHostAddress():返回 IP 地址字符串(以文本表现形式)。
- public String getHostName():获取此 IP 地址的主机名
- public String getCanonicalHostName():获取此 IP 地址的完全限定域名
- public boolean isReachable(int timeout):测试是否可以达到该地址。
使用URL
URI:表示一个统一资源标识符引用,用来唯一表示一个资源
URL:统一资源定位符,是指向互联网资源的指针,URL不仅能表示一个资源,还指明了如何locate这个资源。
url组成:
<传输协议>://<主机名>:<端口号>/<文件名>#片段名
<传输协议>://<主机名>:<端口号>/<文件名>?参数列表
URL构造方法:
URL常用方法:
- string getProtocol():获取url的协议名
- String getHost():获取主机名
- String getPort():获取URL端口号
- String getPath():获取URL的文件路径,服务器下的资源文件路径
- String getFile():获取URL的文件名
- String getRef():获得url在文件中的相对位置
- String getQuery():获得url的查询名
- String final InputStream openStream():返回一个从连接读入的inputstream
URLConnection
url的openStream()可以从网上读取数据,但是无法上传数据,给服务器发送数据,如果希望,可使用URLConnection
步骤
- 通过URL对象调用openConnection方法创建URLConnection连接对象
- 处理设置参数和一般请求属性
- 使用connect方法建立到远程对象的实际连接
- 远程对象变为可用,远程对象的头字段和内容变为可访问
URLConnection的常用方法:
- public InputStream getInputStream()返回从此打开的连接读取的输入流。
- public OutputStream getOutputStream()返回写入到此连接的输出流。
- public void setDoInput(boolean input)
URL 连接可用于输入和/或输出。如果打算使用 URL 连接进行输入,则将 DoInput 标志设置为 true;如果不打算使用,则设置为 false。默认值为 true。
Socket
分类:
- 流套接字(stream socket):使用tcp提供可依赖的字节流服务
- 数据报套接字(datagram socket):使用UDP提供 不太可靠的数据报服务
常用构造器
- public Socket(InetAddress address,int port):创建一个流套接字并指定IP地址的端口号
- public Socket(String host,int port):创建一个流套接字并将其连接到指定主机上的指定端口号
Socket类的常用方法:
- public InputStream getInputStream():返回此套接字的输入流,可以用于接收消息
- public OutputStream getOutputStream():返回此套接字的输出流,可以用于发送消息
- public InetAddress getInetAddress():返回连接到的远程IP地址,如果套接字未连接,返回null
- public void close():关闭套接字,套接字被关闭后,便于在网络中使用
- publi void sutdownInput():调用后,返回EOF(文件结束符)
- public void shutdownOutput():禁止套接字的输出流,禁止后,抛出IOException
基于TCP协议的网络编程
TCP(Transmission Control Protocol,传输控制协议)被称为一种端对端协议,是一种面向连接的,可靠的,基于字节流的传输层的通信协议,可以连续传输大量的数据
步骤
服务器程序的工作过程包含以下五个基本的步骤:
- 使用 ServerSocket(int port) :创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。
- 调用 accept()方法:监听连接请求,如果客户端请求连接,则接受连接,创建与该客户端的通信套接字对象。否则该方法将一直处于等待状态。
- 调用 该Socket对象的 getOutputStream() 和 getInputStream ():获取输出流和输入流,开始网络数据的发送和接收。
- 关闭Socket对象:某客户端访问结束,关闭与之通信的套接字。
- 关闭ServerSocket:如果不再接收任何客户端的连接的话,调用close()进行关闭。
客户端Socket的工作过程包含以下四个基本的步骤:
6. 创建 Socket:根据指定服务端的 IP 地址或端口号构造 Socket 类对象,创建的同时会自动向服务器方发起连接。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
7. 打开连接到Socket 的输入/出流:使用 getInputStream()方法获得输入流,使用 getOutputStream()方法获得输出流,进行数据传输。
8. 进行读/写操作:通过输入流读取服务器发送的信息,通过输出流将信息发送给服务器。
9. 关闭 Socket:断开客户端到服务器的连接
UDP协议编程
####UDP(User Datagram Protocol,用户数据报协议):是一个无连接的传输层协议,提供面向事物的简单不可靠的信息传送服务
特点
- 将数据,源,目的封装成数据包,不需要建立连接
- 每个数据报的大小限制在64K
- 因无需连接,故不可靠,速度快
类 :DatagramSocket 和DatagramPacket 实现了基于UDP协议网络程序
DatagramSocket常用方法:
- DatagramSocket(int port)
- DatagramSocket(int port,InetAddress laddr)
- close()关闭此数据报套接字
- send(DatagramPacket p)
- receive(DatagramPacket p)
- getLocalAddress()获取套接字绑定的本地地址
- getLocalPort()返回此套接字绑定的本地主机上的端口号
- getInetAddress()返回此套接字连接的地址。如果套接字未连接,则返回 null
- getPort()返回此套接字的端口
DatagramPacket类的常用方法
- DatagramPacket(byte[] buf,int length), length 参数必须小于等于 buf.length
- DatagramPacket(byte[] buf,int length,InetAddress address,int port)构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。length 参数必须小于等于 buf.length。
- InetAddress getAddress()返回某台机器的 IP 地址
- int getPort()返回某台远程主机的端口号
- int getPort()返回某台远程主机的端口号
- int getLength()返回将要发送或接收到的数据的长度
流程
- 建立发送端的DatagramSocket,需要指定本端的端口号
- 建立数据包DatagramPacket
数据
接收端的IP地址
接收端的端口号 - 调用Socket的发送方法
- 关闭Socket