Java网络编程基础知识
网络分类
按照地理范围主要将网络分为局域网、城域网、广域网和因特网。
- 局域网(LocalArea Network)简称 LAN,是一种在小范围内实现的计算机网络,一般在一个建筑物内或者一个工厂、一个事业单位内部独有,范围较小。
- 城域网(Metropolitan Area Network)简称为 MAN,一般是一个城市内部组建的计算机信息网络,提供全市的信息服务。
- 广域网(Wide Area Network)简称为 WAN,它的范围很广,可以分布在一个省、一个国家或者几个国家。
- 因特网(Internet)则是由无数的 LAN 和 WAN 组成的。
网络编程模型
在网络通信中主要有两种模式的通信方式:一种是客户机/服务器(Client/Server)模式,简称为 C/S 模式;另一种是浏览器/服务器(Browser/Server)模式,简称 B/S 模式。
图1 C/S模型
开发模式的优势在于由于客户端是专门开发的,表现力会更强。缺点就是通用性差
Browser/Server 模式
浏览器/服务器模式
这种模式开发程序时只需开发服务器端即可,开发的压力较小,不需要维护客户端。但是对浏览器的限制比较大,表现力不强。
网络协议
网络协议是网络上所有设备(网络服务器、计算机及交换机、路由器、防火墙等)之间通信规则的集合,它规定了通信时信息必须采用的格式和这些格式的意义。
IP 协议
Internet 依靠 TCP/IP 协议在全球范围内实现不同硬件结构、不同操作系统、不同网络的互联。
在计算机网络中,现在命名 IP 地址的规定是 IPv4 协议,该协议规定每个 IP 地址由 4 个 0~255 的数字组成。
TCP/IP 定义了电子设备如何连入 Internet 以及数据如何在它们之间传输的标准。协议采用 4 层的层级结构,分别是应用层、传输层、网络层和网络接口层
图2 TCP/IP层次结构
TCP(可靠传输协议) 与 UDP 协议(不可靠传输协议)
尽管 TCP/IP 协议从名称看只包括 TCP 这个协议名,但是在 TCP/IP 协议的传输层同时存在 TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)两个协议。
TCP 协议是一种以固定连线为基础的协议,它提供两台计算机之间可靠的数据传送。而 UDP 无连接通信协议,它不保证可靠数据的传输,但能够向若干目标发送数据以及接收来自若干源的数据。
套接字和端口
在网络上很多应用程序都是采用客户端/服务器(C/S)的模式,实现网络通信必须将两台计算机连接起来建立一个双向的通信链路,这个双向通信链路的每一端称之为一个套接字(Socket)。
图3 客户向服务器发送请求如果服务器接收到客户端的请求,就会创建一个套接字,客户端使用该套接字与服务器通信,但此时客户端的套接字并没有绑定到与服务器连接的端口号上。
Java InetAddress类及其常用方法
InetAddress 类对象包含一个 Internet 主机地址的域名和 IP 地址。
InetAddress 类提供了操作 IP 地址的各种方法。该类本身没有构造方法,而是通过调用相关静态方法获取实例。
Java TCP通信:Java ServerSocket类和Socket类
ServerSocket 类表示 Socket 服务器端,Socket 类表示 Socket 客户端,
ServerSocket 类
ServerSocket 类是与 Socket 类相对应的用于表示通信双方中的服务器端,用于在服务器上开一个端口,被动地等待数据(使用 accept() 方法)并建立连接进行数据交互。
ServerSocket 的构造方法
- ServerSocket():无参构造方法。
- ServerSocket(int port):创建绑定到特定端口的服务器套接字。
- ServerSocket(int port,int backlog):使用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口。
- ServerSocket(int port,int backlog,InetAddress bindAddr):使用指定的端口、监听 backlog 和要绑定到本地的 IP 地址创建服务器。
ServerSocket 的常用方法
ServerSocket 的常用方法如下所示。
- Server accept():监听并接收到此套接字的连接。
- void bind(SocketAddress endpoint):将 ServerSocket 绑定到指定地址(IP 地址和端口号)。
- void close():关闭此套接字。
- InetAddress getInetAddress():返回此服务器套接字的本地地址。
- int getLocalPort():返回此套接字监听的端口。
- SocketAddress getLocalSoclcetAddress():返回此套接字绑定的端口的地址,如果尚未绑定则返回 null。
- int getReceiveBufferSize():获取此 ServerSocket 的 SO_RCVBUF 选项的值,该值是从 ServerSocket 接收的套接字的建议缓冲区大小。
服务器端的 Socket 对象使用 getOutputStream() 方法获得的输出流将指定客户端 Socket 对象使用 getInputStream() 方法获得那个输入流。同样,服务器端的 Socket 对象使用的 getInputStream() 方法获得的输入流将指向客户端 Socket 对象使用的 getOutputStream() 方法获得的那个输出流。
Socket 类
Socket 类表示通信双方中的客户端,用于呼叫远端机器上的一个端口,主动向服务器端发送数据(当连接建立后也能接收数据)
Socket 的构造方法
Socket 的构造方法如下所示。
- Socket():无参构造方法。
- Socket(InetAddress address,int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口。
- Soclcet(InetAddress address,int port,InetAddress localAddr,int localPort):创建一个套接字并将其连接到指定远程地址上的指定远程端口。
- Socket(String host,int port):创建一个流套接字并将其连接到指定主机上的指定端口。
- Socket(String host,int port,InetAddress localAddr,int localPort):创建一个套接字并将其连接到指定远程地址上的指定远程端口。Socket 会通过调用 bind() 函数来绑定提供的本地地址及端口。
Socket 的常用方法
Socket 的常用方法如下所示。
- void bind(SocketAddress bindpoint):将套接字绑定到本地地址。
- void close():关闭此套接字。
- void connect(SocketAddress endpoint):将此套接字连接到服务器。
- InetAddress getInetAddress():返回套接字的连接地址。
- InetAddress getLocalAddress():获取套接字绑定的本地地址。
- InputStream getInputStream():返回此套接字的输入流。
- OutputStream getOutputStream():返回此套接字的输出流。
- SocketAddress getLocalSocketAddress():返回此套接字绑定的端点地址,如果尚未绑定则返回 null。
- SocketAddress getRemoteSocketAddress():返回此套接字的连接的端点地址,如果尚未连接则返回 null。
- int getLoacalPort():返回此套接字绑定的本地端口。
- intgetPort():返回此套接字连接的远程端口。
客户端与服务器端的简单通信
传输对象数据
Java UDP通信:Java DatagramSocket类和DatagramPacket类
UDP 协议是用户数据报协议的简称,也用于网络数据的传输。虽然 UDP 协议是一种不太可靠的协议,但有时在需要较快地接收数据并且可以忍受较小错误的情况下,UDP 就会表现出更大的优势。
下面是在 中使用 UDP 协议发送数据的步骤。
- 使用 DatagramSocket() 创建一个数据包套接字。
- 使用 DatagramPacket() 创建要发送的数据包。
- 使用 DatagramSocket 类的 send() 方法发送数据包。
接收 UDP 数据包的步骤如下:
- 使用 DatagramSocket 创建数据包套接字,并将其绑定到指定的端口。
- 使用 DatagramPacket 创建字节数组来接收数据包。
- 使用 DatagramPacket 类的 receive() 方法接收 UDP 包。
DatagramPacket 类
java.net 包中的 DatagramPacket 类用来表示数据报包,数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。
Java 什么是URL?及URL类和URLConnection类
URL 概念
URL 是统一资源定位符(Uniform Resource Locator)的简称,它表示 Internet 上某一资源的地址。通过 URL 用户可以访问各种网络资源,比如常见的 WWW 以及 FTP 站点。浏览器可以通过解析给定的 URL 在网络上查找相应的文件或其他资源。
协议名(protocol)指明获取资源所使用的传输协议,如 HTTP、FTP 和 file 等,资源名(resourceName)则应该是资源的完整地址,包括主机名、端口号、文件名或文件内部的一个引用。
URL 类
构造方法 | 说明 |
---|---|
public URL (String spec) | 通过一个表示 URL 地址的字符串可以构造一个 URL 对象。 |
public URL(URL context,String spec) | 使用基本地址和相对 URL 构造一个 URL 对象。 |
public URL(String protocol,String host,String file) | 使用指定的协议、主机名和文件名创建一个 URL 对象。 |
public URL(String protocol,String host,int port,String file) | 使用指定的协议、主机名、端口号和文件名创建一个 URL 对象。 |
方法 | 说明 |
---|---|
public String getProtocol() | 获取该 URL 的协议名。 |
public String getHost() | 获取该 URL 的主机名。 |
public int getPort() | 获取该 URL 的端口号,如果没有设置端口,返回 -1。 |
public String getFile() | 获取该 URL 的文件名。 |
public String getRef() | 获取该 URL 在文件中的相对位置。 |
public String getQuery() | 获取该 URL 的查询信息。 |
public String getPath() | 获取该 URL 的路径。 |
public String getAuthority() | 获取该 URL 的权限信息。 |
public String getUserInfo() | 获得使用者的信息。 |
public String getRef() | 获得该 URL 的锚点。 |
URLConnection 类
方法 | 说明 |
---|---|
void addRequestProperty(String key,String value) | 添加由键值对指定的一般请求属性。key 指的是用于识别请求的关键字(例如 accept),value 指的是与该键关联的值。 |
void connect() | 打开到此 URL 所引用的资源的通信链接(如果尚未建立这样的链接)。 |
Object getConnection() | 检索此 URL 链接的内容。 |
InputStream getInputStream() | 返回从此打开的链接读取的输入流。 |
OutputStream getOutputStream() | 返回写入到此链接的输出流。 |
URL getURL() | 返回此 URLConnection 的 URL 字段的值。 |
提取 URL 协议名称
System.out.println("这个网址的URL协议名称是:"+url.getProtocol()); //获取协议名称