网络编程概述
网络编程:在网络通信协议下,不同计算机上运行的程序,可以进行数据传输
网络编程三要素
1.IP地址
设备在网络中的地址,是唯一的标识
全程互联网协议地址 也成IP地址,是分配给上网设备的数字标签。常见的IP分类为ipv4和ipv6
ipv4:
Ipv6:128bit 分成8组
IP常用命令 (用cmd运行)
ipconfig:查看本机IP地址
ping IP地址:检查网络是否连通
特殊IP地址: 127.0.0.1:是回送地址也称本地回环地址,可以代表本机的IP地址,一般用来测试使用
InetAddress 的使用
为了方便我们对IP地址的获取和操作,Java提供了一个类InetAddress 供我们使用
InetAddress:此类表示Internet协议(IP)地址
方法名 | 说明 |
static InetAddress getByName(String host) | 确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址 |
String getHostName() | 获取此IP地址的主机名 |
String getHostAddress() | 返回文本显示中的IP地址字符串 |
2.端口
应用程序在设备中唯一的标识
端口号:两个字节表示的整数,取值范围是0-65535
其中0~1023之间的端口号用于一些知名的网络服务或者应用。
我们自己使用1024以上的端口号就可以了。
注意:一个端口号只能被一个应用程序使用。
3.协议
计算机网络中,连接和通信的规则被称为网络通信协议,常见的协议有UDP协议和TCP协议
UDP协议
用户数据报协议(User Datagram Protocol)
UDP是面向无连接通信协议。(发送数据不管有没有连接,有连接就成功 没连接就失败)
速度快,有大小限制一次最多发送64K,数据不安全,易丢失数据。
TCP协议
传输控制协议 (Transmission Control Protocol) TCP协议是面向连接的通信协议。
速度慢,没有大小限制,数据安全。
UDP通信程序
udp发送数据
1创建发送端DatagramSocket对象
2创建数据,并把数据打包(DatagramPacket)
DatagramPacket(byte[] buf,int length,InetAddress address,int port)
第一个参数是数据 ,第二个参数是长度 第三个是发送到哪个IP 第四个是发送的端口
3调用DatagramSocket对象的方法发送数据
4释放资源
代码:
public static void main(String[] args) throws IOException { //创建码头对象 DatagramSocket ds =new DatagramSocket(); String s ="要发送的信息"; byte[] bytes =s.getBytes(); InetAddress address =InetAddress.getByName("127.0.0.1"); //随便定义个1024以后的端口 int port =10000; //DatagramPacket(byte[] buf,int length,InetAddress address,int port) DatagramPacket dp =new DatagramPacket(bytes,bytes.length,address,port); //码头发送包裹 ds.send(dp); //释放资源 ds.close(); }
UDP接收数据
1.创建接收端的DatagramSocket对象
2.创建箱子,用于接收数据
3.调用DatagramSocket的方法接收数据并将数据放入箱子中
4.解析数据包,并把数据在控制台显示
5.释放资源
代码:
public class Server { public static void main(String[] args) throws IOException { //表示接收端从10000端口接收数据 DatagramSocket ds =new DatagramSocket(10000); byte[] bytes =new byte[1024]; //创建用来接收的箱子 DatagramPacket dp =new DatagramPacket(bytes, bytes.length); //接收数据,把数据放到新箱子中 ds.receive(dp); //获取得到的数据的长度 int length =dp.getLength(); //从新的箱子中获取数据 // 这行其实也能省略 因为传来的数据已经在bytes中了 byte[] data =dp.getData(); System.out.println(new String(data,0,length)); //释放数据 ds.close(); } }
注意
1.要先运行接收端,再运行发送端
2.如果接收端在启动之后,没有接收到数据,那么会死等(阻塞)
3.在接受数据的时候需要调用getLength方法,表示接收到了多少字节
UDP的三种通信方式
单播 : 点对点,一对一
组播 :
一对多,一个发送端通过路由器将数据发给多个接收端
广播:
一个发送端,通过路由器发送给所有的接收端
UDP组播代码实现:
组播地址:224.0.0.0——239.255.255.255
其中224.0.0.0 ~ 224.0.0.255 为预留的组播地址
发送端
跟单对单差不多 ,地址改成组播的地址就可以了
public static void main(String[] args) throws IOException { DatagramSocket ds =new DatagramSocket(); InetAddress address =InetAddress.getByName("224.0.1.0"); int port =10000; String s = "你好组播"; byte[] bytes=s.getBytes(); DatagramPacket dp =new DatagramPacket(bytes, bytes.length,address,port); ds.send(dp); ds.close(); }
接收端
1需要对应端口,2然后要加入组播的地址
public static void main(String[] args) throws IOException { MulticastSocket ms = new MulticastSocket(10000); byte[] bytes = new byte[1024]; DatagramPacket dp = new DatagramPacket(bytes, bytes.length); //把当前计算机加入该组播地址 ms.joinGroup(InetAddress.getByName("224.0.1.0")); //获取传过来的内容 ms.receive(dp); int length = dp.getLength(); String s = new String(bytes, 0, length); System.out.println(s); ms.close(); }
UDP广播代码实现
发送端:第三步需要修改
发送的地址需要改成广播的地址:255.255.255.255
接收端:就跟单播的一模一样 不需要修改,只需要端口对应就可以了