网络编程
一、网络编程概述
1.什么是网络编程?
网络编程是指在网络通信协议下,实现网络互连的不同计算机上运行程序之间的数据交换。
2.网络编程的三要素
(1)IP地址:IP地址用来唯一标识网络中的计算机设备,通过IP地址来指定要接受数据的计算机和发送数据的计算机。
(2)端口:端口号用来唯一标识计算机设备中的应用程序。
(3)协议:在计算机网络中,协议对数据的传输格式、传输速率、传输步骤等做了统一的规定,通信双方必须遵循这些协议才能完成数据交换。常见的协议有UDP协议和TCP协议。
二、IP地址
1.分类
(1)IPv4:给每个连接在网络上的计算机分配一个32位的地址,也就是4个字节,按照TCP/IP协议规定,IP地址采用二进制表示,但是为了方便使用,IP地址用“点分十进制表示法”把二进制IP地址写成十进制的形式,中间用“.“”隔开。
(2)IPv6:为了扩大地址空间,解决网络地址数量不够的问题,通过IPv6重新定义128位的地址空间,每16个字节一组,分成8组十六进制数。
2.常用DOS命令
(1)ipconfig:查看本机IP地址
(2)ping IP地址:检查本机与该IP地址的连接是否连通
(3)一个特殊的地址:127.0.0.1:是回送地址,也可以代表本机地址,一般用来测试使用。
3.InetAddress类
(1)InetAddress类表示IP地址。
(2)常用方法:
【tips】:InetAddress类没有构造方法,而使用静态方法getByName(String host)来创建对象。
static InetAddress getByName(String host) |
确定主机名称的IP地址。这里的host可以是计算机名也可以是IP地址。 |
String getHostAddress() |
返回文本显示中的IP地址字符串。 |
String getHostName() |
获取此IP地址的计算机名。 |
三、端口
1.端口号
端口号是用两个字节表示的整数,取值范围为0~65535。其中0~1023的端口是一些知名的网络服务和应用,普通应用程序需要使用1024以上的端口号。如果当前程序的端口号被另外的服务或程序占用,会导致当前程序启动失败。
四、协议
1.常见的协议
(1)UDP协议:用户数据报协议(User Datagram Protocol),面向无连接。
(2)TCP协议:传输控制协议(Transmission Control Protocol),面向连接。
TCP协议中的“三次握手”:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。
第一次握手:客户端向服务器端发送连接请求,等待服务器端确认;
第二次握手:服务器端向客户端回送一个响应,通知客户端收到了连接请求;
第三次握手:客户端再次向服务器端发送确认信息,确认连接。
完成三次握手后,连接建立,服务器和客户端就可以进行数据传输了。
2.UDP通信程序
(1)UDP通信原理:UDP协议是不可靠协议,在通信的两端各建立一个Socket(套接字)对象,但是这两个Socket对象只负责接收和发送数据。因此基于UDP协议的通信双方而言,没有客户端和服务器的概念
(2)在Java中,通过DatagramSocket类作为基于UDP协议的Socket,实现数据交换。
(2)在Java中,通过DatagramSocket类作为基于UDP协议的Socket,实现数据交换。
(3)UDP发送数据的步骤:
创建发送端的Socket对象
创建数据并打包成数据包
发送数据包
关闭发送端
//创建发送端的Socket对象
DatagramSocket ds = new DatagramSocket();
//创建数据并打包成数据包
byte[] bys = "hello,UDP!我来啦!".getBytes();
DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("127.0.0.1"), 10086);
//发送数据
ds.send(dp);
//关闭发送端
ds.close();
【tips】:DatagramPacket类表示数据报包,有多种构造方法,这里介绍一个:
DatagramPacket(byte[] buf, int length, InetAddress address, int port):构造一个数据包buf,发送长度为length的数据包到指定主机address上的指定端口号port。
(4)UDP接收数据的步骤
创建接收端的Socket对象:DatagramSocket(int port) 构造数据报套接字并将其绑定到本地主机上的指定端口。
创建数据包用于接收数据:DatagramPacket(byte[] buf, int length) 构造一个 DatagramPacket用于接收长度为 length数据包。
接收数据
解析数据包:byte[] getData() 返回数据缓冲区。
关闭接收端
//创建接收端的Socket对象 //DatagramSocket(int port) 构造数据报套接字并将其绑定到本地主机上的指定端口。 DatagramSocket ds = new DatagramSocket(10086); //创建数据包用于接收数据 //DatagramPacket(byte[] buf, int length) 构造一个 DatagramPacket用于接收长度为 length数据包。 byte[] bys = new byte[1024]; DatagramPacket dp = new DatagramPacket(bys, bys.length); //接收数据 ds.receive(dp); //解析数据包 //byte[] getData() 返回数据缓冲区。 byte[] data = dp.getData(); //int getLength() 返回要发送的数据的长度或接收到的数据的长度。 System.out.println(new String(data, 0, dp.getLength())); //关闭接收端 ds.close();
3.TCP通信程序
(1)TCP通信原理:TCP协议是一种可靠的网络协议,在通信的两端各建立一个Socket对象,从而在通信两端形成网络虚拟链路,这样两端的程序就可以通过虚拟链路进行通信了。
Java对基于TCP协议的网络提供了良好的封装,使用Socket对象来代表两端的通信接口,并通过Socket产生IO流来进行通信。Java为客户端提供Socket类,为服务器端提供ServerSocket类。
(2)TCP发送数据步骤:
创建客户端的Socket对象:Socket(String host, int port) 创建客户端Socket对象并将其连接到指定主机host上的指定端口号port。
获取该Socket对象的输出流,写数据:OutputStream getOutputStream() 返回此Socket对象的输出流。
释放资源
//创建客户端的Socket对象
Socket s = new Socket("127.0.0.1", 1111);
//获取该Socket对象的输出流,写数据
OutputStream os = s.getOutputStream();
os.write("hello,world,我来啦!".getBytes());
//释放资源
s.close();
(3)TCP接收数据步骤:
创建服务器端的Socket对象:ServerSocket(int port) 创建绑定到指定端口port的服务器套接字。
监听客户端连接,返回一个Socket对象:Socket accept() 监听要连接到此套接字并接受它。
获取该Socket对象的输入流,读数据:InputStream getInputStream() 返回此套接字的输入流
释放资源
//创建服务器端的Socket对象 ServerSocket ss = new ServerSocket(1111); //监听客户端连接,返回一个Socket对象 Socket s = ss.accept(); //获取该Socket对象的输入流,读数据 InputStream is = s.getInputStream(); byte[] bys = new byte[1024]; int len = is.read(bys); String str = new String(bys, 0, len); System.out.println(str); //释放资源 ss.close();