前言:
学习到通信了,整理下相关知识点。打好基础,daydayup!!!
网络编程
网络编程指可以让设备中的程序与网络上其他设备中的程序进行数据交互。
基本的通信架构
基本的通信架构有两种形式:CS架构(Client客户端/Server服务端),BS架构(Browser浏览器/Server服务器)。区别在于:CS架构中,程序员需要实现客户端;BS架构中,不需要实现客服端,只需要用户安装浏览器即可。
网络通信三要素
实现网络通信需要实现三要素:1,IP:设备在网络中的地址,是唯一的标识(java中用InetAddress类代表ip);2,端口:应用程序在设备中唯一的标识;3,协议:连接和数据在网络中传输的规则
如何实现两个程序之间的通信
1:首先确认两个程序的ip地址;2:确认程序的端口号;3:确定传输协议
IP地址
IP(Internet Protocol):全称:互联网协议地址。是分配给上网设备的唯一标志。
IP地址有两种形式:IPv4(32位),IPv6(128位),由于IPv6尚未全面普及,IPv4接近饱和,为了解决这一状况,引入了公网IP和内网IP,公网IP为可以连接互联网的IP地址。内网为局域网IP为内部使用。
注:127.0.0.1为回环地址,代表自己
java中使用InetAddress类来代表ip地址
InetAddress
代表IP地址
常用方法:
|--------------------------------------------------|------------------------------|
| 名称 | 说明 |
| public static InetAddress getLocalHost() | 获取本机IP,会以一个inetAddress的对象返回 |
| public static InetAddress getByName(String host) | 根据ip地址或者域名,返回一个inetAddress对象 |
| public String getHostName() | 获取该ip地址对象对应的主机名 |
| public String getHostAddress() | 获取该ip地址对象中的ip地址信息 |
| public boolean isReachable(int timeout) | 在指定毫秒内,判断主机与该ip对应的主机是否可以连通 |
示例如下:
端口
标记计算机设备上的应用程序,被规定为一个16位的二进制,范围是0-65535
分类:
周知端口:0-1023,被预先定义的知名应用占用(例如:HTTP占用80,FTP占用21)
注册端口:1024-49151,分配给用户进程或某些应用程序
动态端口:49152-65535,之所以称为动态端口,是因为它一般不固定分配某种进程,而是动态分配。
注:我们自己开发的程序一般选择使用注册端口,且一个设备中不能出现两个程序的端口号一样,否则会出错
通信协议
网络上通信的设备,事先规定的连接规则,以及传输数据的规则被称为网络通信协议
常用的两个通信协议
UDP(User Datagram Protocol):用户数据报协议;
TCP(Transmission Control Protocol):传输控制协议;
UDP协议
特点:无连接,不可靠通信;不事先建立连接,数据按包发送,一包数据包含:自己的IP,程序端口,目标ip,程序端口和数据(一包数据在64KB以内)。发送方不管对方是否在线,数据在中间丢失也不管,如果接受方收到数据也不会返回确认。(一般用于语音通话,视频直播等,通信效率高)
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() | 获取数据包,实际接收到的字节个数 |
示例如下:
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对象 |
示例如下:
整理结束,撒花!!!