文章目录
网络编程是什么?
计算机与计算机之间的程序进行数据传输
一、网络编程三要素
-
IP:
计算机之间互相通信,作为每台计算机的指定标识。设备的标识 -
端口:
应用程序之间的通信,为每个应用程序的指定标识。应用程序的标识 -
协议 :
计算机之间通信时需要遵守的规则,对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换。
比如UDP/TCP/HTTP/HTTPS 协议
二、IP
计算机设备在网络中的地址,唯一的标识。
IP地址分为两大类:
-
IPv4
给每个连接在网络上的主机分配一个32bit地址。
按照TCP/IP规定,IP地址用二进制来表示,每个IP地址长32bit,也就是4个字节。 -
IPv6
采用128位地址长度,每16个字节一组,分成8组十六进制数
解决了网络地址资源数量不够的问题
DOS常用命令:
- ipconfig:查看本机IP地址
- ping IP地址:检查网络是否连通
特殊IP地址:
- 127.0.0.1:是回送地址,永远代表本机地址,一般用来测试使用
三、端口号
设备上应用程序的唯一标识。
两个字节表示的整数,它的取值范围是0~65535。
其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。
如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败
一个端口号一个应用程序
四、协议
网络通信协议
UDP协议
- 用户数据报协议(User Datagram Protocol)
面向无连接
通信协议。(也就是不会确定是否连接成功,直接甩数据过去)- 速度快,有大小限制一次最多发送64k,数据不安全,易丢失数据。
TCP协议
- 传输控制协议 (Transmission Control Protocol)
面向连接
的通信协议。(传送数据之间,会先判断是否连接成功)- 速度慢,没有大小限制,数据安全。
五、InetAddress 工具类
此类表示互联网协议 (IP) 地址。 内部方法可以获取本机IP地址与设备名称等
六、UDP协议
UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象
DatagramSocket
类作为基于UDP协议的Socket
DatagramSocket API构造方法:
没有指定端口号,会随机指定一个空闲的端口。
DatagramPacket
:此类表示数据报包。
数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。
1. 发送数据
//测试类
DatagramSocket ds = new DatagramSocket();//创建发送数据的端口 建立连接
//数据 地址 端口号
String str = "你好!";
byte[] bytes = str.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 10086;
//传递
DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
//发送
ds.send(dp);
ds.close();
2. 接收数据
DatagramSocket ds = new DatagramSocket(10086);//接收数据的端口
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
ds.receive(dp);
byte[] data = dp.getData();
InetAddress address = dp.getAddress();
int port = dp.getPort();
int len = dp.getLength();
System.out.println("数据为 " + new String(data, 0, len));
System.out.println("从这个地址 " + address + " 这个端口 " + port + "发送的数据");
ds.close();
先运行接收端(开启receive
接收等待), 然后再运行发送端!
发送端口是随机指定空闲的端口 ,我们 只需要确定 它发送给了10086 这个端口(并且我们从10086这个端口接收数据)即可。
使用UDP建立简单聊天室
需求:
UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
//接收端
DatagramSocket ds = new DatagramSocket(15050);
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
while (true) {
ds.receive(dp);
byte[] data = dp.getData();
int len = dp.getLength();
int port = dp.getPort();
InetAddress address = dp.getAddress(); // 地址包括(主机名+IP)
String name = address