JAVA网络编程
网络编程三要素:
- IP地址:InetAddress
网络中设备的标识,不易记忆,可用主机名 - 端口号
用于标识进程的逻辑地址,不同进程的标识 - 传输协议
通讯的规则 常见协议:TCP,UDP
相关知识点:
在网络编程三要素中,有很多相关的需要了解的:
关于Ip地址:
ip地址是网络中计算机的唯一标识
计算机只能识别二进制的数据,所以我们的ip地址应该是一个二进制的数据
eg:ip:192.168.1.100
换算 1100000 10101000 00000001 01100100
计算机在配置ip地址的时候把ip地址的每一个字节上的数据换算成十进制,然后用.分开来表示 “点分十进制”
IP地址的组成:网络号段+主机号段
A类:第一号段为网络号段+后三段的主机号段
一个网络号段可分配 256256256 = 16777216台主机
B类:前二号段为网络号段+后二段的主机号段
一个网络号段可分配 256*256 = 65536台主机
C类:前三号段为网络号段+后一段主机号段 一个网络号段可分配 256台主机
D类 E类 保留号段
A类 1.0.0.1--127.255.255.254
B类 128.0.0.1--191.255.255.254
C类 192.0.0.1--223.255.255.254
D类 224.0.0.1-239.255.255.254
E类 240.0.0.1--247.255.255.254
私有号段:在互联网中不可用,在局域网中可用
10.x.x.x
172.16.0.0-172.31.255.255
192.168.x.x是私有地址
特殊的ip地址 回环地址
127.0.0.1
x.x.x.255 广播地址
x.x.x.0 网络地址
网络模型
计算机网络之间以何种规则进行通信,就是网络模型研究问题。
网络模型一般是指
OSI(Open System Interconnection开放系统互连)参考模型
TCP/IP参考模型
API
InetAddress
此类表示互联网协议 (IP) 地址。
static InetAddress[] getAllByName(String host)
在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
static InetAddress getByAddress(byte[] addr)
在给定原始 IP 地址的情况下,返回 InetAddress 对象。
static InetAddress getByAddress(String host, byte[] addr)
根据提供的主机名和 IP 地址创建 InetAddress。
static InetAddress getByName(String host)
在给定主机名的情况下确定主机的 IP 地址。
static InetAddress getLocalHost()
返回本地主机。
boolean isReachable(int timeout)
测试是否可以达到该地址。
boolean isReachable(NetworkInterface netif, int ttl, int timeout)
测试是否可以达到该地址。
端口号
正在运行的程序的标识 也就是进程的标识
- 物理端口 网卡口
- 逻辑端口 我们指的就是逻辑端口
A:每个网络程序都会至少有一个逻辑端口
B:用于标识进程的逻辑地址,不同进程的标识
C:有效端口:0~65535,其中0~1024系统使用或保留端口。
协议
通信的规则
UDP
* 概述:
将数据源和目的封装成数据包中,<font color = red>不需要建立连接;每个数据报的大小在限制在64k</font>;因无连接,是不可靠协议;不需要建立连接,速度快
DatagramSocket
此类表示用来发送和接收数据报包的套接字。
构造方法
- DatagramSocket(int port, InetAddress laddr)
创建数据报套接字,将其绑定到指定的本地地址。 - DatagramSocket()
构造数据报套接字并将其绑定到本地主机上任何可用的端口。
发送数据方法
-
void receive(DatagramPacket p)
从此套接字接收数据报包。 此方法在接收到数据报前一直阻塞。数据报包对象的 length 字段包含所接收信息的长度。如果信息比包的长度长,该信息将被截短。 -
void send(DatagramPacket p) 从此套接字发送数据报包。
DatagramPacket
此类表示数据报包。
构造方法
-
DatagramPacket(byte[] buf, int length)
构造 DatagramPacket,用来接收长度为 length 的数据包。 -
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。
解析
- byte[] getData() 返回数据缓冲区。
- int getLength() 返回将要发送或接收到的数据的长度。
Exception
java.net.BindException :Address already in use:Cannot bind
多次启动接收端会导致端口被占用
TCP
* 概述
建立连接,形成传输数据的<font color = red>通道</font>;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低
Socket
客户端 Socket
此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
- Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
-
Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
-
OutputStream getOutputStream() 返回此套接字的输出流。
-
void shutdownInput() 此套接字的输入流置于“流的末尾”。 指定输入流已经结束
-
void shutdownOutput() 输出流结束
服务端 ServerSocket
- ServerSocket() 创建非绑定服务器套接字。
-
ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
-
Socket accept() 侦听并接受到此套接字的连接。返回一个连接对应的socket对象
Socket通信
- Socket套接字:
网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
socket包含了IP地址+端口 指定目的地的应用程序
- Socket原理机制:
通信的两端都有Socket。 网络通信其实就是Socket间的通信。 数据在两个Socket间通过IO传输。