目录
一、基础介绍
网络编程,就是在网络通信协议下,不同计算机上运行的程序,进行的数据传播。
Java中可以使用java,net包下的技术轻松开发出常见的网络应用程序。
常见网络架构:
CS:Client/Server,客户端/服务器,需要本地下载并安装客户端程序,在远程有一个服务端程序。
优点:画面可以做的非常精美,用户体验好。
缺点:需要开发客户端,服务端,用户需要下载和更新的时候太麻烦。
适合:定制专业化的办公软件,如IDEA、网游等。
BS:Browser/Server,浏览器/服务器,只需要一个浏览器,用户通过不同的网址,访问不同的服务器。
优点:不需要开发客户端,只需要页面+服务端,用户不需要下载,打开浏览器就能使用。
缺点:如果应用过大,用户体验受到影响。
适合:移动互联网应用,可以在任何地方随时访问的系统。
二、网络编程三要素
IP:上网设备在网络中的地址,是唯一的标识。(确定对方电脑在互联网上的IP)
端口号:应用程序在设备中唯一的标识。(对方电脑接收数据的软件)
协议:数据在网络中传输的规则,常见的有UDP、TCP、http、https、ftp...
1、IP
全称:Internet Protocol,是互联网协议地址,也称IP地址。
是分配给上网设备的数字标签。
通俗理解:上网设备在网络中的地址,是唯一的标识。
常见IP分为:IPv4、IPv6
IPv4
全称:Internet Protocol version4,互联网通信协议第四版。
采用32位地址长度,分成4组:
IPv4的地址分类:公网地址(万维网使用)和私有地址(局域网使用)。
192.168.开头的就是私有址址,范围即为192.168.0.0--192.168.255.255, 专门为组织机构内部使用,以此节省IP
特殊IP:127.0.0.1,也可以是localhost:是回送地址也称本地回环地址,也称本机IP,永远只会寻找当前所在本机。
我们电脑换个网,局域网可能不一样,但是本地回环地址是不变的。
常用CMD命令:
ipconfig:查看本机IP地址。
ping:检查网络是否联通。
IPv6
全称:Internet Protocol version 6,互联网通信协议第六版。
由于互联网的蓬勃发展,IP地址的需求量愈来愈大,而IPv4的模式下IP的总数是有限的。
采用128位地址长度,分成8组。
InetAddress类
Java中用来标识IP的类,这个类的对象,就表示IP的对象,两个子类一个表示IPv4,一个表示IPv6
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Main {
public static void main(String[] args) throws UnknownHostException {
// 获取InetAddress的对象,参数可以是机器名,也可以是IP地址
// 这个对象是IP的对象,也就是电脑的对象
InetAddress address = InetAddress.getByName("DESKTOP-USMHHRP");
System.out.println(address); // DESKTOP-USMHHRP/10.22.240.165
// 获取此IP的主机名
String name = address.getHostName();
System.out.println(name); // DESKTOP-USMHHRP
// 获取电脑IP
String ip = address.getHostAddress();
System.out.println(ip); // 10.22.240.165
}
}
2、端口号
端口号:应用程序在设备中唯一的标识。
端口号由两个字节表示的整数,取值范围:0~65535
其中0~1023之间的端口号用于一些知名的网络服务或者应用。我们自己使用1024以.上的端口号就可以了。
注意:一个端口号只能被一个应用程序使用。
3、协议
计算机网络中,连接和通信的规则被称为网络通信协议。
OSI参考模型:世界互联协议标准,全球通信规范,单模型过于理想化,未能在因特网上进行广泛推广。
TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。
UDP协议:用户数据报协议(User Datagram Protocol)
- UD是面向无连接通信协议(数据直接发,不检查对面电脑网络是否畅通)
- 速度快,有大小限制一次最多发送64K,数据不安全,易丢失数据。
- 常用于在线视频、语音通话等。
TCP协议:传输控制协议(Transmission Control Protocol)
- TCP协议是面向连接的通信协议。
- 速度慢,没有大小限制,数据安全。
- 常用于软件下载,文字聊天,发送邮件等。
(1)UDP协议
UDP发送数据:
我们寄东西,要:找快递公司、打包东西、发送包裹、付钱走人
这就对应着UDP发送数据的四个步骤:
- 创建发送端的DatagramSocket对象(快递公司)
- 创建打包好的数据对象DatagramPacket(打包东西)
- 发送数据(发送包裹)
- 释放资源(付钱走人)
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Main {
public static void main(String[] args) throws IOException {
// 1.创建发送端的DatagramSocket对象(快递公司)
// 创建后,这个对象会绑定一个端口,之后我们就是通过这个端口向外发送数据的,如果创建对象的时候是空参的,会随机一个,如果有参,就是我们指定的那个
DatagramSocket ds = new DatagramSocket();
// 2.创建打包好的数据对象
// 要发送的信息(需要转成字节数组)
String str = "吉娃娃!";
byte[] bytes = str.getBytes();
// 要往哪台电脑发(ip/电脑对象)
InetAddress address = InetAddress.getByName("127.0.0.1");
// 要往哪个端口发
int port = 10086;
// 要传入的是字节数组对象(还要指定发这个数组的哪部分)、电脑对象、端口对象
DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
// 3.发送资源(发送包裹)
ds.send(dp);
// 4.释放资源(付钱走人)
ds.close();
}
}
UDP接受数据:
我们收东西,要:找快递公司、接收包裹、拆开包裹、签收走人
这就对应着UDP接收数据的四个步骤:
- 创建接收端的DatagramSocket对象(找快递公司)
- 创建接收数据包的对象(接收包裹)
- 解析数据包(拆开包裹)
- 释放资源(签收走人)
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Main {
public static void main(String[] args) throws IOException {
// 1.创建接收端的DatagramSocket对象(找快递公司)
// 在接收的时候一定要绑定端口,且端口一定要与发送的端口一致。
DatagramSocket ds = new DatagramSocket(10086);
// 2.创建接收数据包的对象(接收包裹),最终是把这个数据放到字节数组里面
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
ds.receive(dp);
// 3、解析数据包()
byte[] data = dp.getData();
int len = dp.getLength();
InetAddress address = dp.getAddress();
int port = dp.getPort();
System.out.println("接收到数据:"+new String(data,0,len));
System.out.println("该数据是从"+address+"这台电脑中的"+port+"端口发出的");
// 4.释放资源(签收走人)
ds.close();
}
}
UDP三种通信方式:
① 单播
以前的代码就是单播
② 组播
组播地址: 224.0.0.0~ 239.255.255.255,其中224.0.0.0 ~ 224.0.0.255为预留的组播地址。
如果我们自己想用只能用预留组播地址。
之前的ip只能表示一台电脑,而随便一个组播地址都表示一组电脑。
③ 广播
广播地址: 255.255.255.255
局域网中所有人都能收到。
(2)TCP协议
TCP通信协议是一种可靠的网络协议,它在通信的两端各建立- -个Socket对象
通信之前要保证连接已经建立。
通过Socket产生IO流来进行网络通信。
发送数据:
- 创建客户端的Socket对象与指定服务端连接
- 获取输出流,写出数据
- 释放资源
客户端:负责发送数据
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class Main {
public static void main(String[] args) throws IOException {
// 1、创建客户端的Socket对象与指定服务端连接
// 两个参数:服务器的ip和端口,在创建对象的同时会链接服务端,如果连不上会报错,所以在运行代码的时候要先运行服务端,不然这里连不上就会报错
Socket socket = new Socket("127.0.0.1",10000);
// 2、从连接通道中获取输出流,写出数据
OutputStream os = socket.getOutputStream();
// 注意字节流往外写数据的时候,只能写字节信息
os.write("hello!chiwawa!".getBytes());
// 3、释放资源
socket.close();
}
}
接收数据:
- 创建服务器端的ServerSocket对象
- 监听客户端链接,返回一个Socket对象
- 获取输入流,读取数据,并把数据显示在控制台
- 释放资源
服务端:负责接收数据
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class test {
public static void main(String[] args) throws IOException {
// 1、创建服务器端的ServerSocket对象
// 传入端口,这个端口要跟客户端连接的端口保持一致
ServerSocket ss = new ServerSocket(10000);
// 2、监听客户端的连接,就是创建一个方法死等客户端的连接,连不上就卡在这,连上了才会返回客户端的连接对象Socket
Socket socket = ss.accept();
// 3、从连接通道中,获取输入流,读取数据
InputStream is = socket.getInputStream();
int b;
while ((b=is.read()) != -1){
System.out.print((char)b);
}
// 4、释放资源
// 断开跟客户端之间的连接
socket.close();
// 关闭服务器
ss.close();
}
}
上面的要注意,使用字节流会出现中文乱码,可以使用转换流把字节流转成字符流:
TCP中的三次握手、四次挥手
三次握手:
四次挥手: