一、网络编程概述

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)常用方法:
static InetAddress getByName(String host)
确定主机名称的IP地址。这里的host可以是计算机名也可以是IP地址。
String getHostAddress()
返回文本显示中的IP地址字符串。
String getHostName()
获取此IP地址的计算机名。
【tips】:InetAddress类没有构造方法,而使用静态方法getByName(String host)来创建对象。

三、端口

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,实现数据交换。
(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();