文章目录
TCP和OSI参考模型
要想计算机之间是如何进行通信的,我们知道数据都是以0101这种二级制数字在电脑中保存并在互联网中进行通信的,单纯的分析二进制数据完全无从下手,TCP和OSI参考模型为我们进行数据通信的分析提供了方便。这里进行简单的介绍,毕竟这不是重点,我们的重点是java网络编程!!!
现在TCP/IP已经成为国际标准了,其实以前没有OSI和TCP/IP谁是老大老二,OSI还是IETF组织经过研究的推出的,但是最后还是被这个毛头小子TCP/IP独占天下,所以说被推崇的东西不一定是最好的。言归正传,我们开发一般混迹与传输层和网络层,java不是服务端的语言吗,服务端只管提供服务就好了,至于有没有漂亮的界面(应用层的部分)交给前端去做就ok了,我们只管数据的提供,可以说是我们是数据生产者。各层的功能各位去看计算机网络去吧!
混迹于各层的网络协议
不成规矩不成方圆,就像交通法规一样,红灯停绿灯行黄灯亮了等一等,你就想如果计算机在互联网中传递数据报文如果没有规律,那不得乱成一套。所以说网络协议就相当于生活中的交通法规,比如http、ftp、smtp、tcp、udp、arp等,他们位于网络模型的哪几层,我们要有个清晰的认识
其中最重要的是,其实都很重要,这里我们说开发中比较常用的比如http、TCP、UDP和IP。互联网中主机的通信对于用户来说大部分都是将数据以一定的形式展示给用户,从底层的01数据流到IP、TCP、UDP相应的数据封装,最后以http协议或者其他以文本格式或者图片形式展示给用户。(大致的分析)
UDP协议
UDP(User Data Protocol)用户数据协议,无连接,不可靠;传输快,系统耗费资源低,适用于对性能要求高于据完整性的场景。
运行于UDP协议之上的协议:
- DHCP协议:动态主机配置协议,动态配置IP地址
- NTP协议:网络时间协议,用于网络时间同步
- BOOTP协议:引导程序协议,DHCP协议的前身,用于无盘工作站从中心服务器上获取IP地址
TCP协议
TCP(Transfer Control Protocol)传输控制协议,三次握手建连接,传输可靠,大数据传输,效率略低于UDP,适用于对数据完整性要求比较高的场景
运行于TCP协议之上的协议:
- HTTP协议:超文本传输协议,用于普通浏览
- HTTPS协议:安全超文本传输协议,身披SSL外衣的HTTP协议
- FTP协议:文件传输协议,用于文件传输
- POP3协议:邮局协议,收邮件使用
- SMTP协议:简单邮件传输协议,用来发送电子邮件
- Telent协议:远程登陆协议,通过一个终端登陆到网络
- SSH协议:安全外壳协议,用于加密安全登陆,替代安全性差的Telent协议
InetAddress类及其常用方法
InetAddress类提供了操作互联网上IP地址和域名的的相关方法,该类本身没有构造函数,而是通过调用相关静态方法获取实例。常用方法如下:
方法名称 | 说明 |
---|---|
byte[] getAddress() | 返回此 InetAddress 对象的原始 IP 地址 |
static InetAddress getByAddress(byte[] addr) | 在给定原始 IP 地址的情况下,返回 InetAddress 对象 |
static InetAddress getByAddress(String host) | 在给定主机名的情况下确定主机的 IP 地址 |
String getCanonicalHostName() | 获取此 IP 地址的完全限定域名 |
String getHostAddress() | 返回 IP 地址字符串(以文本表现形式) |
String getHostName() | 返回此 IP 地址的主机名 |
static InetAdderss getLocalHost() | 返回本地主机 |
UDP之DatagramSocket&DatagramPacket
DatagramPacket的构造方法
构造方法 | 说明 |
---|---|
DatagramPacket(byte[] buf,int length) | 构造 DatagramPacket,用来接收长度为 length 的数据包 |
DatagramPacket(byte[] buf,int offset, int length) | 构造 DatagramPacket,用来接收长度为 length 的包,在缓冲区中指定了偏移量 |
DatagramPacket(byte[] buf,int length, InetAddress address,int port) | 构造 DatagramPacket,用来将长度为 length 的包发送到指定主机上的指定端口 |
DatagramPacket(byte[] buf,int length, SocketAddress address) | 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口 |
DatagramPacket常用方法
方法 | 说明 |
---|---|
InetAddress getAddress() | 返回某台机器的 IP 地址,此数据报将要发往该机器或者从该机器接收。 |
byte[] getData() | 返回数据缓冲区。 |
int getLength() | 返回将要发送或者接收的数据的长度。 |
int getPort() | 返回某台远程主机的端口号,此数据报将要发往该主机或者从该主机接收。 |
getSocketAddress() | 获取要将此包发送或者发出此数据报的远程主机的SocketAddress(通常为 IP地址+端口号)。 |
DatagramSocket构造方法
构造方法 | 说明 |
---|---|
DatagramSocket() | 构造数据报包套接字并将其绑定到本地主机上任何可用的端口。 |
DatagramSocket(int port) | 创建数据报包套接字并将其绑定到本地主机上的指定端口。 |
DatagramSocket(int portJnetAddress addr) | 创建数据报包套接字,将其绑定到指定的本地地址。 |
DatagramSocket(SocketAddress bindaddr) | 创建数据报包套接字,将其绑定到指定的本地套接字地址。 |
DatagramSocket 的常用方法
方法 | 说明 |
---|---|
void bind(SocketAddress addr) | 将此 DatagramSocket 绑定到特定的地址和端口。 |
void close() | 关闭此数据报包套接字。 |
void connect(InetAddress address,int port) | 将套接字连接到此套接字的远程地址。 |
void connect(SocketAddress addr) | 将此套接子连接到远程套接子地址(IP地址+端口号)。 |
void disconnect() | 断开套接字的连接。 |
InetAddress getInetAddress() | 返回此套接字连接的地址。 |
InetAddress getLocalAddress() | 获取套接字绑定的本地地址。 |
int getLocalPort() | 返回此套接字绑定的本地主机上的端口号。 |
int getPort() | 返回此套接字的端口。 |
使用UDP协议模拟从客户端输入信息发送一条消息,服务端接收并显示
public class UDPClient {
public static void main(String[] args) throws IOException {
// client
// 建立服务
DatagramSocket ds = null;
// 获取输入字符
BufferedReader br = null;
try {
if (ds == null)
ds = new DatagramSocket();
if (br == null)
br = new BufferedReader(new InputStreamReader(System.in));
// 把读取的资源打包
byte[] buf = br.readLine().getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(), 10005);
// 将打包好的数据发送出去
ds.send(dp);
} catch (IOException e) {
System.out.println("数据发送失败");
} finally {
ds.close();
if (br != null)
br.close();
}
// server
}
}
public class UDPServer {
public static void main(String[] args) throws IOException {
// 创建服务
DatagramSocket ds = null;
DatagramPacket dp = null;
try {
if (ds == null)
ds = new DatagramSocket(10005);
// 创建缓冲区
byte[] buf = new byte[1024];
// 接收数据
if (dp == null)
dp = new DatagramPacket(buf,buf.length