目录
网络编程三要素
什么是网络编程?
在网络通信协议下, 不同计算机上运行的程序, 相互可以进行数据传输
思考: A电脑的FeiQ, 发送信息给B电脑中的FeiQ, 需要知道什么条件才能发送?
1. 电脑的地址
2. FeiQ接收数据的入口
3. 网络种传输数据的规则
网络编程三要素
1. IP地址: 设备在网络中的地址, 是一个唯一标识
2. 端口号: 应用程序在设备中的唯一标识
3. 协议: 数据在网络中传输的规则, 常见协议有UDP协议和TCP协议
IP
网络编程三要素: IP
IP全称"互联网协议地址", 也称"IP地址", 是分配给上网设备的数字标签
常见的IP分类为IPv4和IPv6
平时我们用的是域名呀, 怎么不是IP地址?
计算机的域名,通过DNS服务器解析域名为IP ,然后返回给计算机
计算机 -> IP -> 目标服务器 -> 目标服务器返回数据
IPv4:
32bit位(4字节)组成 -> 11000000 10101000 00000001 01000010
通过"点分十进制表示法" -> 192.168.1.66
一个字节表示0-255(256位), 4个字节全球最多只能有将近43亿个IP, 不能满足现在互联网的发展
IPv6:
128bit位(16字节)组成, 分为8组 -> 略
通过"冒分16进制表示法" -> 2001:0DB8:0000:0023:0008:0800:200C:417A
每组16进制前面有0可以省略 -> 2001:DB8:0:23:8:800:200C:417A
特殊情况: 如果计算出的16进制表示形式中有多个0表示的 -> "0位压缩表示法" -> FF01::1101
网络编程-常见命令
ipconfig: 查看本机IP地址
在DOS命令窗口中输入cmd,在光标处输入 ipconfig,敲回车,计算机会打印出相对的
IP地址。
ping 域名/IP地址
在DOS命令窗口中输入cmd, 在光标处输入 ping 域名/IP地址,敲回车检查指定域名网
络是否通常, 还能查看其IP地址
网络编程-Inetaddress类
Inetaddress类作用?
为了方便我们对IP地址的获取和操作, Inetaddress也表示Internet协议地址(IP地址)
Inetaddress没有对外提供构造方法, 方法有静态和非静态的
对于这种类, 都会提供一个静态方法返回该类对象,通过对象可以调用该类的方法
常用方法:
static Inetaddress getByName(String host); | 获取主机名的IP对象 |
String getHostName(); | 获取主机名 |
String getHostAddress(); | 获取字符串类型的IP地址 |
public class Demo {
public static void main(String[] args) throws UnknownHostException {
//获取主机名的IP对象
InetAddress address = InetAddress.getByName("Achao");
System.out.println(address); //Achao/192.168.10.3
//System.out.println(InetAddress.getByName("哈哈"));
//java.net.UnknownHostException: 不知道这样的主机
//分别获取主机名和IP地址
System.out.println(address.getHostName()); //Achao
System.out.println(address.getHostAddress()); //192.168.10.3
}
}
端口
网络编程三要素: 端口
应用程序在设备中的唯一标识
端口的注意事项:
1. 端口号用两个字节(整数)表示, 取值范围是0-65535
2. 其中0-1024的被一些知名的网络服务或者应用占用
3. 我们自己使用1024-65535之间的即可
4. 一个端口号只能被一个应用程序使用
扩展: 任务管理器中的PID
任务管理器中的PID(Process Identification)是指进程识别号, 也就是进程标识符
只要运行一个程序, 程序在内存中即为进程, 操作系统会自动分配一个标识
它是进程运行时系统随机分配的,并不代表专门的进程, 在运行时PID是不会改变标识符的
但是当终止程序后再运行PID标识符就会被系统回收, 就可能会被继续分配给新运行的程序
扩展: 如何通过进程PID查询对应端口号
CMD中输入netstat - nao, 展示当前计算机所有活动连接, 可以查看PID对应的端口号活动
连接
网络编程三要素-协议
网络编程三要素: 协议
计算机网络中, 连接和通信的规则被称为网络"通信协议"
网络通信协议的分类
1. UDP协议: 用户数据报协议, 面向无连接, 速度快,一次最多发送64K, 数据不安全,易丢失
用户数据报协议 (UDP,User Datagram Protocol)是 IP 上层的另一重要协议,它
是面向无连接的、不可靠的数据报传输协议。
2. TCP协议: 传输控制协议, 面向连接, 速度慢没有大小限制, 数据安全
网络编程三要素小结
要素1. IP, 设备在网络中的唯一标识
要素2. 端口, 应用程序在设备中的唯一标识
要素3. 协议, 数据在传输过程中遵守的规则
UDP-发送端
UDP发送步骤:
1. 创建发送端的 DatagramSocket 对象
2. 创建数据, 并将数据使用DatagramPacket打包
3. 调用DatagramSocket的 sent 方法发送数据
4. 释放资源
public class ClientDemo {
public static void main(String[] args) throws IOException {
//1. 创建发送端的DatagramSocket对象
DatagramSocket ds = new DatagramSocket();
//2. 创建数据, 并将数据使用DatagramPacket打包
String message = "你好啊,请问你是?";
byte[] bytes = message.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 9527;
//DatagramPacket(字节数组,内容长度,InetAddress对象,端口号)
DatagramPacket dp = new DatagramPacket(bytes, bytes.length,address,port);
//3. 调用DatagramSocket的sent方法发送数据
ds.send(dp);
//4. 释放资源
ds.close();
}
}
UDP-接收端
UDP接收数据步骤:
1. 创建接收端的 DatagramSocket 对象, 指定接收数据的端口
2. 创建一个新箱子DatagramPacket, 用于接收数据
3. 调用DatagramSocket的 receive 方法接收数据, 放入新箱子中
4. 解析数据包, 将数据展示在控制台
5. 释放资源
注意事项:
1. 接收端创建DatagramSocket对象需要指定端口, 否则就是随机端口接收数据
2. 需要先启动接收端, 在运行发送端
3. 如果启动了接收端, 没有接收到数据, 会死等(阻塞)
4. 接收到的数据, 可能放不满一个新箱子, 可以只将有效数据打印
public class ServerDemo {
public static void main(String[] args) throws IOException {