day13_网络编程
1. 网络通信
基本的通信架构
- CS架构(Client客户端/Server服务端)
- BS架构(Browser浏览器/Server服务端)
网络通信三要素
- IP地址:计算机在网络上的唯一标识
- 因特网上的每台计算机和其它设备都规定了一个唯一的地址
- IP地址有两种形式:IPv4、IPv6
- 端口号:应用程序在设备中唯一的标识
- 标记正在计算机设备上运行的应用程序的,被规定为一个 16 位的二进制,范围是 0~65535
- 周知端口:0~1023,被预先定义的知名应用占用
- 注册端口:1024~49151,分配给用户进程或某些应用程序
- 动态端口:49152到65535,之所以称为动态端口,是因为它 一般不固定分配某种进程,而是动态分配
- 标记正在计算机设备上运行的应用程序的,被规定为一个 16 位的二进制,范围是 0~65535
- 协议:连接和数据在网络中传输的规则
- 网络上通信的设备,事先规定的连接规则,以及传输数据的规则被称为网络通信协议
- 传输层的两个通信协议
- UDP:用户数据报协议
- TCP:传输控制协议
2. UDP通信
UDP特点
- 无连接、不可靠通信
- 不事先建立连接;发送端每次把要发送的数据(限制在64KB内)、接收端IP、等信息封装成一个数据包,发出去就不管了
- Java提供了一个
java.net.DatagramSocket
类来实现UDP通信
DatagramSocket
:用于创建客户端、服务端
构造器 | 说明 |
---|---|
public DatagramSocket() | 创建客户端的Socket对象, 系统会随机分配一个端口号。 |
public DatagramSocket(int port) | 创建服务端的Socket对象, 并指定端口号 |
方法 | 说明 |
---|---|
public void send(DatagramPacket dp) | 发送数据包 |
public void receive(DatagramPacket p) | 使用数据包接收数据 |
DatagramPacket
:创建数据包
构造器 | 说明 |
---|---|
public DatagramPacket(byte[] buf, int length, InetAddress address, int port) | 创建发出去的数据包对象 |
public DatagramPacket(byte[] buf, int length) | 创建用来接收数据的数据包 |
方法 | 说明 |
---|---|
public int getLength() | 获取数据包,实际接收到的字节个数 |
InetAddress
:代表IP地址
名称 | 说明 |
---|---|
public static InetAddress getLocalHost() | 获取本机IP,会以一个inetAddress 的对象返回 |
public static InetAddress getByName(String host) | 根据IP地址或者域名,返回一个inetAdress 对象 |
public String getHostName() | 获取该IP地址对象对应的主机名。 |
public String getHostAddress() | 获取该IP地址对象中的IP地址信息。 |
public boolean isReachable(int timeout) | 在指定毫秒内,判断主机与该IP对应的主机是否能连通 |
3. TCP通信
TCP特点
- 面向连接、可靠通信
- 通信双方事先会采用“三次握手”方式建立可靠连接,实现端到端的通信;底层能保证数据成功传给服务端
- Java提供了一个
java.net.Socket
类来实现TCP通信
Socket
:客户端开发
构造器 | 说明 |
---|---|
public Socket(String host , int port) | 根据指定的服务器IP、端口号请求与服务端建立连接,连接通过,就获得了客户端socket |
方法 | 说明 |
---|---|
public OutputStream getOutputStream() | 获得字节输出流对象 |
public InputStream getInputStream() | 获得字节输入流对象 |
ServerSocket
:服务端开发
构造器 | 说明 |
---|---|
public ServerSocket(int port) | 为服务端程序注册端口 |
方法 | 说明 |
---|---|
public Socket accept() | 阻塞等待客户端的连接请求,一旦与某个客户端成功连接,则返回服务端这边的Socket对象。 |